对此的一点想法:像这样的临时兼容性模板,如果带有一些自过期/守卫条件,可能会更安全,而不是一直无限期地覆盖 Discourse 的依赖项。
例如,对于临时的源代码回移(backports),我计划在生产环境中使用钩子,首先检查上游修复是否已经存在,仅在仍然需要时才应用补丁。
在这种情况下,类似以下内容的逻辑本可以防止旧的 aws-sdk-s3 1.177.0 版本锁定在 Discourse 自身开始依赖较新 SDK 功能后继续存在:
hooks:
after_bundle_exec:
- exec:
cd: $home
cmd:
- |
if grep -q "Aws::S3::TransferManager" lib/s3_helper.rb; then
echo "Discourse 现在需要 Aws::S3::TransferManager;跳过已过时的 Backblaze aws-sdk-s3 降级"
else
echo "应用临时的 Backblaze aws-sdk-s3 兼容性版本锁定"
bundle config set frozen false
sed -i 's/gem "aws-sdk-s3", require: false/gem "aws-sdk-s3", "1.177.0", require: false/' Gemfile
bundle update aws-sdk-s3
bundle add aws-sdk-core --version 3.215
fi
上述特定的检查仅作为示例——更通用的版本检查,或者当 Discourse 超过预期的 SDK 版本时显式失败,可能效果更好。
即使大声报错(failing loudly),也比静默生成一个 gem 版本与 Discourse 预期版本不匹配的容器要好。