我想将特定的 gem 冻结到我的 Rails 应用程序中。
在 rails 2 中有这个命令:
rake gems:unpack
我在 Rails 3 中找不到该命令。
我想将特定的 gem 冻结到我的 Rails 应用程序中。
在 rails 2 中有这个命令:
rake gems:unpack
我在 Rails 3 中找不到该命令。
所以,简短的回答是,你没有。
当您修改 Gemfile,然后运行bundle install
orbundle update
时,bundler 会为您处理依赖项解析并确定您需要的每个 gem 的最佳(最新)版本,以满足整个依赖链(您不会得到一个破坏的新版本依赖列表中的另一个宝石等)。当然,您也可以使用过去熟悉的语法在 Gemfile 中放置特定版本或“>= 1.2.3”规范或whathaveyou config.gem
,并且捆绑器也会确保满足这一点(或者不会产生Gemfile.lock 如果没有有效的分辨率)。
当 Bundler 执行其业务时,它会创建 Gemfile.lock 文件,该文件(前提是您单独使用 bundler 来管理所有工作站/环境/部署上的 gem)执行与冻结您需要的所有 gem 相同的功能. 免费!(将此文件检查到版本控制中!)如果您的新开发实习生在一台新机器上下载您的源代码,则需要一个bundle install
并且您已安装的 gem 的完全相同版本在她的机器上。推送到部署,并在bundle install --deployment
那里执行(或者更有可能将其放入您的 Capfile 中),然后安装相同的 gem(这次进入供应商/捆绑包,可配置)。Bundler 在 Rails 3 中用于管理加载所有 gem,所以无论你告诉 bundler 安装它们的任何gem install
地方(默认情况下你的正常位置是什么,或者BUNDLE_PATH
(如果您使用其他方式安装,则记录在 .bundle/config 中bundle install --path=foo
),bundler 将加载正确的,即使它们与系统 gem 不同。
您不需要解压 gem 并将它们签入到您的应用程序中,因为这无关紧要:您保证无论安装在何处都会调用相同的版本,这可能会因机器而异(.bundle/ 不应该签入到 repo 中) - 那么为什么要在你的 repo 中再添加 60-80 MB 的文件,而你永远不会更改或使用呢?(顺便说一句,这就是为什么我不推荐bundle install --path=vendor/gems
类似 nfm 建议的原因- 这不一定是错误的,与正常的打包程序工作流程相比,它没有任何好处,现在你的 repo 大小刚刚膨胀)。
不要使用 NFM 的“推荐”答案!
相反,请查看 Bundler 站点,尤其是有关部署的页面:http: //gembundler.com/deploying.html
简短的总结是在您的 Gemfile 中使用特定版本,并bundle install --deployment
在您需要确切 gem 版本的每个目标系统上运行。
使用该--path
选项将安装 gem,但这并不是您真正想要做的。正如马特恩莱特所说,你只是用捆绑器可以在每个目标环境上巧妙处理的东西来膨胀你的 SCM。
我还没有这样做,但我相信这一切都由bundler
.
当你创建一个新的 rails3 应用程序时,rails 依赖项被放入你的Gemfile
. 你可以运行bundle install
来安装它们。默认情况下,它们安装在您的BUNDLE_PATH
.
如果你想在你的应用程序中安装它们,你可以指定 where: bundle install vendor/gems
。
我必须为 Heroku 上的 typus gem 部署执行此操作,因为您无法heroku rails generate typus
在 Heroku 上运行 a,因为它是只读文件系统。我不希望将所有宝石都放入我的应用程序中,而只是让我感到悲伤的宝石。以下是通向成功的步骤:
在 app_name/vendor/gems/gem_name 中创建目录(可选)...在我的情况下是 /app_name/vendor/gems/typus
将以下内容添加到 gemfile(这告诉 bundle 在哪里可以找到和放置 gem 源):
gem 'typus', :git => 'https://github.com/fesplugas/typus.git', :path => "vendor/gems/typus"
然后从您的应用程序目录中(这会将 gem 安装到您的应用程序中):
'gem unpack typus --target vendor/gems/typus'
然后bundle install
然后..在我的情况下......提交并推送到存储库,然后部署到heroku......你可能需要运行一个heroku rake db:migrate
您可以在 Dreamhost 上捆绑安装而不会出现任何问题。如果您处于共享状态,则环境已经设置为将它们本地存储在您的主目录中。如果您在 VPS 或专用服务器上,您可以以 root 身份运行 bundle install 或将其添加到您的 .bash_profile
export GEM_HOME=$HOME/.gems
export GEM_PATH=$GEM_HOME:/usr/lib/ruby/gems/1.8
我支持 tsega 的答案(由 coreyward 更新)。“捆绑包”是通用答案。
海报并没有问是否要冻结他的宝石。他想知道HOW。诸如“不要这样做”之类的答案根本没有帮助。是的,事实证明他的具体问题与此略有不同,但虽然“捆绑包”可能有点矫枉过正,但它仍然可以解决问题。
我在很多系统上工作过,在一些系统上你只是没有完全访问权限。在某些系统上安装 gems 不是一种选择。因此,除非您将它们打包,否则通常您会被搞砸。不同的主机和系统有不同的解决方法,但有些没有。
您想要的命令bundle package
只是解压缩vendor/cache
文件夹中的 gems 和依赖项。
但请注意,:git => ....
这种宝石不会被打包。您必须为相关的宝石找到一条出路:git => ...
才能打包。
gem unpack
和:path =>
选项的更清洁说明:
Pod - 如果您需要修改 gem,最好的做法是分叉项目,进行更改,然后在 bundler 中使用 'git' 标志:
git 'some_gem', :git => 'git://github.com/me/my_forked_some_gem.git'
这样,您将在 gem 更新时收到通知。
Well I have to modify slightly one of the gems I need. So I need to keep it inside my Repo. So what NFM mentioned is what I probably need.
很多评论有点说使用 bundle install --path vendor/gems 没用,但是那些使用 Dreamhost 的人应该注意,您不能在 Dreamhost 中使用 bundle install。
解决方案是将所有 gem 放入 vendor 文件夹并将整个内容上传到 Dreamhost 目录。
还有其他解决方案可以解决这个问题,但做起来要复杂得多。