我正在制作一个自定义生成器来生成一个新的rails应用程序,我这样做
require 'thor'
require 'rails/generators/rails/app/app_generator'
class AppBuilder < Rails::AppBuilder
include Thor::Actions
include Thor::Shell
...
end
问题是,如何添加新的源目录(然后由Thor::Actions#copy_file
,Thor::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如何将他的目录放在源路径中。我真的想知道:)
答案 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.rb
是helper.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
真的希望能为他人提供帮助并节省时间。