【问题标题】:Ruby on Rails: colon on terminalRuby on Rails:终端上的冒号
【发布时间】:2013-07-09 19:42:53
【问题描述】:

在 Rails 上使用 ruby​​ 时,通常使用终端命令,例如 rake db:migraterails g devise:install。但是这些命令中的: 到底是什么意思呢?在rake db:migratemigrate 是参数还是其他?这似乎不是一个很难的问题,但是在 Google 上研究了几个小时并没有找到答案后,我真的希望有人向我解释一下。

【问题讨论】:

  • 查看 Rakefile 内部,您会看到 rake 任务被组织成命名空间和任务。

标签: ruby-on-rails terminal colon


【解决方案1】:

您可以将冒号视为命名空间。在 Rails 中的某处有一个类似于此的 rake 任务文件:

namespace db
  task :migrate do...
    ....
  end
end

这是一种将相关任务组合在一起并防止它们与其他任务发生冲突的方法。这样,您可能会拥有 devise:migrate、db:migrate、foobar:migrate 等。

【讨论】:

  • 所以 foo:bar 表示命名空间 foo, task :bar?
  • 是的。但请记住,您也可以拥有嵌套的命名空间。耙 a:b:c:d 完全有效。
  • 至于rails g devise:install,我还是有点迷茫。 rails g devise [model_name] 运行生成器bit.ly/15bN3nt,但rails g devise:install 运行另一个bit.ly/1alZ8gM,即使那里没有定义任何任务。很抱歉打扰您。
  • 啊。导轨与耙子。我不确定“rails”的约定是什么。我只是在谈论耙子。
  • 对不起,我不是很清楚。我的意思是对于rails,终端上的 foo:bar 到底是什么意思?
【解决方案2】:

就像 Philip 在他的回答中解释的那样,使用 rake 冒号定义了命名空间/任务之间的分隔符

使用rails g(enerate) 时基本相同。不同之处在于 Rails 生成器不是用 rake 的 DSL 定义的,而是类。

但要回答您最初的问题:在这两种情况下,冒号都是分隔符。

在代码中,唯一重要的是拆分字符串: https://github.com/rails/rails/blob/4-0-stable/railties/lib/rails/generators.rb#L124

您可以在官方Ruby on Rails Guides 中找到有关生成器以及如何创建自己的生成器的更多信息(这将帮助您了解其背后的机制)

//编辑 好的,我们来仔细看看生成器查找过程:

首先是Rails::Generators.invoke

它接收 CLI 上传递的命名空间并将其拆分(使用冒号)

  names = namespace.to_s.split(':')

然后它通过传递传递的命名空间的最后一部分(实际的生成器名称)得到相应的类,其余部分再次用冒号连接(命名空间路径,在我们的例子中是 devise ) 到Rails::Generators::Base.find_by_namespace

  if klass = find_by_namespace(names.pop, names.any? && names.join(':'))

此方法再次将基础(命名空间路径)和名称(生成器名称)连接起来并将其推送到数组中:

lookups = []
lookups << "#{base}:#{name}"    if base

之后它会调用Rails::Generators.lookup,它将查找要为被调用的生成器调用的类:

lookup(lookups)

它将再次调用Rails::Generators.namepaces_to_paths

该方法没有什么大不了的,它只会为调用的生成器返回一个包含两个可能源路径的数组,在我们的例子中,这两个是“设计/安装/安装”和“设计/安装”。

这些不是 rails 将检查的实际路径,它们只是依赖于 namespace:generator 构造的部分。

lookup 方法现在将采用这两个,我们称它们为子路径,并在以下位置检查需要的文件:

  1. rails/generators/devise/install/install_generator
  2. generators/devise/install/install_generator
  3. rails/generators/devise/install_generator
  4. generators/devise/install_generator

在我们的例子中,第二个路径是所需的文件,rails 需要它,并通过它调用inheritedRails::Generators::Base 上的more about that callback 回调,因为Devise::Generators::InstallGenerator 继承自它。

这会将 Class 添加到 Rails::Generatorssubclasses 数组中,该数组映射到格式为 { namespace => klass } 的哈希,因此 rails 最终能够获得所需的生成器类

klass = namespaces[namespace]

开始吧

klass.start(args, config)

【讨论】:

  • 这很有帮助。但是我仍然对它在生成案例中的工作方式感到困惑。实际上,我已经阅读了您多次提到的这个 ruby​​ on rails 指南,但我仍然不明白它对于我向 Phillip 展示的设计代码是如何工作的。任何帮助将不胜感激。
猜你喜欢
  • 2017-10-26
  • 2015-04-05
  • 1970-01-01
  • 1970-01-01
  • 2013-05-08
  • 2011-03-19
  • 2011-11-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多