ruby-on-rails 如何在rake任务上运行冰糕类型检查

mxg2im7a  于 2023-08-08  发布在  Ruby
关注(0)|答案(2)|浏览(120)

我注意到,默认情况下,srb init等不会在rake任务上放置# typed标志。然而,在VSCode上,它确实在rake任务上显示错误(例如缺少常量)。
我尝试将# typed: true添加到rake任务中,但它会立即显示“namespace is not available in Root”这样的错误。有人试过对你的耙式任务进行打字检查吗?你有什么计划?

wgxvkvu9

wgxvkvu91#

Rake monkeypat全局main对象(即顶层代码)来扩展他们的DSL:

# Extend the main object with the DSL commands. This allows top-level
# calls to task, etc. to work from a Rakefile without polluting the
# object inheritance tree.
self.extend Rake::DSL

字符串
→ lib/rake/dsl_definition.rb
Sorbet不能建模一个对象的单个示例(在本例中是main)与该示例的类(在本例中是Object)具有不同的继承层次结构。
为了解决这个问题,我们建议重构Rakefile以创建一个继承层次是显式的新类:

# -- my_rake_tasks.rb --

# (1) Make a proper class inside a file with a *.rb extension
class MyRakeTasks
  # (2) Explicitly extend Rake::DSL in this class
  extend Rake::DSL

  # (3) Define tasks like normal:
  task :test do
    puts 'Testing...'
  end

  # ... more tasks ...
end

# -- Rakefile --

# (4) Require that file from the Rakefile
require_relative './my_rake_tasks'


或者,我们可以为Object编写一个RBI,使其显示为extend Rake::DSL。这个RBI可能是大部分错误:不是所有的Object示例都有这个extend,只有一个有。我们建议这种方法,因为它可能使它看起来像一些代码类型检查,即使像tasknamespace这样的方法没有定义。如果你想这样做,你可以为Object写这个RBI文件:

# -- object.rbi --

# Warning!! Monkeypatches all Object's everywhere!
class Object
  extend Rake::DSL
end

yqyhoc1h

yqyhoc1h2#

一个更好的方法是告诉冰糕Rake在做什么。
在某些时候,Rake会像这样扩展Object:

# Extend the main object with the DSL commands. This allows top-level
# calls to task, etc. to work from a Rakefile without polluting the
# object inheritance tree.
self.extend Rake::DSL

字符串
在每个rake文件中,你可以告诉冰糕,这是发生的。

# -- lib/tasks/example.rake --

# typed: true

T.bind(self, T.all(Rake::DSL, Object))

namespace "rake_task" do
  desc "do a thing"
  task do_it: :environment do
    # rake task
  end
end


唯一要做的就是告诉冰糕的typechecker查看.rake文件。默认情况下,它只查看.ruby和.rbi文件。但是您可以告诉它也查看.rake文件。

# -- sorbet/config --

--dir
.

--allowed-extension=.rb
--allowed-extension=.rbi
--allowed-extension=.rake

相关问题