簡體   English   中英

在寶石中包括rake任務

[英]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目錄在加載路徑中。

/taskslib/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語句之后。

筆記:

  • 請務必替換為您的實際寶石的名稱。
  • 假設所有Rails可見的rake任務都在lib / tasks /中

我還沒有找到更容易的東西。 評論?

暫無
暫無

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

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