我有一个自定义的gem,它在捆绑、构建、分发方面一直很好;执行。gem是从中派生其他gem的框架的核心。由于大多数派生的gem都有相同的基本结构,我想在gem的bin
路径中包含一个Ruby脚本,该脚本可以用于将文件从template
文件夹复制到一个新文件夹中,用户将在该文件夹中开发自己的gem。
我遇到的问题是,template
文件夹有一个名为$name$.gemspec
的gemspec文件,该文件中有类似名称的类/模块(例如:module $Name$
),其中$name$
被用户提供的名称替换。
不幸的是,当我从gem的最顶端路径运行bundle install
时,我得到了一个错误:
There was a SyntaxError while evaluating $name$.gemspec:
C:/my_gem/template/$name$.gemspec:8: syntax error, unexpected tGVAR
gem.version = MyGem::$Name$::VERSION
看起来Bundler使用了错误的Gemfile,即使我通过以下其中一个显式地传递Gemfile或路径:
bundle install --gemfile=Gemfile
bundle install --path=C:my_gem
我还尝试更新我的Gemfile的gemspec
行,但没有成功:
gemspec name: 'my_gem'
最后,我已经确保template
文件夹甚至不包含在my_gem.gemspec
中,但这似乎无关紧要:
gem.files = Dir.glob("lib/**/*") + %w(LICENSE.txt README.md)
有人知道Bundler为什么要读取./template/$name$.gemspec
而不是./my_gem.gemspec
吗?
检查Bundler源代码,我可能在lib/Bundler/source/path.rb中发现了罪魁祸首。在load_spec_files
中有用于查找gemspec的GLOB。默认glob是"{,*,*/*}.gemspec"
。这将在您的gem的根目录或根目录的任何子目录(其中将包括您的模板目录)中找到*.gemspec。
如果这确实是罪魁祸首,您可以通过将模板目录放在gem的目录层次结构中更深的位置来解决这个问题,或者更改模板文件的名称,使其不会以.gemspec
结尾。Bundler::Source::Path
对象在初始化时看起来可以使用不同的glob,但我还没有深入研究,看是否有可行的方法可以通过config或cmdline选项在bundle执行中指定这个替代glob。