2009-12-07 82 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