ruby 如何让生成器调用rails3中的其他生成器

gkn4icbw  于 2023-06-22  发布在  Ruby
关注(0)|答案(4)|浏览(203)

我正在尝试gem开发,现在特别是生成器。到目前为止,我已经成功地创建了两个发电机,它们的工作非常完美。这两个生成器位于同一目录中。
不过,现在我得分别给他们打电话。
我想做的是调用一个生成器,然后让这个生成器调用所有其他的生成器。只会打字

rails g generator_name

这将调用X个其他生成器。
有谁知道我是怎么做到这一点的吗?
帮助是非常感谢,谢谢!

c8ib6hqw

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

e0uiprwp

e0uiprwp2#

另一种可能性是使用类似

invoke 'active_record:model', 'foo bar:string baz:float'

它不如generate干净,但有一个优点:当你的生成器通过rails destroy被调用时,这个调用--就像其他的Thors动作一样--将试图撤销你的生成器invoke的动作。
但有一个陷阱:可能是由于Thors的依赖管理,这只对每个你想调用的生成器起作用一次,这意味着同一个生成器的第二个invoke将什么也不做。这可以通过使用如下语句来规避

Rails::Generators.invoke 'active_record:model', '...', behavior: behavior

在这种情况下,您必须显式地通过生成器的behavior(这是一个返回值的方法,如:invoke:revoke和可能的其他值,取决于哪个命令-rails generaterails destroyrails update等)。--称为您的生成器)来实现与上面相同的结果。如果你不这样做,你用Rails::Generators.invoke调用的生成器也会在用rails destroy运行生成器时被执行。
或者,您可以坚持使用invoke并尝试篡改Thors调用系统。例如here

yptwkmov

yptwkmov3#

生成器基于Thor,因此可以使用apply方法。
这就是Rails Templater gem所做的。(Here's浏览Rails Templater gem。)

fcipmucu

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文档。

相关问题