我有一个定制宝石,在捆绑,构建,分发和配置方面一直运作良好。实现。宝石是框架的核心,其他宝石也是从中衍生出来的。由于大多数派生的gems将具有相同的基本结构,我想在gem的bin
路径中包含一个Ruby脚本,可用于将template
文件夹中的文件基本复制到新文件夹中用户将开发自己的宝石。
我遇到的问题是template
文件夹有一个名为$name$.gemspec
的gemspec文件,在文件中有类似命名的类/模块(例如:module $Name$
),其中{ {1}}被用户提供的名称替换。
不幸的是,当我从我宝石的最顶层路径运行$name$
时,我收到错误:
bundle install
看起来Bundler使用了错误的Gemfile,即使我通过以下方法之一显式传递了Gemfile或路径:
There was a SyntaxError while evaluating $name$.gemspec:
C:/my_gem/template/$name$.gemspec:8: syntax error, unexpected tGVAR
gem.version = MyGem::$Name$::VERSION
我也尝试更新我的Gemfile的bundle install --gemfile=Gemfile
bundle install --path=C:\my_gem
行无效:
gemspec
最后,我确保gemspec name: 'my_gem'
文件夹甚至不包含在template
中,但这似乎并不重要:
my_gem.gemspec
有没有人知道为什么Bundler会尝试阅读gem.files = Dir.glob("lib/**/*") + %w(LICENSE.txt README.md)
而不是./template/$name$.gemspec
?
答案 0 :(得分:2)
检查Bundler来源,我可能已经发现了lib/bundler/source/path.rb中的罪魁祸首。 GLOB用于在load_spec_files
中找到gemspecs。默认的glob是"{,*,*/*}.gemspec"
。这将在您的gem的根目录中找到* .gemspec,或者从根目录找到一个后代的目录(包括您的模板目录)。
如果这确实是罪魁祸首,您可以通过将模板目录放在gem的目录层次结构中更深层或更改模板文件的名称来解决此问题,使其不会以.gemspec
结尾。 Bundler::Source::Path
对象看起来可能需要different glob at initilization,但我还没有深入挖掘,看看是否有可行的方法通过config或cmdline选项在bundle执行中指定这个替代glob。