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

nfm*_*nfm 12 rubygems ruby-on-rails dependency-management bundler ruby-on-rails-3

Bundler在部署时确保安装了所有正确的gem,这是一项非常棒的工作.

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

我最近被这两次咬过,需要弄清楚防止它再次发生的最佳方法.

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

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

Jir*_*ong 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 
Run Code Online (Sandbox Code Playgroud)


nat*_*vda 6

不确定这是否适用于您,但我们使用木偶来达到此目的.另一个(类似的)替代品是厨师.

所以我们所做的就是"编写"我们机器的设置,但独立于我们的capistrano配方.它并不完全理想,但它也允许更清晰的分离:我们的系统人员/ devops使用puppet,rails开发人员使用capistrano.