如何将Gems冻结到Rails 3应用程序中?

时间:2010-08-05 03:24:00

标签: ruby-on-rails ruby-on-rails-3 rubygems bundler

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

在rails 2中有这个命令:

rake gems:unpack

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

13 个答案:

答案 0 :(得分:21)

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

当您修改Gemfile,然后运行bundle installbundle update时,bundler会为您处理依赖项解析并确定您需要的每个gem的最佳(最新)版本,以满足整个依赖链(你不会得到一个破坏依赖列表中另一个gem的新版本,等等)。您当然也可以使用config.gem天中熟悉的语法在Gemfile中放置特定版本或'> = 1.2.3'规范或whathaveyou,并且捆绑包也将确保满足该版本(如果没有有效的解决方案,则不会生成Gemfile.lock。

当Bundler开展业务时,它会创建Gemfile.lock文件,而这个文件(并且只提供捆绑器用于管理所有工作站/环境/部署中的gem)执行与冻结所有宝石相同的功能已经要求了。免费! (将此文件检入版本控制!)如果您的新开发实习生在新机器上下拉源,则需要一个bundle install,并且您安装的宝石的完全相同版本都在她的机器上。推送到部署,并在那里执行bundle install --deployment(或者更有可能将其放入Capfile中),并安装相同的gem(这次可以配置为vendor / bundle)。在Rails 3中使用Bundler管理加载所有宝石,所以无论你告诉捆绑者安装它们(默认情况下你的正常gem install位置是什么,或BUNDLE_PATH(记录在中)。如果你使用bundle install --path=foo安装bundle / config,bundler将加载正确的,即使它们与系统gem不同。

您无需解压缩宝石并将其签入您的应用程序,因为它无关紧要:您保证无论安装位置如何都会调用相同的版本,这可能会因机器而异无论如何都要加工(.bundle /不应该检入回购) - 那么为什么要将另外60-80 MB的文件粘贴到你的回购中,你永远不会改变或使用? (顺便说一下,这就是为什么我不推荐bundle install --path=vendor/gems like nfm suggested - 它不一定是错的,它在普通的捆绑工作流程上没有任何好处,现在你的回购规模只是膨胀了)。

答案 1 :(得分:18)

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

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

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

使用--path选项将安装宝石,但实际上并不是您想要做的。正如Matt Enright所说的那样,你只需要使用捆绑器可以在每个目标环境中巧妙处理的东西来扩散您的SCM。

答案 2 :(得分:8)

我还没有这么做,但我相信这一切都由bundler处理。

创建新的rails3应用时,会将rails依赖项放入Gemfile。您可以运行bundle install来安装它们。默认情况下,它们会安装到您的BUNDLE_PATH

如果您想在应用中安装它们,可以指定:bundle install vendor/gems

答案 3 :(得分:7)

我必须在Heroku上为typus gem部署这样做,因为你不能在Heroku上运行heroku rails generate typus,因为它是一个只读文件系统。我不希望所有宝石都放入我的应用程序,只是那个让我感到悲痛的宝石。以下是导致成功的步骤:

  1. 在app_name / vendor / gems / gem_name(可选)中创建目录...在我的案例中/ app_name / vendor / gems / typus

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

    gem'tyxus',:git => 'https://github.com/fesplugas/typus.git',:path => “供应商/宝石/ typus”

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

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

  4. 然后bundle install

  5. 然后..在我的情况下...提交并推送到存储库然后部署到heroku ...您可能必须运行heroku rake db:migrate

答案 4 :(得分:1)

假设您已经安装了bundler gem

  • $ bundle lock
  • $ git add Gemfile.lock

答案 5 :(得分:1)

我认为你在寻找的是

bundle package

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

答案 6 :(得分:1)

您可以在dreamhost上捆绑安装而不会出现任何问题。如果您已共享,则已设置环境以将其本地存储在您的主目录中。如果您使用的是VPS或Dedicated,则可以以root身份运行bundle install,或者只将其添加到.bash_profile

export GEM_HOME=$HOME/.gems
export GEM_PATH=$GEM_HOME:/usr/lib/ruby/gems/1.8

答案 7 :(得分:1)

我是tsega的回答(由coreyward更新)。 “捆绑包”是一般答案。

海报没有问是要冻结他的宝石。他想知道如何。像“只是不要这样做”这样的答案根本没有用。是的,事实证明他的具体问题与此有点不同,但虽然“捆绑包”可能过度杀戮但仍能解决问题。

我曾经在很多系统上工作过,有些人只是没有完全访问权限。在某些系统上安装宝石不是一种选择。因此,除非你打包它们,否则你一般都搞砸了。不同的主机和系统有不同的解决方法,但对于某些主机和系统没有。

答案 8 :(得分:0)

Pod - 如果你需要修改gem,执行此操作的最佳做​​法是分支项目,进行更改,然后在bundler中使用'git'标志:

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

这样,当宝石更新时,您将收到通知。

答案 9 :(得分:0)

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

但只是一个通知,:git => ....种宝石不会被打包。你必须破解出:git => ...相关宝石的出路。

答案 10 :(得分:0)

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

答案 11 :(得分:-1)

我必须稍微修改一下我需要的宝石。所以我需要把它放在我的回购中。所以NFM提到的就是我可能需要的东西。

答案 12 :(得分:-1)

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

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

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