Gem::Specification.可执行文件与由“bundle gem”命令创建的不匹配



我正在学习如何制作 gem 文件。

通过使用bundle gem foo,我创建了一个"hello world"宝石。如果我指定可执行文件名,它可以正常工作。

Gem::Specification.new do |spec|
  spec.executables   = "foo"
end

但作为默认Gem::Specification.executables是这样设置的。

Gem::Specification.new do |spec|
  spec.executables   = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
end

我认为此方法可以找到bin目录下的所有文件。但它在我的环境中不起作用。

每次制作宝石时重写它都不是一件大事。但我想说清楚为什么这对我不起作用。

我的环境是:Ruby 2.0.0-P247 与 RBENV,捆绑包 1.3.5,宝石 2.0.3,乌班图12.04。

键行位于 spec.executables 的正上方。

 spec.files         = `git ls-files -z`.split("x0")

Git 用于列出文件,如果您尚未提交添加 bin/,则文件列表不会更改,因此不会构建和添加可执行文件。

我也有这个问题。虽然看起来很直观,但它似乎根本不适合我。但是,查看GitHub上的其他gem,看起来您只需指定gem本身,将使用默认的/bin目录

spec.executables = ['MyGem']

编辑:回顾这一点,凯文里弗斯的答案也是有效的。仅供参考,Bundler 确实假设您使用的是 git,因此两个答案都有效(其中还有更多 - 事实上,在我发布此答案后,我很快就深入研究了 gemspecs 的工作原理,尤其是与包含文件相关的内容,如果您有兴趣,我写了很多关于它的文章 - http://chrisarcand.com/using-git-in-your-gemspec/)。