Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用本机扩展重新打包ruby gem_Ruby_Gem_Package - Fatal编程技术网

如何使用本机扩展重新打包ruby gem

如何使用本机扩展重新打包ruby gem,ruby,gem,package,Ruby,Gem,Package,我需要在没有安装任何开发工具的生产服务器上安装许多ruby gems(都带有C扩展)。我想先在开发服务器上构建gems,然后重新打包并在生产服务器上安装生成的本机gems 然而,似乎没有标准方法将gem与本机扩展一起打包以进行重新分发。我知道rake编译器,但没有一个相关的gem可以在开箱即用的情况下使用它。具体来说,我正在使用json-1.7.5、rb-inotify-0.8.8和ffi-1.2.1 gems 任何关于如何完成这项任务的建议或关于这一主题的文档都是值得赞赏的。你必须将它们构建在

我需要在没有安装任何开发工具的生产服务器上安装许多ruby gems(都带有C扩展)。我想先在开发服务器上构建gems,然后重新打包并在生产服务器上安装生成的本机gems

然而,似乎没有标准方法将gem与本机扩展一起打包以进行重新分发。我知道rake编译器,但没有一个相关的gem可以在开箱即用的情况下使用它。具体来说,我正在使用json-1.7.5、rb-inotify-0.8.8和ffi-1.2.1 gems


任何关于如何完成这项任务的建议或关于这一主题的文档都是值得赞赏的。

你必须将它们构建在一个几乎完全相同的系统上,这样才能工作。如果您针对位于不同位置或版本稍有不同的共享库进行链接,则可能根本不起作用。有时您会有一些松弛,它将与一系列版本一起工作,但这不能保证

由于这个原因,无法使用本机扩展进行打包,因为库的组合太多了

您还需要确保使用相同的体系结构,包括所需的32位或64位

有时你会很幸运,你的操作系统有一个软件包可以为你安装这些软件,但是这些软件包不适用于
rvm
rbenv
,使用Jordan Sissel的软件包,你可以获取各种输入档案(包括gems),并将其编译和打包为deb或rpm(以及其他)

要将json gem编译成deb包,请执行以下操作:

cd /tmp
fpm -s gem -t deb json
这将下载json gem的最新版本,并在
/tmp
中创建一个
rubygem-json-1.5.7-1.amd64.deb
存档,您可以将其安装到服务器上。请注意,编译框和最终服务器需要完全相同。至少发行版和比特数、ruby版本及其文件布局以及可用的可加载库应该是相同的。基本上你的上游分销所处理的所有约束


也就是说,从长远来看,我发现在目标服务器上安装编译器并在服务器上使用rbenv或rvm要容易得多。对于大多数中小型安装,它更易于处理,因为您不需要预编译并将所有内容发送到您的服务器。

您好,您可以使用:gem compiler进行操作

您需要告诉RubyGems要编译的gem的文件名:

$ gem compile yajl-ruby-1.1.0.gem
上述命令将解包、编译找到的任何现有扩展,并将所有内容重新打包为二进制gem:

Unpacking gem: 'yajl-ruby-1.1.0' in temporary directory...
Building native extensions.  This could take a while...
Successfully built RubyGem
Name: yajl-ruby
Version: 1.1.0
File: yajl-ruby-1.1.0-x86-mingw32.gem
这里有很好的书面文档: .
我使用它,以及我们有自己的宝石服务器。只需小心分发,因为在wheezy上编译的一些gem对jessie等不起作用。

你没有说你在使用什么操作系统。对于Linux,我建议您考虑创建一个YUM或apt-get包。他们将处理二进制文件。哦,忘了提到我的操作系统是64位rhel 6.2。我只是按照你的指示在一个6.3 x86_64节点上构建了一些RPM。但是,生成的RPM都不能安装在构建这些RPM的同一个节点上(在尝试安装RPM之前,我已使用“gem uninstall”cmd卸载了原始的gems)!我运行命令“rpm--nodeps--force-Uvh rubygem-ffi-1.2.0-1.x86_64.rpm”,得到了“package rubygem-ffi-1:1.2.0-1.x86_64是为操作系统设计的”的输出。好了,我解决了我的问题:我还需要在fpm命令行中使用选项--rpm os linux,生成的rpm可以完美地安装