2009-12-07 48 views
1

我在創建Rails插件時遇到問題,可以稱其爲Mplug。該插件幾乎只是一個rake任務,但具有rake任務使用的庫。Rails插件需要問題

問題是需要文件。可以說這是耙子任務:

namespace :mplug do 
    task :create do 
    Mplug::Indexer.new 
    end 
end 

這將不會識別常量Mplug。所以我認爲我需要它。

require 'mplug' 

namespace :mplug do 
    task :create do 
    Mplug::Indexer.new 
    end 
end 

但是然後我得到這個消息。

no such file to load -- mplug 

所以,好的。讓我們試着給出插件的路徑。

require 'vendor/plugins/mplug/lib/mplug' 

namespace :mplug do 
    task :create do 
    Mplug::Indexer.new 
    end 
end 

這實際上有效。然而,除了我認爲這是一個不好的方法來做到這一點,我現在必須要求我的插件中的文件,就好像我在rails根目錄中一樣。例如:

module Mplug 
end 

require 'mplug/indexer' 

現在必須是:

module Mplug 
end 

require 'vendor/plugins/mplug/lib/mplug/indexer' 

我並不想這樣做,當然。

有沒有什麼好辦法解決這個問題?

謝謝!

回答

0

一種選擇是使用FILE不變,然後提供相對路徑的其餘當前文件:

require File.join(File.expand_path(File.dirname(__FILE__)), '..', 'lib', 'mplug') 

(如果你的rake任務文件在plugin_root /任務.. )

+0

嗯... 了會怎樣,然後需要聲明中供應商/插件/ mplug/lib中/ mplug.rb是什麼? 我仍然需要在該文件中這樣做: 需要'vendor/plugins/mplug/lib/mplug/indexer' – rejeep 2009-12-08 08:22:25

+0

當Rails啓動時,大多數插件都使用init.rb來要求文件。 我建議你閱讀一下Rails指南:http://guides.rubyonrails.org/plugins.html 它給出了構建你的rails插件目錄,init.rb,require等的最佳實踐。 – jkrall 2009-12-10 14:30:44

2

這個問題的最簡單的解決方案是使用Rails :: Railtie API註冊Rake任務。在lib/mplug.rb,定義Railtie

module Mplug 
    class Railtie < ::Rails::Railtie 
    rake_tasks do 
     load "mplug/rails.rake" 
    end 
    end 
end 

然後,在lib/mplug/rails.rake

namespace :mplug do 
    task :create do 
    Mplug::Indexer.new 
    end 
end 

然後,請確保您的插件在您的Gemfile定義。如果你的插件是vendor/plugins,這一行添加到您的Gemfile

gem "mplug", :path => "vendor/plugins/mplug" 

如果按插件的混帳回購協議,使用:git

現在,rake mplug:create將可用!如果你想讓它在rake -T顯示,確保你補充說明:

namespace :mplug do 
    desc "creating an mplug" 
    task :create do 
    Mplug::Indexer.new 
    end 
end