annotate gem异常:Ruby 2.5.1+Rails 5.2.0rc2环境下migrate报错
解决Annotate Gem在Rails 5.2.0rc2迁移时的报错问题
Hey,我之前也碰到过类似的坑!结合你的环境(Ruby 2.5.1 + Rails 5.2.0rc2 + annotate 2.7.2),这些can't modify frozen String和no implicit conversion of nil into Array的报错,本质上是旧版本annotate和Rails 5.2rc2兼容性不足,再加上Ruby 2.5.x默认的字符串冻结特性放大了这个问题。下面是几个亲测有效的解决步骤:
1. 优先升级Annotate到兼容版本
Annotate 2.7.2是2017年的老版本了,对Rails 5.2的支持完全跟不上。直接升级到最新稳定版(或者至少3.1.0及以上)就能解决大部分问题:
- 修改你的
Gemfile:gem 'annotate', '>= 3.1.0' # 这个版本开始对Rails 5.2做了适配 - 执行bundle更新:
重新跑bundle update annotaterails db:migrate,大概率就能正常工作了。
2. 排查模型中的冻结字符串
Ruby 2.5+会自动冻结一些字面量字符串,如果你的模型里有类似SOME_CONST = "value".freeze的代码,旧版annotate在往文件头部插注释时,可能不小心碰了这些冻结的字符串。你可以临时注释掉模型里的冻结代码测试,如果报错消失,那就是这个原因——不过还是更推荐升级annotate,新版本已经修复了这个问题,不用手动改模型。
3. 清除旧注释再重新生成
有时候缓存的旧注释数据会和新迁移的表结构冲突,试试先清掉所有注释再重新生成:
- 移除所有模型的现有注释:
bundle exec annotate --remove - 然后重新执行迁移或者手动生成注释:
rails db:migrate # 或者单独跑注释生成命令 bundle exec annotate
4. 临时禁用迁移时自动注释
如果上面的方法都没搞定,你可以先让annotate不在迁移时自动跑,等迁移完再手动生成注释:
- 先在
Gemfile里调整annotate的配置:gem 'annotate', group: :development - 然后创建
config/initializers/annotate.rb文件,添加:Annotate.set_defaults( disable_on_migrate: true ) - 执行完
rails db:migrate后,再手动跑bundle exec annotate生成注释就行。
内容的提问来源于stack exchange,提问作者mdegis
相关产品推荐
相关产品推荐

