5

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

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

任何有关如何执行此任务的指示或有关该主题的文档都将受到赞赏。

4

3 回答 3

2

使用 Jordan Sissel 的fpm,您可以获取各种输入档案(包括 gem)并将它们编译和打包为(以及其他)DEB 或 RPM。

将 json gem 编译成 deb 包的示例如下:

cd /tmp
fpm -s gem -t deb json

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

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

于 2012-12-19T00:05:14.810 回答
1

嗨,您可以使用: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

它在这里有很好的文档: https ://github.com/luislavena/gem-compiler 。我正在使用它,我们也有自己的 gem 服务器。只是必须小心分发,因为在 wheezy 上编译的一些 gem 不适用于 jessie 等等。

于 2016-01-12T23:18:02.723 回答
0

您将不得不在几乎完全相同的系统上构建它们才能正常工作。如果您要链接位于不同位置或版本略有不同的共享库,则它可能根本不起作用。有时你有一些松弛,它可以与一系列版本一起使用,但这不能保证。

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

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

有时您会很幸运,并且有一个适用于您的操作系统的软件包可以为您安装这些,但这些不适用于rvmor rbenv

于 2012-12-18T22:32:18.263 回答