Ruby Gem不会构建:Gem :: InvalidSpecificationException [...]不是文件

时间:2014-06-27 12:44:30

标签: git gem rubygems

我正在尝试构建一个gem,但我一直在寻找:

WARNING:  See http://guides.rubygems.org/specification-reference/ for help
ERROR:  While executing gem ... (Gem::InvalidSpecificationException)
  [*list of about 300 file paths*]
are not files

我知道文件必须添加到git中,我已经这样做了。一切都是最新的。

令我震惊的是,列表中的文件路径是子目录,但路径缺少几个文件夹。

示例:

In list: bin/some_file.jar
Actual file: bin/some_library/lib/some_file.jar

我怀疑它与我的git设置方式有关,因为我的宝石是在一个“母git文件夹”中有几个项目,包括几个宝石,如下:

Mother Folder
  -> .git
  -> GemFolder1
  -> GemFolder2
  -> SomeOtherProject

看来我可以同时构建和安装Gem1,但是Gem2给了我这些错误。

最初我在文件夹名称中有一个.的文件夹,所以我认为这就是问题所在。所以我重命名了文件夹,将所有更改添加到git,然后重试。但是,我仍然有同样的问题。

我觉得这很奇怪,这让我怀疑宝石本身有一些奇怪的错误。

此外,当我手动运行

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

在Ruby中,显示为“不是文件”的文件最初甚至不存在于此列表中。

这里发生了什么?

2 个答案:

答案 0 :(得分:3)

我弄清楚导致这种情况的原因:

我的gemspec文件中有默认设置,这会创建一行:

spec.executables   = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }

如果bin文件夹中的子文件夹中的任何文件都将从文件路径中删除,那么bin/some_folder/some.executable将转换为bin/some.executable

在我看来,这是来自bundler默认值的错误。

因为我有一个非常小的宝石我只是写下来解决这个问题:

spec.executables   = []

我相信我不需要将我的文件注册为可执行文件(我可能错了)。

你还能做的就是写:

spec.files.grep(%r{^bin/}) { |f| f[3..-1] }

对大多数人来说,这将是一个更合适的解决方案。对我来说,它没有用,因为我有一些非可执行文件导致问题。

希望这可以帮助那些人:)

答案 1 :(得分:0)

我的问题是那个

s.files         = `git ls-files`.split("\n")

最初写成

s.files         = `git ls-files`.split('\n')

...用单引号。改变它为我修好了,不知道为什么它在第一时间打破了......