我最近接手了一个应用程序,它的一个宝石是直接从repo安装的,当然它现在可以在生产中使用,因为当它启动时一切正常,但是,在我的本地有一堆破碎的东西,因为我从git repo的头上拉了出来。
我的问题是,这个应用程序是否存在违反的最佳实践/模式,直接从repo使用gem,然后在生产模式下就像这样存在?我认为这很疯狂,但我找不到任何好的做法。
答案 0 :(得分:1)
运行bundle install
时,使用的确切提交哈希将插入Gemfile.lock
。如果将Gemfile.lock
提交给应用程序的git repo,那么无论您在哪里运行bundle install
,都应始终从同一提交运行,无论上游存储库中发生了哪些更改。这应该是非常安全的。
如果您正在获取git repo的头部,则表明Gemfile.lock
不在源代码管理中。绝对建议提交该文件:Bundler确保在不同的机器上安装相同版本的gem。见http://ryanbigg.com/2010/12/commit-it-or-else/
也就是说,许多团队更喜欢在部署之前构建包含所有gem依赖项的工件。这意味着您无需点击任何外部网站进行部署(除了您托管工件的地方之外)。
bundle package --all
。这会将所有gem文件和git gem repos复制到./vendor/cache
。tar
整个目录(不包括.git
)并将其上传到文件服务器。在文件名中添加时间戳,版本号,递增构建号和git commit hash的组合是个好主意。cd
到解压缩的目录。bundle install --deployment
。这将安装来自vendor/cache
的宝石,而不需要访问网络。请注意,如果构建服务器与生产服务器运行相同的操作系统,则此方法最佳。一些gems具有特定于平台的变体bundle package
将下载运行它的平台的gem文件。