1

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

我当然不想这样做。

有什么巧妙的方法可以解决这个问题吗?

谢谢!

4

2 回答 2

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 存储库,请使用:git.

现在,rake mplug:create将可用!如果您希望它显示在 中rake -T,请确保添加说明:

namespace :mplug do
  desc "creating an mplug"
  task :create do
    Mplug::Indexer.new
  end
end
于 2011-12-10T06:27:05.687 回答
0

一种选择是使用FILE常量,然后提供相对于当前文件的路径的其余部分:

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

(如果您的 rake 任务文件在您的 plugin_root/tasks 中...)

于 2009-12-08T03:19:52.980 回答