如何将特定gem冻结到Rails 3应用程序中?

时间:2011-10-07 01:17:50

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

我的问题与How do I freeze gems into a Rails 3 application?非常相似,但我只想冻结一个修改过的gem。这个问题的答案似乎导致捆绑所有应用程序的宝石。

如果它是相关的,我需要这样做,以便修改后的gem安装在Heroku上。

我检查了bundle-install doc,但似乎没有解决这种情况。但我无法想象这种情况并不常见。任何指导都表示赞赏。

3 个答案:

答案 0 :(得分:3)

好吧,Bundler将冻结所有这些,并且想法是你不仅要冻结一个宝石,而且要冻结产生应用程序工作副本的宝石集合。

话虽这么说,在你的本地开发机器上,你可以bundle update [name of gem],它只会将一个gem更新到你的Gemfile 中指定的限制内的最新版本,这也是更新您的Gemfile.lock,在您下次部署时有效更新Heroku上的一个gem。

答案 1 :(得分:3)

如果您正在使用bundler,这是Rails 3的默认设置,您可以随时将gem分叉到您自己的git存储库,并将该定义添加到Gemfile,无论它位于何处。发现于:

gem 'thegem', :git => 'git://github.com/cloned_to_me/thegem.git'

另一种选择是使用bundle packagevendor/cache中保存宝石的副本。然后可以根据the documentation使用bundle install --local安装这些文件。

这是最接近Rails 2“冻结”方法的东西,但它具有额外的优势,可以在安装之前保存宝石,而不是之后,避免任何特定于平台的问题,如前所述。

答案 2 :(得分:2)

感谢那些用相关方法回答问题的人,我最终采用了this sister question中提到的方法。为了清楚起见,这就是我所做的:

  1. 重新包装修改后的宝石作为自己的宝石。这需要一点点,但在RubyGems Guides中有很好的描述。将所述gem移动到您的源目录(我使用vendor/gems

  2. 在项目的Gemfile中,指向新gem的位置:

    gem "modified_gem", :path => "vendor/gems/modified_gem"

  3. 将新的gem添加到版本控制中,确保bundle install不会被时髦的设置搞砸(例如--local),然后用手指交叉。

  4. 有人还提到可以将更改混合到gem而不是覆盖源文件。除了它应该是可能的之外,我对此技术一无所知。