Ruby 中的命令 rake
和 rails
有什么区别?
哪个更快,为什么?
最佳答案
区别在于调用的是什么二进制文件。
如果您要在 Rails 应用程序根目录中调用 bundle exec which rake
,您会得到类似 /home/[USERNAME]/.rbenv/versions/2.5.5 的内容/bin/rake
和 bundle exec which rails
,你会得到 /home/[USERNAME]/.rbenv/versions/2.5.5/bin/rails
。从那里你可以 cat
(cat/home/[USERNAME]/.rbenv/versions/2.5.5/bin/rake
) 这两个路径并查看类似的代码为每个运行,但文件的末尾不同。
rails
gem "railties", version
load Gem.bin_path("railties", "rails", version)
rake
gem "rake", version
load Gem.bin_path("rake", "rake", version)
这里他们都在 Gem.bin_path
上调用 load
但使用不同的参数,它们试图加载单独的 gem。您可以通过运行进一步跟踪代码一个 irb/pry/rails 控制台,并设置所需的 require 'rubygems'
和 version = ">= 0.a"
,然后运行 Gem.bin_path ("railties", "rails", version)
和 Gem.bin_path("rake", "rake", version)
查看 load
是什么实际上试图运行。我承认,在您遇到最终确定传递给 rails
的 rake 任务参数并将其代理到 Rake 并停在那里并推迟的逻辑之前,我承认它会变成一个兔子洞至 this SO answer剩下的。
当 rails
运行并传递了本应由 rake
运行的参数时,它将首先尝试查找它是否是要提供给的实际参数rails
命令,确定它不是,然后尝试将其作为 rake
命令运行,以简化 Rails 团队在 Rails v4 中添加的整体命名。
那么哪个跑得更快? rake
用于实际的 rake 任务,因为它会绕过需要确定正在传递 rake
参数的额外逻辑。但 rails
特定参数也不能与 rake
一起运行,例如bundle exec rake generate
将不起作用(除非您有一个 generate
任务)。如果有疑问,运行 bundle exec rails --help
至少在 Rails v5 中,它会输出哪些参数是 rails
特定的,哪些是 rake
具体。
关于ruby-on-rails - rails 和 rake 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66311919/