Ruby bundle update 和 bundle install 平时大家用哪个?

azhao · 2012年02月11日 · 最后由 ilstar 回复于 2012年07月11日 · 22032 次阅读

以前好像没怎么注意,今天注意了解一下,发现两个的差别 应该是 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 update

什麼時候該執行 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

#7 楼 @hooopo 这个思路很敏捷,值得鼓励 (当然,实行的时候要看产品和项目的具体情况,要独立判断)。 说一下我自己的经验,我手边的项目在三个月内做了两次彻底的升级,由于升级前确保测试用例的充分覆盖,所以升级后立刻能知道是否可行,这样就可以灵活决定是否回到旧版本。另外,有一次升级遇到某个插件没有跟上 rails 的升级步伐,测试用例暴露以后我评估了一下,写了几行 monkey patch 绕开了这个问题,下次这个 gem 升级时就删掉 patch 总结:

  1. 充分的测试是减少这类困难的有力保障
  2. 动态语言、open class 有可能很好的解决兼容问题,但是要注意评估影响范围

#8 楼 @fsword 真是装逼的言论啊,怎么着都透露出一种老子天下第一的口气。结果屁都没说出来一个。PS:我不能跑题,bundle install 用得多些,update 难以确定升级以后的的版本稳定性。一般敢上线的东西,起码当前的 gem 不会有太大纰漏。

#9 楼 @soloara 这个上下文不友好的是你

我喜欢周末听着音乐冲杯咖啡然后 bundle update

#9 楼 @soloara 原来到处在骂我阿,好吧你赢了,请忽略我

#10 楼 @Rei 额,我没偏题啊,sorry 不好意思。

#13 楼 @soloara 哥们,讨论问题不要带有偏见,那位兄一直很正常,你过了。

只知道只要改了 rails 的版本号,就必须 update 一下了。。。。。。

尽可能的不要直接使用 bundle update,如果使用的话一次只更新一个 gem,如 bundle update foo,避免出现问题后都不知道是从哪出的

个人建议还是在每个 gem 上添加版本号,想升级的时候手动修改一下这个版本号,然后 bundle install

17 楼 已删除
需要 登录 后方可回复, 如果你还没有账号请 注册新账号