[英]Including rake tasks in gems
1)寶石里面有耙子任務的“最佳”位置嗎? 我在/tasks
, /lib/tasks
看到過它們,我看到它們寫成*.rb
和*.rake
- 不確定哪個(如果有的話)是'正確的'
2)在環境中配置gem后,如何將它們提供給應用程序?
在Rails 3上,您可以通過Railties執行此操作。 這是為我剛制作的寶石做的代碼:
class BackupTask < Rails::Railtie
rake_tasks do
Dir[File.join(File.dirname(__FILE__),'tasks/*.rake')].each { |f| load f }
end
end
所以你基本上創建了一個繼承自Rails::Railtie
類,然后在該類中你有一個rake_tasks
塊來加載相關的文件。 如果要使用.rake
擴展名,則必須加載而不是require。
我發現我需要指定Dir
的完整路徑(因此是File.join
體操)。 如果我只是想明確地列出文件,那么我可以放棄load 'tasks/foo.rake'
因為我的gem的/lib
目錄在加載路徑中。
/tasks
和lib/tasks
都是個好地方。 我用/tasks
時,任務意味着用作營運或管理的寶石本身,我用lib/tasks
時,任務意味着由寶石用戶加載。
這是因為用戶在加載lib
文件夾之外的ruby文件時可能會遇到一些問題,當需要Gem時會自動將其附加到加載路徑。
另外,我建議你使用* .rake擴展名。 如今幾乎每個IDE都將.rake
擴展名與ruby文件相關聯,而大多數高級IDE甚至可以將內容解析為rake腳本。 .rake
擴展名對於開發人員來說也是更好的選擇,因為您可以立即提供文件內容的概述。
關於你的第二個問題,當插件被打包為Gem時,目前沒有辦法讓Rails加載你的rake任務。 您需要在應用程序中包含rake文件(在其他rake文件或主Rakefile中)或克隆項目中的rake任務。
如果在vendor文件夾中安裝插件,則任務和lib / tasks目錄中的所有*.rake
文件將通過以下兩行自動加載到Rails范圍中。
Dir["#{RAILS_ROOT}/vendor/plugins/*/tasks/**/*.rake"].sort.each { |ext| load ext }
Dir["#{RAILS_ROOT}/vendor/plugins/*/lib/tasks/**/*.rake"].sort.each { |ext| load ext }
對於Rails 3支持,lib / .rb文件的頂行可以是:
Dir["tasks/**/*.rake"].each { |ext| load ext } if defined?(Rake)
對於Rails 2支持,gem安裝程序必須編輯他們的Rakefile並添加:
Dir["#{Gem.searcher.find('<gemname>').full_gem_path}/lib/tasks/**/*.rake"].each { |ext| load ext }
在require語句之后。
筆記:
我還沒有找到更容易的東西。 評論?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.