Объем граблей в проекте рельсов? - PullRequest
7 голосов
/ 30 мая 2011

У меня есть несколько парсеров, которые я запускаю с граблями в проекте, над которым я работаю.При использовании имени метода, которое уже существует в другом рейке, и поскольку они оба используют одну и ту же среду, я получаю конфликт.

Есть ли способ ограничить область действия файлов rake в их пространстве имен?Я думал, что в этом весь смысл пространства имен?

Пример:

namespace :test do
  task :test_task => :environment do
      ...
  end

  def test_method(argument)
    ...
  end    
end

namespace :other_test do
  task :test_task => :environment do
    ...
  end

  def test_method(argument, argument2)
    ...
  end
end

В этом случае при запуске rake test:test_task я получу недопустимое количество аргументов с ошибкой.С другой стороны, если я определяю метод в самой задаче, я должен держать метод в верхней части файла rake по порядку.Это немного запутанно и безобразно.

Это просто необходимое зло?

Спасибо!

Ответы [ 3 ]

8 голосов
/ 30 мая 2011

Я вижу, что пространства имен для задач rake служат той же цели, что и каталоги в файловой системе: они касаются организации, а не инкапсуляции.Вот почему задачи базы данных находятся в db:, задачи Rails в rails: и т. Д.

Пространства имен Rake не являются классами, поэтому вам нужно спросить себя, к какому классу вы добавляете test_method, когда определяете егов пространстве имен Rake.Ответ - Объект.Итак, когда вы выполняете вторую задачу, у Object уже есть метод test_method, который принимает один параметр, и Руби справедливо жалуется.

Лучшее решение - сделать ваши задачи Rake очень тонкими (как контроллеры) и поместитьлюбые вспомогательные методы (такие как test_method) отключены в каком-либо файле библиотеки где-нибудь разумным.Задача Rake обычно должна просто выполнить небольшую настройку, а затем вызвать метод библиотеки, чтобы выполнить реальную работу (т. Е. Тот же общий макет, что и у контроллера).

Резюме: сложите всю реальную работу и тяжелыйподнимите где-нибудь в вашей библиотеке файлы и сделайте ваши задачи Rake тонкими обертками для ваших библиотек.Это должно устранить вашу проблему благодаря правильной организации кода.

0 голосов
/ 13 января 2016

Я нашел способ пространства имен методов в задачах Rake, чтобы методы с одинаковыми именами не сталкивались.

  1. Обертывание каждого внешнего пространства имен в модуле с уникальным именем.
  2. extend Rake::DSL
  3. Измените ваши методы на методы класса (с self.).

Я проверил это, и он по-прежнему позволяет вызывать одну задачу rake илизависит от другой грабли, находящейся в другом модуле.

Пример:

module Test
  extend Rake::DSL

  namespace :test do
    task :test_task => :environment do
      ...
    end

    def self.test_method(argument)
      ...
    end    
  end
end

module OtherTest
  extend Rake::DSL

  namespace :other_test do
    task :test_task => :environment do
      ...
    end

    def self.test_method(argument, argument2)
      ...
    end
  end
end
0 голосов
/ 11 ноября 2015
module Anonymous
  namespace :test do
    # brabra
  end
end
self.class.send(:remove_const, :Anonymous)

module Anonymous
  namespace :another_test do
    # brabra
  end
end
self.class.send(:remove_const, :Anonymous)

Module.new do end блок нуждается в вас self:: перед любым определением.Чтобы избежать этого, вам нужно назвать модуль и удалить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...