我正在学习如何制作 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/)。