我应该如何为生产中的宝石管理二进制依赖项?

时间:2011-05-27 02:09:29

标签: ruby-on-rails ruby-on-rails-3 rubygems bundler dependency-management

Bundler做了一项非常棒的工作,确保在部署时安装所有正确的宝石。

但是,有些宝石依赖于二进制文件(例如Paperclip依赖于ImageMagick,PDFKit依赖于wkhtmltopdf),可能会也可能不会安装在正在部署的系统上。

我最近被这两次咬过,需要找出防止它再次发生的最佳方法。

有没有一种方法可以确保安装这些外部二进制文件和库?捆绑商是否有任何支持?我应该修改我的capistrano部署脚本吗?我应该在我的存储库中包含二进制文件,并确保宝石在正确的位置查找它们吗?

我可以想办法解决这个问题,但想知道你认为最有效的方法,以及原因。

3 个答案:

答案 0 :(得分:12)

根据我的经验,我的服务器是差异平台(OpenSuSe,CentOS和OSX)的同一问题。

我把脚本安装在capistrano脚本上的二进制文件(yum,zypper,apt-get等),使用ruby的system()方法来验证命令的工作。在你的ImageMagick示例中。它是这样的

  desc "ImageMagick from source"
  task :ImageMagick => :prepare do
    d_url = "ftp://ftp.imagemagick.org/pub/ImageMagick/ImageMagick.tar.gz"
    file = "ImageMagick.tar.gz"
    sh("#{os_installer} install -y ghostscript-devel ghostscript-library libpng-devel libjpg-devel")
    Dir.chdir('downloads') do
      sh("wget -O #{file} #{d_url}")

      raise "ERROR: Unable to download ImageMagick" unless File.exist?(file)

      sh("tar -xzvf #{file}")
      unzip_dir = Dir.glob("ImageMagick-*").first

      Dir.chdir(unzip_dir) do
        sh("./configure --prefix=/usr --with-x=no --disable-static --with-modules --without-perl --without-magick-plus-plus --with-quantum-depth=8")
        sh("make")
        sh("make install")
        sh("ldconfig")
      end 

      raise "Unable to find ImageMagick" unless system("convert --version")
    end 
  end 

答案 1 :(得分:6)

不确定这是否适用于您,但我们会将puppet用于此目的。 另一个(类似的)替代方案是chef

所以我们所做的是'脚本'我们机器的设置,但独立于我们的capistrano配方。 它不是完全理想的,但它也允许更清晰的分离:我们的系统人员/ devops使用木偶,铁轨开发人员使用capistrano。

答案 2 :(得分:2)

使用Puppet,您可以在清单中说出类似的内容:

package{'foo': ensure => installed, } # native (like RPM) package providing one of your binaries, installed from a repo

#then explicitly declare the dependency like this. This will be installed using 'gem install' from the default place used by gem
package{'my_gem':
  ensure  => installed,
  require => Package['foo'],
  provider => 'gem',
}