13

我们有一个 ruby​​ 应用程序,它依赖于带有本机扩展的 gem(在本例中为 Nokogiri)。但是,由于各种原因,我们无法将该 gem 的构建先决条件(例如 build-essential、libxslt-dev、ruby-dev 等)安装到我们的生产主机上。

是否有(标准?)方法可以使用预先构建的本机扩展重新打包 gem?

应该是可能的(在 Windows 上执行此操作似乎是相当标准的),但我找不到有关该主题的任何文档。

请注意,我们只需要支持单个平台,所有系统库的已知版本(Ubuntu 9.04 Server 64 位,Ruby 1.8.7)。

更新:我们正在使用 Bundler,所以我们希望在一天结束时仍然安装一个gem ,而不是 debian 包

4

2 回答 2

21

终于找到了一种方法来为使用rake-compiler构建其 C 扩展(其中大部分)的 gem 执行此操作。

您需要在与您要部署到的机器相同的机器上执行以下操作,否则它将无法正常工作:

安装构建 C 扩展的构建先决条件:

# apt-get install build-essentials ruby-dev # ... etc
# gem install rake-compiler

解压您要重建的 gem:

$ gem unpack nokogiri

构建您闪亮的新预编译 gem:

$ rake native gem

您现在可以在没有安装任何构建工具的机器上安装本机 gem:

$ gem install pkg/nokogiri-1.4.3.1-x86-linux.gem 
Successfully installed nokogiri-1.4.3.1-x86-linux
1 gem installed
于 2010-10-10T20:37:19.017 回答
-1

构建机器

要为您的所有 gem 缓存正确的平台版本,请将所有 gem 打包在vendor/cache同一台机器上:

$ bundle package --all

生产机器

安装所有已缓存的 gem 依赖项,这些依赖项需要使用 gem 缓存具有正确的平台版本:

$ bundle install --local --deployment
于 2014-02-17T16:38:02.357 回答