Как заставить Thor найти шаблоны для установленных в системе файлов .thor?

Я создал скрипт .thor для настройки нового проекта ruby ​​именно так, как мне нравится. Я использую команду Thor::Actions directory для создания приложения полностью из структуры каталогов шаблонов, а не определяю их встроенными в heredocs. Каталог скрипта выглядит примерно так:

rubynu.thor
template/
  bin/
  lib/
    %app_name%.rb.tt
    %app_name%
  README.markdown
  .gitignore
  ...

Это отлично работает и позволяет мне легко визуализировать и изменять отдельные части шаблона по мере изменения моего вкуса.

Но я не могу придумать хороший способ заставить Тора найти каталог шаблонов после того, как файл .thor будет установлен системой с использованием thor install rubynu.thor. Install помещает копию файла .thor в ~/.thor, но игнорирует каталог template/, поэтому шаблоны больше не находятся.

Я не хочу жестко кодировать путь source_root или вручную копировать каталог шаблона в ~/.thor. Есть ли что-то встроенное в thor, которое обрабатывает установку шаблонов вместе с файлом .thor? Было бы здорово, если бы их можно было упаковать вместе при установке.

Если нет, то как лучше всего это обойти? Наверняка где-то есть системные задачи, которые используют файлы шаблонов. Как ты это сделал? Я полагаю, я мог бы обойти thor install и предоставить его как драгоценный камень (хотя это кажется излишним), или стиснуть зубы и вставить все определения шаблона в один гигантский файл .thor (менее приятно вносить изменения в структуру позже).

Для справки, вот простой файл .thor, который я использую:

class Rubynu < Thor::Group
  include Thor::Actions

  argument :app_name

  def self.source_root
    File.dirname(__FILE__)
  end

  def apply_directory_template
    directory 'template', app_name
  end
end

Спасибо!


person Mitch    schedule 07.12.2011    source источник


Ответы (1)


Если вы настроите свой файл .thor следующим образом:

<my_thor_commands>/
  templates/
    bin/
    lib/
    ...
   main.thor

thor install <my_thor_command> будет искать файл с именем main.thor, а затем установит его и все остальное в <my_thor_command>. После этого вы можете рассчитывать на:

def self.source_root
  File.dirname(__FILE__)
end

который даст вам путь к <my_thor_command>, как он был установлен.

person rrjamie    schedule 11.12.2011
comment
Это именно то, что я надеялся услышать. Работает отлично, спасибо чувак! - person Mitch; 12.12.2011