我试图打包一个依赖于大型关系引用源的gem,目前实现为2.1GB的sqlite数据库文件。我已将文件放在/ data目录中,并将其恰当地包含在gemspec中。 gem build
工作正常(虽然压缩自己需要半个小时!),但gem install
出错:
ERROR: While executing gem ... (RangeError)
integer 2243380224 too big to convert to `int'
如果我没有注意到2243380224是数据库的确切文件大小,那将是完全神秘的。但是,了解错误的原因并不能使我更接近解决方案。
在目前的情况下,要求用户单独下载数据库并在其项目配置中指定它是没有意义的。我希望gem install
能够提供开箱即用的功能。关于打包依赖于挖掘大型信息库的ruby功能的最佳实践应该是什么建议?
答案 0 :(得分:0)
我怀疑错误来自于line,其中rubygems尝试从tar存档读取条目(gem基本上是tar存档)。
它不仅试图一次性读入内存,而且红宝石的IO.read
要求它的第一个参数适合签名长(不确定这是记录在案,但它肯定是MRI所做的)。在许多常见平台上,这意味着一个32位有符号整数,最大值为2 ** 31-1,小于sqlite文件的大小。
如果没有修补rubygems本身,你将无法安装此gem。此外,由于它在内存中执行所有操作(因为它期望文件很小),因此可能会遇到内存分配问题。
gem可以有一个post安装消息,您可以使用它来提示用户运行您的下载脚本,但是您无法自动运行脚本(除非您滥用extconf.rb)。当您的gem的次要代码更改不需要他们重新下载2GB数据文件时,您的用户可能会感谢您。