Как изменить источник для генератора пользовательских рельсов?(Тор) - PullRequest
2 голосов
/ 27 марта 2012

Я делаю собственный генератор, который генерирует новое приложение rails, и делаю это так

require 'thor'
require 'rails/generators/rails/app/app_generator'

class AppBuilder < Rails::AppBuilder
  include Thor::Actions
  include Thor::Shell
  ...
end

Проблема в том, как мне добавить новый каталог с исходным кодом (который затем используетсяThor::Actions#copy_file, Thor::Actions#template и другие)?Я видел в документации Тора, что Thor::Actions#source_paths содержит источники (это массив путей), поэтому я попытался переопределить его внутри своего класса (поскольку я включил Thor::Actions):

def source_paths
  [File.join(File.expand_path(File.dirname(__FILE__)), "templates")] + super
end

сдля этого я хотел добавить каталог ./templates в исходные тексты, сохраняя при этом каталог Rails (вот почему в конце + super).Но он не работает, он по-прежнему перечисляет исходный путь Rails как единственный.

Я попытался просмотреть исходный код Rails, но не смог найти, как Rails поместил его каталог в исходных путях.И я очень хочу это знать:)

Ответы [ 3 ]

5 голосов
/ 30 марта 2012

Это сработало:

require 'thor'
require 'rails/generators/rails/app/app_generator'

module Thor::Actions
  def source_paths
    [MY_TEMPLATES]
  end
end

class AppBuilder < Rails::AppBuilder
  ...
end

Я не понимаю почему, но я уже потратил слишком много времени на это, поэтому мне все равно.

4 голосов
/ 30 марта 2012

Thor получит доступ к вашему методу source_paths и добавит их к значениям по умолчанию:

  # Returns the source paths in the following order:
  #
  #   1) This class source paths
  #   2) Source root
  #   3) Parents source paths
  #
  def source_paths_for_search
    paths = []
    paths += self.source_paths
    paths << self.source_root if self.source_root
    paths += from_superclass(:source_paths, [])
    paths
  end

Итак, все, что вам нужно сделать в вашем классе:

class NewgemGenerator < Thor::Group

  include Thor::Actions

  def source_paths
    ['/whatever', './templates']
  end

end

Надеюсь, это поможет :)

1 голос
/ 11 февраля 2013

Метод source_paths не работает при использовании AppBuilder. (что является еще одним вариантом использования шаблонов рельсов). У меня есть каталог файлов рядом с файлом app_builder.rb, в котором находится этот класс. У меня это работает, хотя кажется, что все еще должен быть более элегантный способ.

tree .
|-- app_builder.rb
|-- files
     `-- Gemfile
class AppBuilder < Rails::AppBuilder

  def initialize generator
    super generator
    path = File.expand_path( File.join( '..', File.dirname( __FILE__ )) )
    source_paths << path
  end

  def gemfile
    copy_file 'files/Gemfile', 'Gemfile'
  end

и затем на консоли:

rails new my_app -b path_to_app_builder.rb

Точки требуются, так как файл ruby ​​'app_builder.rb' захвачен и eval'd после того, как команда rails new переходит в новый каталог приложения (я думаю).

...