Rails插件需要问题

时间:2009-12-07 19:47:09

标签: ruby-on-rails plugins ruby-on-rails-plugins

我在创建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'

我当然不想这样做。

有没有什么好办法解决这个问题?

谢谢!

2 个答案:

答案 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中......)