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

时间:2012-12-10 21:14:06

标签: ruby gem bundler gemspecs

我有一个定制宝石,在捆绑,构建,分发和配置方面一直运作良好。实现。宝石是框架的核心,其他宝石也是从中衍生出来的。由于大多数派生的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

1 个答案:

答案 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。