簡體   English   中英

Ruby on Rails:終端上的冒號

[英]Ruby on Rails: colon on terminal

在Rails上使用ruby時,通常使用終端命令,例如rake db:migraterails g devise:install 但是這些命令中的:到底是什么意思? rake db:migrate是要migrate參數還是其他? 這似乎不是一個難題,但是經過數小時的Google研究並沒有找到答案之后,我真的很希望有人向我解釋一下。

您可以將冒號視為一個名稱空間。 在Rails中的某個地方,有一個類似於以下內容的rake任務文件:

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

這是將相關任務組合在一起並防止它們與其他任務沖突的一種方法。 這樣,您可能會設計出:migrate,db:migrate,foobar:migrate等。

就像Philip在使用rake時在回答中解釋的那樣,冒號定義了名稱空間/任務之間的分隔符

使用rails g(enerate) ,基本上是相同的。 區別在於,Rails生成器不是用rake的DSL定義的,而是類的。

但是要回答您最初的問題:在兩種情況下,Colon都是分隔符,僅此而已。

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

您可以在官方的Ruby on Rails指南中找到有關生成器以及如何生成一個生成器的更多信息(definetley將幫助您了解其背后的機制)。

//編輯好,讓我們仔細看看生成器查找過程:

首先是Rails::Generators.invoke

它接收在CLI上傳遞的名稱空間,並將其拆分(使用冒號)

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

然后通過將傳遞的名稱空間的最后一部分(實際的生成器名稱)傳遞給剩下的部分,剩下的部分再次用冒號(在本例中是設計的名稱空間路徑)傳遞給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將檢查的實際路徑,它們只是依賴於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需要它,並通過它inherited (由於Devise::Generators::InstallGenerator從該Devise::Generators::InstallGenerator繼承而來,因此會調用Rails::Generators::Base上的回調回調的更多信息

這會將Class添加到Rails::Generatorssubclasses數組中,該subclasses數組映射到哈希格式為{{namespace => klass}的Hash中,因此Rails最終可以獲得所需的Generator類。

klass = namespaces[namespace]

並開始

klass.start(args, config)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM