如何基于环境配置Middleman的s3_sync参数 解决未定义变量报错
错误原因
报错是两个配置问题共同导致的:
- 配置顺序颠倒:
configure :internal块执行在activate :s3_sync之前,此时s3_sync插件还未被初始化,自然不存在s3_sync这个对象 - 环境配置块内的调用方式错误:在
configure块中不能直接使用s3_sync变量,需要通过全局config对象访问已激活的插件配置
修复方案
方案1:拆分通用配置和环境配置(适合多环境差异参数多的场景)
调整配置顺序,先激活插件写通用配置,再用环境块覆盖差异参数,修改后的config.rb如下:
# 先激活s3_sync插件,写入所有环境通用的配置 activate :s3_sync do |s3_sync| s3_sync.bucket = ENV['DOCS_AWS_BUCKET'] # 默认公网文档桶 s3_sync.region = ENV['DOCS_AWS_REGION'] s3_sync.aws_access_key_id = ENV['DOCS_AWS_ACCESS_KEY_ID'] s3_sync.aws_secret_access_key = ENV['DOCS_AWS_SECRET_ACCESS_KEY'] s3_sync.prefer_gzip = true s3_sync.path_style = true s3_sync.reduced_redundancy_storage = false s3_sync.acl = 'public-read' s3_sync.encryption = false s3_sync.prefix = '' s3_sync.version_bucket = false s3_sync.index_document = 'index.html' s3_sync.error_document = '404.html' end # 再定义internal环境的专属配置,覆盖需要差异化的参数 configure :internal do config[:s3_sync].bucket = ENV['INTERNAL_DOCS_AWS_BUCKET'] # 如果内部桶的区域、密钥也不同,可在此处追加覆盖 # config[:s3_sync].region = ENV['INTERNAL_DOCS_AWS_REGION'] # config[:s3_sync].aws_access_key_id = ENV['INTERNAL_DOCS_AWS_ACCESS_KEY_ID'] # config[:s3_sync].aws_secret_access_key = ENV['INTERNAL_DOCS_AWS_SECRET_ACCESS_KEY'] end
方案2:激活时直接判断环境(适合差异参数少的场景)
直接在插件激活块内判断当前运行环境,动态赋值参数,写法更简洁:
activate :s3_sync do |s3_sync| # 按环境动态选择对应存储桶 s3_sync.bucket = if environment == :internal ENV['INTERNAL_DOCS_AWS_BUCKET'] else ENV['DOCS_AWS_BUCKET'] end # 其余通用配置保持原有内容不变 s3_sync.region = ENV['DOCS_AWS_REGION'] s3_sync.aws_access_key_id = ENV['DOCS_AWS_ACCESS_KEY_ID'] s3_sync.aws_secret_access_key = ENV['DOCS_AWS_SECRET_ACCESS_KEY'] s3_sync.prefer_gzip = true s3_sync.path_style = true s3_sync.reduced_redundancy_storage = false s3_sync.acl = 'public-read' s3_sync.encryption = false s3_sync.prefix = '' s3_sync.version_bucket = false s3_sync.index_document = 'index.html' s3_sync.error_document = '404.html' end
验证
配置修改完成后,再执行原来的推送命令即可正常按环境对应存储桶推送:bundle exec middleman s3_sync --verbose --environment=internal
内容的提问来源于stack exchange,提问作者Underoos
相关产品推荐
相关产品推荐

