我的问题与How do I freeze gems into a Rails 3 application?非常相似,但我只想冻结一个修改过的gem。这个问题的答案似乎导致捆绑所有应用程序的宝石。
如果它是相关的,我需要这样做,以便修改后的gem安装在Heroku上。
我检查了bundle-install doc,但似乎没有解决这种情况。但我无法想象这种情况并不常见。任何指导都表示赞赏。
答案 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 package
在vendor/cache
中保存宝石的副本。然后可以根据the documentation使用bundle install --local
安装这些文件。
这是最接近Rails 2“冻结”方法的东西,但它具有额外的优势,可以在安装之前保存宝石,而不是之后,避免任何特定于平台的问题,如前所述。
答案 2 :(得分:2)
感谢那些用相关方法回答问题的人,我最终采用了this sister question中提到的方法。为了清楚起见,这就是我所做的:
重新包装修改后的宝石作为自己的宝石。这需要一点点,但在RubyGems Guides中有很好的描述。将所述gem移动到您的源目录(我使用vendor/gems
)
在项目的Gemfile中,指向新gem的位置:
gem "modified_gem", :path => "vendor/gems/modified_gem"
将新的gem添加到版本控制中,确保bundle install
不会被时髦的设置搞砸(例如--local
),然后用手指交叉。
有人还提到可以将更改混合到gem而不是覆盖源文件。除了它应该是可能的之外,我对此技术一无所知。