以前好像没怎么注意,今天注意了解一下,发现两个的差别 应该是 bundle update 会去检查 Gemfile 里 gem 的更新,然后对比 lock 文件,如果 Gemfile 里没有指定版本或是指定是>=的版本,那有新版本就会去安装新的版本的 gem,然后更新 lock 文件。 而 bundle install 以 Lock 文件为优先,为本地系统安装 Lock 文件中指定的版本,而去检查 Gemfile 中有而 Lock 中没有的,安装之。Install 好像不去管网络中 Gem 版本的更新。
这样的结果就是如果本地已经有这个 Gem,而与 Gemfile 没有什么冲突,那么 Bundle install 能很快的完成。而 Bundle update 会很慢。
并且,如果我们需要一个稳定的 Gem 版本结构,那最好就是使用 bundle install 安装新的 Gem,而不是使用 Bundle update,因为那样会出现一些 gem 偷偷 Update,给项目带来一些不必要的问题,毕竟我们真的不知道哪位大大在更新 Gem 的时候会引入什么的变化和 Bug,还是保持原来的好,毕竟跑了很久,没有问题。如果确实需要哪个 Gem 的更新,就单独 Bundle update gemname 那个 Gem,然后跑一下测试再往下。
这是我的看法,但看好多的文章教程都是用 Bundle update,我不知道是不是我的理解错误,Update 还有什么别的能力。不知道大家都习惯用哪个?why?
什麼時候該執行 bundle install 或 bundle update 呢?一般來說,總是執行 bundle install 即可。這個指令只會做必要的更新到 Gemfile.lock,執行速度較快,它不會幫你升級現有的 Gem。而 bundle update 會重新產生整個 Gemfile.lock 檔案,更新所有 Gem 到最新版本。但是,一次升級太多套件,可能會造成除錯上的困難。因此會建議如果要升級,請執行 bundle update gem_name 一次升級一個套件。
--《Ruby on Rails 實戰聖經》 http://ihower.tw/rails3/environments-and-bundler.html
#1 楼 @huacnlee 是的,bundle update 会升级一些 gem,如果你没有对这些新版本有足够的把握,不要随便 update
Update the gems specified (all gems, if none are specified), ignoring the previously installed gems specified in the Gemfile.lock. In general, you should use bundle install(1) to install the same exact gems and versions across machines.
You would use bundle update to explicitly update the version of a gem.
#2 楼 @zhangjingqiang #3 楼 @fsword 所以,再 Gemfile 里面,要再 gem 'foo' 的后面加上版本号嘛,以免一不小心 bundle update 带来的问题。
@zhangjingqiang @huacnlee @azhao
而 bundle update 會重新產生整個 Gemfile.lock 檔案,更新所有 Gem 到最新版本。但是,一次升級太多套件,可能會造成除錯上的困難。因此會建議如果要升級,請執行 bundle update gem_name 一次升級一個套件。
所以,再 Gemfile 里面,要再 gem 'foo' 的后面加上版本号嘛,以免一不小心 bundle update 带来的问题。
这样有 N 个 gem 就要运行 N 次 bundle update..........
问:为什么要一次升级一个 gem? 答:因为会一次报很多错误,难以排错
问:为什么会一次报很多错误,难以排错? 答:因为很久没升级了,导致一次会升级很多 gem,并且很多 gem 都是旧的。
问:为什么很久没升级了? 答:因为升级困难
问:怎么困难? 答 1:锁定了版本号,要升级就需要知道每个 gem 的最新版本号,并且修改 gemfile....... 答 2:因为要运行 N 次 bundle update gemname.............. -------------------华丽的分割线------------------ 问:为什么要加版本号? 答:以免一不小心 bundle update 带来的问题
问:源码控制是做什么的? 答:.... -------------华丽的分割线----------------------- 问:不锁定版本号导致开发机器和部署环境代码不一致怎么办?而且我遇到过这种情况。。 答:你的 bundle 使用方法错了。。
所以,我觉得上面两种升级方案都不靠谱。而且理由很牵强。
解决办法就是: 1.不锁定版本号 2.小步升级,频繁升级,fail fast 3.使用 SV 和 gemnasium 4.了解你使用的 gem
这里是按照上面原则从 rails3.1.0rc4 升到 rails3.2.1,并且保持其他 gem 也是最新版本的一个实践: https://github.com/hooopo/rubyist/commits/master/Gemfile.lock
再推荐一下这篇... http://rubyeye.herokuapp.com/articles/27
尽可能的不要直接使用 bundle update,如果使用的话一次只更新一个 gem,如 bundle update foo,避免出现问题后都不知道是从哪出的
个人建议还是在每个 gem 上添加版本号,想升级的时候手动修改一下这个版本号,然后 bundle install