1

我有一个定制的 gem,它在捆绑、构建、分发和实施方面一直运行良好。gem 是一个框架的核心,其他 gem 是从这个框架中派生出来的。由于大多数派生的 gem 将具有相同的基本结构,因此我想bin在 gem 的路径中包含一个 Ruby 脚本,该脚本可用于将文件从template文件夹复制到用户将开发自己的 gem 的新文件夹中。

我遇到的问题是该template文件夹有一个 gemspec 文件,该文件以文件$name$.gemspec中类似命名的类/模块命名(例如:) module $Name$,其中$name$被用户提供的名称替换。

不幸的是,当我bundle install从 gem 的最顶层路径运行时,出现错误:

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

我还尝试更新gemspec我的 Gemfile 行,但无济于事:

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

4

1 回答 1

2

检查 Bundler 源,我可能在lib/bundler/source/path.rb中发现了罪魁祸首。有 GLOB 用于在load_spec_files. 默认全局是"{,*,*/*}.gemspec". 这将在您的 gem 的根目录或根的任何一个后代目录(包括您的模板目录)中找到 *.gemspec。

如果这确实是罪魁祸首,您可以通过将模板目录放在 gem 的 dir 层次结构中更深的位置或更改模板文件的名称使其不以.gemspec. 该Bundler::Source::Path对象看起来在初始化时可以采用不同的 glob,但我还没有深入研究以查看是否有可行的方法通过 config 或 cmdline 选项在捆绑执行中指定此替代 glob。

于 2012-12-10T21:45:33.880 回答