17

我想将特定的 gem 冻结到我的 Rails 应用程序中。

在 rails 2 中有这个命令:

rake gems:unpack

我在 Rails 3 中找不到该命令。

4

13 回答 13

21

所以,简短的回答是,你没有。

当您修改 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 大小刚刚膨胀)。

于 2010-10-26T17:24:32.390 回答
18

不要使用 NFM 的“推荐”答案!

相反,请查看 Bundler 站点,尤其是有关部署的页面:http: //gembundler.com/deploying.html

简短的总结是在您的 Gemfile 中使用特定版本,并bundle install --deployment在您需要确切 gem 版本的每个目标系统上运行。

使用该--path选项将安装 gem,但这并不是您真正想要做的。正如马特恩莱特所说,你只是用捆绑器可以在每个目标环境上巧妙处理的东西来膨胀你的 SCM。

于 2010-11-24T00:28:38.113 回答
8

我还没有这样做,但我相信这一切都由bundler.

当你创建一个新的 rails3 应用程序时,rails 依赖项被放入你的Gemfile. 你可以运行bundle install来安装它们。默认情况下,它们安装在您的BUNDLE_PATH.

如果你想在你的应用程序中安装它们,你可以指定 where: bundle install vendor/gems

于 2010-08-05T04:51:46.853 回答
7

我必须为 Heroku 上的 typus gem 部署执行此操作,因为您无法heroku rails generate typus在 Heroku 上运行 a,因为它是只读文件系统。我不希望将所有宝石都放入我的应用程序中,而只是让我感到悲伤的宝石。以下是通向成功的步骤:

  1. 在 app_name/vendor/gems/gem_name 中创建目录(可选)...在我的情况下是 /app_name/vendor/gems/typus

  2. 将以下内容添加到 gemfile(这告诉 bundle 在哪里可以找到和放置 gem 源):

    gem 'typus', :git => 'https://github.com/fesplugas/typus.git', :path => "vendor/gems/typus"

  3. 然后从您的应用程序目录中(这会将 gem 安装到您的应用程序中):

    'gem unpack typus --target vendor/gems/typus'

  4. 然后bundle install

  5. 然后..在我的情况下......提交并推送到存储库,然后部署到heroku......你可能需要运行一个heroku rake db:migrate

于 2011-04-05T16:54:34.690 回答
1

您可以在 Dreamhost 上捆绑安装而不会出现任何问题。如果您处于共享状态,则环境已经设置为将它们本地存储在您的主目录中。如果您在 VPS 或专用服务器上,您可以以 root 身份运行 bundle install 或将其添加到您的 .bash_profile

export GEM_HOME=$HOME/.gems
export GEM_PATH=$GEM_HOME:/usr/lib/ruby/gems/1.8
于 2011-06-11T23:58:44.137 回答
1

假设您已经安装了bundler gem

  • $ bundle lock
  • $ git add Gemfile.lock
于 2010-08-05T06:16:52.267 回答
1

我支持 tsega 的答案(由 coreyward 更新)。“捆绑包”是通用答案。

海报并没有问是否要冻结他的宝石。他想知道HOW。诸如“不要这样做”之类的答案根本没有帮助。是的,事实证明他的具体问题与此略有不同,但虽然“捆绑包”可能有点矫枉过正,但它仍然可以解决问题。

我在很多系统上工作过,在一些系统上你只是没有完全访问权限。在某些系统上安装 gems 不是一种选择。因此,除非您将它们打包,否则通常您会被搞砸。不同的主机和系统有不同的解决方法,但有些没有。

于 2013-08-30T01:53:03.450 回答
1

我想你正在寻找的是

bundle package

在此处查看手册页:http: //gembundler.com/man/bundle-package.1.html

于 2011-05-02T02:26:51.863 回答
0

您想要的命令bundle package只是解压缩vendor/cache文件夹中的 gems 和依赖项。

但请注意,:git => ....这种宝石不会被打包。您必须为相关的宝石找到一条出路:git => ...才能打包。

于 2011-03-24T12:30:57.690 回答
0

gem unpack:path =>选项的更清洁说明:

于 2012-01-18T21:07:48.737 回答
0

Pod - 如果您需要修改 gem,最好的做法是分叉项目,进行更改,然后在 bundler 中使用 'git' 标志:

git 'some_gem', :git => 'git://github.com/me/my_forked_some_gem.git'

这样,您将在 gem 更新时收到通知。

于 2011-03-18T02:58:27.003 回答
-1

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.

于 2011-01-26T23:42:51.487 回答
-1

很多评论有点说使用 bundle install --path vendor/gems 没用,但是那些使用 Dreamhost 的人应该注意,您不能在 Dreamhost 中使用 bundle install。

解决方案是将所有 gem 放入 vendor 文件夹并将整个内容上传到 Dreamhost 目录。

还有其他解决方案可以解决这个问题,但做起来要复杂得多。

于 2011-06-09T23:26:07.343 回答