为什么bundler使用了错误的gemspec文件



我有一个自定义的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。

相关内容

  • 没有找到相关文章

最新更新