Я понимаю, что вы уже решили эту проблему, но я публикую этот ответ на тот случай, если кто-то другой найдет решение вашего вопроса (как было I ).
Внутри класса, к которому принадлежит #test, создайте attr_accessor, а затем установите его значение в том же методе, который вызывает шаблон.
class MyGenerator < Thor
attr_accessor :name, :dir
def test (name, dir)
self.name = name
self.dir = dir
template "tasks/templates/new_test_file", "src/#{dir}/test/#{name}Test.cpp"
end
end
Примечание: если вы объединяете методы с помощью #invoke, то для каждого вызова будет использоваться новый экземпляр класса. Поэтому вы должны установить переменную экземпляра в методе с помощью вызова шаблона. Например, следующее не будет работать.
class MyGenerator < Thor
attr_accessor :name
def one (name)
self.name = name
invoke :two
end
def two (name)
# by the time we get here, this is another instance of MyGenerator, so @name is empty
template "tasks/templates/new_test_file", "src/#{name}Test.cpp"
end
end
Вы должны поместить self.name = name
внутрь #two вместо
Для создания генераторов, если вы вместо этого наследуете от Thor :: Group, все методы вызываются по порядку, и attr_accessor будет настроен для вас с переменными экземпляра, установленными для каждого метода. В моем случае мне пришлось использовать Invocations вместо Thor :: Group, потому что я не мог распознать классы Thor :: Group как подкоманды исполняемого файла.