"rake routes" 实际上是做什么的?

3
在一个相对新的 Rails 项目中,Rakefile 的内容如下:
# Add your own tasks in files placed in lib/tasks ending in .rake,
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.

require File.expand_path('../config/application', __FILE__)

Blog::Application.load_tasks

然而,rake routes 会输出以下内容:

cpe-74-72-73-47:rails-blog-example djechlin$ rake routes
home_index GET /home/index(.:format) home#index
      root     /                     home#index

我不明白rake是如何工作的,以便它可以访问路由文件或路由任务。根据命令行使用文档rake是这样调用的:

rake [options ...]  [VAR=VALUE ...]  [targets ...]

但是这个页面没有解释目标是什么。我猜测rake直接在routes.rb文件中调用,而与此无关的Rakefile,但我无法确认这一点。

2个回答

7
一个 Rakefile 包含可执行的 Ruby 代码。Ruby 脚本中任何合法的内容都可以在 Rakefile 中使用。当你触发 rake routes 时,调用了这段 Ruby 代码。详见:此处

3

实际上,Rakefile与routes.rb非常相关,而且根本不会直接调用rake。 Rake需要一个Rakefile。魔法发生在load_tasks中,它加载了众多Rails特定的Rake任务,这些任务随着框架一起提供。

当您调用Rake时,它会寻找一个Rakefile。 Rakefile只是Ruby代码。在默认的Rakefile中,首先包含../config/application,其中定义了您的应用程序类(Blog :: Application ); 然后它调用load_tasks,它由Rails :: Application提供,从中您的Blog :: Application继承。

从那里开始,每个Rails部分都有一百万种方法来使Rake任务可用。通常,核心库提供Rail ties,公开任务。


rake routes 首先运行 Rakefile,该文件调用 AppName::Application::load_tasks,创建一个名为 :routes 的任务,然后由于它作为参数传递给了 rake,所以该任务被执行。对吗? - djechlin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接