[英]Ruby on Rails: colon on terminal
在Rails上使用ruby時,通常使用終端命令,例如rake db:migrate
或rails 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將幫助您了解其背后的機制)。
//編輯好,讓我們仔細看看生成器查找過程:
它接收在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
方法將使用這兩個方法,將它們稱為子路徑,並在以下位置檢查所需文件:
在我們的例子中,第二條路徑是所需文件,rails需要它,並通過它inherited
(由於Devise::Generators::InstallGenerator
從該Devise::Generators::InstallGenerator
繼承而來,因此會調用Rails::Generators::Base
上的回調回調的更多信息 。
這會將Class添加到Rails::Generators
的subclasses
數組中,該subclasses
數組映射到哈希格式為{{namespace => klass}的Hash中,因此Rails最終可以獲得所需的Generator類。
並開始
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.