几天前我开始看到
Would have removed best_in_place (2.0.2)
Would have removed thor (0.16.0)
在我的 heroku 部署输出中。
它曾经说它移除了宝石。
有谁知道这是怎么回事?
更新
heroku 更新到最新的 ruby 1.9.3 并且 bundler 缓存清理得很好。
几天前我开始看到
Would have removed best_in_place (2.0.2)
Would have removed thor (0.16.0)
在我的 heroku 部署输出中。
它曾经说它移除了宝石。
有谁知道这是怎么回事?
更新
heroku 更新到最新的 ruby 1.9.3 并且 bundler 缓存清理得很好。
这是 Heroku 部署配置中的一个错误。它写入一个文件 .bundle/config ,其中有一行:
BUNDLE_DRY_RUN: false
当 bundler 加载这个全局配置文件时,它会将其转换为 :dry_run => "false" 当它检查这个设置时,它会检查 settings[:dry_run],它是一个字符串,其计算结果为 true。
您可以通过一些 shell 命令(heroku run bash)删除此行:
mv -f .bundle/config .bundle/config.orig
sed '/BUNDLE_DRY_RUN/d' < .bundle/config.orig > .bundle/config
然后运行
bundle clean
这是 bundler gem 中的一个错误——本质上是额外的调试信息被转储到屏幕上。它应该在下一个版本中进行修补。删除将来自缓存,很可能是因为有更新的版本可用(最新版本是best_in_place
2.0.3、0.17.0 Thor
)。这些可以安全地忽略。
经过一番研究,这似乎不是一个错误,而是一个功能!
正如你在这里看到的那样https://github.com/carlhuda/bundler/pull/2237
已经实施了一个dry_run
标志,就像宝石已被移除一样,而不是移除它们,它只是打印
实际代码在这里
if Bundler.settings[:dry_run]
Bundler.ui.info "Would have removed #{output}"
else
Bundler.ui.info "Removing #{output}"
FileUtils.rm_rf(gem_dir)
end
如您所见,如果 dry_run 打印就是这样。否则它会移除宝石
因此,由于这是一项功能而不是错误,因此不会很快得到修复。这给heroku(我正在等待答复)留下一个问题,即他们为什么使用dry_run..
请注意那些不知道的人-这个膨胀的slug
大小
@Roman 的解释是正确的。
如果你有一个自定义的 buildpack(或者你可以很容易地 fork 并使用它),它可以在一行中修复
https://github.com/heroku/heroku-buildpack-ruby/blob/master/lib/language_pack/ruby.rb
第 408-409 行从
puts "Cleaning up the bundler cache."
pipe "bundle clean"
到
puts "Cleaning up the bundler cache."
pipe "bundle config --delete dry_run"
pipe "bundle clean"
bundle config --delete 删除配置(注意下划线),默认dry-run
为 false。
这个问题现在已经在 Bundler 1.3.2 的发布中得到修复,它现在在最新的官方 Ruby buildpack 中的 Heroku 上使用。