Ruby on Rails:终端上的冒号

时间:2013-07-09 19:42:53

标签: ruby-on-rails terminal colon

在轨道上使用ruby时,通常使用rake db:migraterails g devise:install等终端命令。但是这些命令中的:究竟是什么意思呢?在rake db:migrate migrate是一个参数还是其他什么?这似乎不是一个难题,但经过几个小时研究谷歌而没有找到答案,我真的希望有人向我解释,请。

2 个答案:

答案 0 :(得分:3)

您可以将冒号视为命名空间。在Rails中的某个地方有一个rake任务文件,看起来类似于:

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

这是一种将相关任务组合在一起并防止它们与其他任务发生冲突的方法。通过这种方式,您可以设计:migrate,db:migrate,foobar:migrate等。

答案 1 :(得分:0)

就像菲利普在使用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

中找到更多关于生成器的信息以及如何创建一个关于生成器的信息(这些信息将帮助您理解其背后的机制)

// EDIT 好的,让我们仔细看看生成器查找过程:

首先是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

在这个方法中没有什么大不了的,它只会为调用的生成器返回两个可能的源路径数组,在这种情况下,这两个是“devise / install / install”和“devise / install”。

因为那些不是rails将检查的实际路径,它们只是依赖于命名空间的部分:生成器构造。

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

  1. 导轨/发电机/设计/安装/ install_generator
  2. 发电机/设计/安装/ install_generator
  3. 导轨/发电机/色器件/ install_generator
  4. 发电机/色器件/ install_generator
  5. 在我们的例子中,第二条路径是所需的文件,rails需要它,并且inherited more about that callback上的Rails::Generators::Base回调将被调用,因为Devise::Generators::InstallGenerator继承自klass = namespaces[namespace]

    这会将类添加到subclasses Rails::Generators数组,该数组映射到Hash,其格式为{namespace =&gt; klass}所以rails终于能够获得所需的Generator类

    klass.start(args, config)

    然后开始

    {{3}}