Gem 关于 gem 'acts-as-taggable-on' 的一个小坑

ShayneChow · 2014年07月01日 · 最后由 ShayneChow 回复于 2014年07月02日 · 2883 次阅读

今天被'acts-as-taggable-on'这个 gem 的一个小坑狠狠的坑了一把。

昨天更新了一个老项目,加了几个 gem,更新了 bundle 今天下午客户来抱怨有个功能报错 一开始感到很奇怪,这与我昨天修改的毫无关系,怎么之前好好地就挂了呢? 于是各种搜索,各种查看数据库,依然没有答案 后来仔细查看了前后两版的代码,跟这个功能相关的什么都变化,问题出在哪里? 调试发现是创建 tag 时会报错 发现跟 tag 有关的变化就只有gemfile.lock 我想这不大可能有问题啊,一个 update 而已,不过我还是抱着试试看的心态,改回了原来的旧版 结果居然成功了!原来是这个 gem 新旧版本不完全兼容。

不知道这样算不算是个坑,反正把我狠狠坑了一下午,差点开始怀疑人生了。 分享一下苦逼的经验

BTW: 使用acts-as-taggable-on时最好指定版本 (尤其是在你使用较早版本时候)

# tag
# gem 'acts-as-taggable-on'  #这样会再bundle时更新到最新版,可能会引起意想不到问题
gem 'acts-as-taggable-on', '~> 2.4.1'

跟 acts-as-taggable-on 无关,每个 gem 的大版本更新都不保证兼容,比如 rails(你从 rails2.x 直接换成 rails3.x 试试) 原则上使用所有 gem 都要指定版本(用"~> x.x.x"最稳妥),否则就是给自己埋坑

acts-as-taggable-on 3.x 版本添加了 counter_cache 来提升性能(也就是 taggings_count) 2.x 版本升级到 3.x 需要执行以下语句

#https://github.com/mbleigh/acts-as-taggable-on/blob/master/UPGRADING.md(建议先仔细测试)
rake acts_as_taggable_on_engine:install:migrations

也可以在 gemfile 里面指定版本

gem 'a**', '~> 2.4.1‘

每个 gem 都要用 ~> x.y.z 来指定版本,避免除了 bugfix 以外的版本升级。 大版本要手动升级,然后看官方文档做数据和代码的迁移。

只有 Gemfile.lock 有变化那就肯定是直接跑bundle update了,这个习惯太容易出坑了。

主版本号更新意味着有不兼容变动。

楼主你把问题归咎于 acts-as-taggable-on 是不对的。

#6 楼 @Rei 也无归咎于 gem 的意思,第一次遇到这样的情况,所以还强调了不知道这样算不算是个坑 #2 楼 @saiga

rake acts_as_taggable_on_engine:install:migrations

文档我也看过,这个会报错

rake aborted!
Don't know how to build task 'acts_as_taggable_on_engine:install:migrations'
需要 登录 后方可回复, 如果你还没有账号请 注册新账号