Плагин Rails требует проблем - PullRequest
1 голос
/ 07 декабря 2009

У меня проблема с созданием плагина Rails, назовем его Mplug. Этот плагин в значительной степени является только задачей 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 ]

2 голосов
/ 10 декабря 2011

Самое простое решение этой проблемы - зарегистрировать задачу rake с помощью Rails :: Railtie API. В 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
0 голосов
/ 08 декабря 2009

Один из вариантов - использовать константу FILE , а затем указать оставшуюся часть пути относительно текущего файла:

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

(если ваш файл с рейком находится в вашем plugin_root / tasks ...)

...