如何更改自定义rails生成器的源? (雷神)

时间:2012-03-26 21:07:15

标签: ruby-on-rails generator thor

我正在制作一个自定义生成器来生成一个新的rails应用程序,我这样做

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

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

问题是,如何添加新的源目录(然后由Thor::Actions#copy_fileThor::Actions#template和其他人使用)?我在Thor的文档中看到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如何将他的目录放在源路径中。我真的想知道:)

4 个答案:

答案 0 :(得分:5)

这有效:

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

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

class AppBuilder < Rails::AppBuilder
  ...
end

我不明白为什么,但我已经花了太多时间在这上面,所以我不在乎。

答案 1 :(得分:4)

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

希望这会有所帮助:)

答案 2 :(得分:1)

使用AppBuilder时,source_paths方法不起作用。 (这是使用rails模板的另一种选择)。我在这个类所在的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'在rails new命令更改为新的app目录(我认为)之后被调高并进行评估。

答案 3 :(得分:0)

这是一个古老的帖子,但是问题仍然存在,我花了一些时间弄清楚了。如果有帮助,我在这里发表评论。

默认情况下,轨道添加路径lib/templates,因此您可以通过将任何模板复制到此目录中来自定义任何模板。

签出正确的目录结构https://github.com/rails/rails/tree/v6.0.1/railties/lib/rails/generators/rails

尽管有一些细微之处,但不是很明显。

helper生成器为例,如正式的Rails文档所述,结构为

https://github.com/rails/rails/tree/v6.0.1/railties/lib/rails/generators/rails/helper

- helper
  - templates
    - helper.rb.tt
  - helper_generator.rb 

在这里,Railties希望在您的项目中找到以下内容:

- lib
  - templates 
    - helper
      - helper.rb

您的helper.rbhelper.rb.tt的副本

最后一件事,如果您打算在Rails::Engine中使用它,则必须告诉它加载该路径

# lib/blorgh/engine.rb 
module Blorgh
  class Engine < ::Rails::Engine
    isolate_namespace Blorgh
    config.generators.templates << File.expand_path('../templates', __dir__)
  end
end

真的希望能为他人提供帮助并节省时间。

  1. https://github.com/rails/rails/blob/v6.0.1/railties/lib/rails/application/configuration.rb#L188
  2. https://guides.rubyonrails.org/generators.html#customizing-your-workflow-by-changing-generators-templates
  3. https://github.com/rails/rails/blob/v6.0.1/railties/CHANGELOG.md
  4. https://guides.rubyonrails.org/engines.html