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

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

在rails 2中有这个命令:

rake gems:unpack 

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

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

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

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

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

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

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

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

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

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

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

使用--path选项将安装gem,但它并不是你想要做的。 正如Matt Enright所说的那样,你只需要使用捆绑器可以在每个目标环境中巧妙处理的东西使你的SCM膨胀。

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

  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 =>“vendor / gems / typus”

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

    ‘gem unpack typus –target vendor / gems / typus’

  4. 然后bundle install

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

假设您已经安装了bundler gem :

  • $ bundle lock
  • $ git add Gemfile.lock

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

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

我想你要找的是

 bundle package 

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

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

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

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

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

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

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

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

但只是一个通知, :git => ....有点gem不会打包。 你必须破解出一条出路:git => ...相关的gem要打包。

gem unpack清洁指令和:path =>选项:

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

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

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

好吧,我必须稍微修改一下我需要的gem。 所以我需要把它放在我的回购中。 那么NFM提到的就是我可能需要的东西。