我正在尝试构建一个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中,显示为“不是文件”的文件最初甚至不存在于此列表中。
这里发生了什么?
答案 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')
...用单引号。改变它为我修好了,不知道为什么它在第一时间打破了......