我正在尝试gem开发,现在特别是生成器。到目前为止,我已经成功地创建了两个发电机,它们的工作非常完美。这两个生成器位于同一目录中。不过,现在我得分别给他们打电话。我想做的是调用一个生成器,然后让这个生成器调用所有其他的生成器。只会打字
rails g generator_name
这将调用X个其他生成器。有谁知道我是怎么做到这一点的吗?帮助是非常感谢,谢谢!
c8ib6hqw1#
在你的发电机里,你可以直接打电话
generate "some:generator" # can be anything listed by 'rails g'
例如:
module MyGem class InstallGenerator < Rails::Generators::Base def run_other_generators generate "jquery:install" # or whatever you want here end end end
顺便说一下,如果你正在使用Rails 3 gems,这个问题也可以帮助你:Rails 3 generators in gem
e0uiprwp2#
另一种可能性是使用类似
invoke 'active_record:model', 'foo bar:string baz:float'
它不如generate干净,但有一个优点:当你的生成器通过rails destroy被调用时,这个调用--就像其他的Thors动作一样--将试图撤销你的生成器invoke的动作。但有一个陷阱:可能是由于Thors的依赖管理,这只对每个你想调用的生成器起作用一次,这意味着同一个生成器的第二个invoke将什么也不做。这可以通过使用如下语句来规避
generate
rails destroy
invoke
Rails::Generators.invoke 'active_record:model', '...', behavior: behavior
在这种情况下,您必须显式地通过生成器的behavior(这是一个返回值的方法,如:invoke,:revoke和可能的其他值,取决于哪个命令-rails generate,rails destroy,rails update等)。--称为您的生成器)来实现与上面相同的结果。如果你不这样做,你用Rails::Generators.invoke调用的生成器也会在用rails destroy运行生成器时被执行。或者,您可以坚持使用invoke并尝试篡改Thors调用系统。例如here。
behavior
:invoke
:revoke
rails generate
rails update
Rails::Generators.invoke
yptwkmov3#
生成器基于Thor,因此可以使用apply方法。这就是Rails Templater gem所做的。(Here's浏览Rails Templater gem。)
fcipmucu4#
看看带有导轨的脚手架生成器。/Users/XYZ/sources/rails/railties/lib/rails_generator/generators/components/scaffold/scaffold_generator.rb
def manifest record do |m| #....rest of the source is removed for brevity.... m.dependency 'model', [name] + @args, :collision => :skip end end
这里scaffold生成器使用模型生成器。让我们来看看dependency方法。你可以在这里找到它的API文档。
4条答案
按热度按时间c8ib6hqw1#
在你的发电机里,你可以直接打电话
例如:
顺便说一下,如果你正在使用Rails 3 gems,这个问题也可以帮助你:
Rails 3 generators in gem
e0uiprwp2#
另一种可能性是使用类似
它不如
generate
干净,但有一个优点:当你的生成器通过rails destroy
被调用时,这个调用--就像其他的Thors动作一样--将试图撤销你的生成器invoke
的动作。但有一个陷阱:可能是由于Thors的依赖管理,这只对每个你想调用的生成器起作用一次,这意味着同一个生成器的第二个
invoke
将什么也不做。这可以通过使用如下语句来规避在这种情况下,您必须显式地通过生成器的
behavior
(这是一个返回值的方法,如:invoke
,:revoke
和可能的其他值,取决于哪个命令-rails generate
,rails destroy
,rails update
等)。--称为您的生成器)来实现与上面相同的结果。如果你不这样做,你用Rails::Generators.invoke
调用的生成器也会在用rails destroy
运行生成器时被执行。或者,您可以坚持使用
invoke
并尝试篡改Thors调用系统。例如here。yptwkmov3#
生成器基于Thor,因此可以使用apply方法。
这就是Rails Templater gem所做的。(Here's浏览Rails Templater gem。)
fcipmucu4#
看看带有导轨的脚手架生成器。
/Users/XYZ/sources/rails/railties/lib/rails_generator/generators/components/scaffold/scaffold_generator.rb
这里scaffold生成器使用模型生成器。让我们来看看dependency方法。你可以在这里找到它的API文档。