我在创建Rails插件时遇到问题,我们称之为Mplug。该插件几乎只是一个rake任务,但是有一个rake任务使用的库。
问题是需要文件。让我们说这是rake的任务:
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 :(得分: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 repo,请使用:git
。
现在,rake mplug:create
将可用!如果您希望它显示在rake -T
中,请确保添加说明:
namespace :mplug do
desc "creating an mplug"
task :create do
Mplug::Indexer.new
end
end
答案 1 :(得分:0)
一种选择是使用 FILE 常量,然后提供相对于当前文件的其余路径:
require File.join(File.expand_path(File.dirname(__FILE__)), '..', 'lib', 'mplug')
(如果您的rake任务文件位于plugin_root / tasks中......)