我想将从 git 获取的 ruby 程序打包成 RPM 包。我有一个构建服务器和一个生产服务器(相同的操作系统/相同的 Arch)。
与大多数 ruby 项目一样,我的项目确实具有 gem 依赖项。
我找到了两种做我想做的事情的方法,我想知道哪种是最好的——最符合unix/linux哲学——操作明智
- 在生产服务器上少捆绑
第一个(我觉得这个更好)是执行bundle install --standalone --deployment --path %{buildroot}/usr/lib/rubygems/1.8/gems/ --binstubs %{buildroot}/usr/lib/rubygems/1.8.bin
。这会将 gem 安装在将部署 .rpm 的服务器上的 gem 系统路径上,无需安装 bundle。我不确定的是,当我安装具有相同 gem 的其他 rpm 时会发生什么?当我删除一个在两个包之间共享的 gem 的包时会发生什么?
- 在生产服务器上捆绑
该bundle install --deployment
命令将直接在项目本身中执行。这样,所有内容都可以在目录中找到vendor/
。我在网上看到一些关于供应商一切政策的帖子,它似乎在操作方面不太正确,因为很多 gem 将被重复。由于我没有 ruby 背景,我不知道它的具体优点/缺点
如果有人已经做了类似的事情,你会采取什么方法?从操作角度来看,最好的做法是什么?
答案1
不要使用 RPM 部署 gem,除非你部署所有依赖的宝石RPM 也是如此。请参阅Fedora Ruby 打包指南有关构建 RPM 的正确方法和构建 gem 的示例 spec 文件的信息,以及如何为你的 Rails web 应用构建 RPM。
如果你需要做一些违反 RPM 最佳实践的事情,那么你最好不使用 RPM 部署. 改用专注于部署的工具,例如 capistrano;它可以自动从 git 中检出你的应用程序并正确部署它(一旦你配置它)。