解压、编辑并重建Ruby Gem(a.gem)时出错,求问题排查
嘿,我来帮你梳理下可能出问题的地方——作为经常折腾Gem打包的开发者,这种情况我碰到过好多次,咱们一步步来排查:
文件路径与
files:字段不匹配
你更新files:字段时,要确保路径是相对于.gemspec所在目录的正确相对路径。比如新增的文件在解压后的根目录,直接写"new_file.txt"就行;如果放在lib/subdir/下,就得写"lib/subdir/new_file.rb"。另外,很多.gemspec会用Dir.glob批量匹配文件(比如Dir["lib/**/*", "README.md"]),你要确认新增文件能被这个匹配规则覆盖,或者手动把它加到数组里。.gemspec的位置和文件名不对
要保证.gemspec文件名和Gem名称完全一致(比如Gem是a.gem,spec文件就得叫a.gemspec),而且必须放在解压后的Gem根目录里(和lib、bin这些文件夹同级)。如果文件名错了或者放错了位置,gem build会找不到正确的配置文件。新增文件实际不存在或路径拼写错误
别小看这个低级错误!确认你新增的文件真的在解压后的文件夹里,而且文件名、路径的拼写(包括大小写,类Unix系统是区分大小写的)和files:里写的完全一致。比如你写了"lib/NewFile.rb",但实际文件是"lib/new_file.rb",就会报错。.gemspec其他配置字段的问题
有时候报错不一定是files:的锅,比如:- 如果新增的文件在
lib子目录外,要检查require_paths字段有没有包含对应的目录(默认是["lib"]); - 有没有在spec里引用了不存在的文件(比如
require了一个没添加的文件); - 版本号是否一致:解压后的Gem里的版本(比如
lib/a/version.rb里的常量)和.gemspec的version字段要完全匹配。
- 如果新增的文件在
unpack的Gem和spec版本不匹配
如果你本地有多个版本的a.gem,可能gem unpack a.gem和gem unpack --spec a.gem拿到的是不同版本的文件,导致spec和实际Gem内容不兼容。可以对比下解压后的版本信息和spec里的version字段是否一致。
如果还是解决不了,把gem build输出的具体错误信息贴出来,能更快定位问题!
内容的提问来源于stack exchange,提问作者sel

