Rails 6如何配置开发测试环境共享、不重复且生产不可用的凭证?
解决方案
Rails 的多环境凭证本身支持自定义加载逻辑,你可以通过以下两种方式实现需求,两种都不会产生重复配置,且生产环境不会读取到开发/测试的共享凭证:
方案1:创建共享凭证文件,配置开发/测试环境统一加载
这是最规范的实现方式:
- 首先创建一个共享的凭证文件,命名为
shared(也可以自定义为dev_test这类更明确的名字):
EDITOR="subl --wait" rails credentials:edit --environment shared
把你之前写在 development 凭证里的 vonage 等需要共享的配置全部写到这个 shared 凭证文件里,保存后会自动生成 config/credentials/shared.yml.enc 和对应的密钥文件 config/credentials/shared.key
2. 修改 config/application.rb,添加凭证加载的判断逻辑:
config.credentials.content_path = if Rails.env.development? || Rails.env.test? Rails.root.join("config/credentials/shared.yml.enc") else Rails.root.join("config/credentials/production.yml.enc") end config.credentials.key_path = if Rails.env.development? || Rails.env.test? Rails.root.join("config/credentials/shared.key") else Rails.root.join("config/credentials/production.key") end
- (可选)你可以把之前单独创建的
config/credentials/development.yml.enc和对应密钥删掉,避免配置冲突。
配置完成后开发和测试环境都会读取 shared 凭证里的配置,生产环境还是走独立的凭证逻辑,完全不会读到共享内容,也没有重复配置。
方案2:配置测试环境直接复用开发环境凭证
如果你不想额外创建 shared 凭证,也可以直接让测试环境加载已经存在的开发环境凭证,只需要修改 config/application.rb 添加逻辑即可:
if Rails.env.test? config.credentials.content_path = Rails.root.join("config/credentials/development.yml.enc") config.credentials.key_path = Rails.root.join("config/credentials/development.key") end
这种方式改动更少,不需要迁移现有配置,同样满足生产环境不会读取开发凭证的要求。
验证方法
配置完成后重启 Rails 控制台,分别在开发和测试环境执行 Rails.application.credentials.vonage 都能返回正确值,生产环境执行不会返回开发测试的共享配置。
内容的提问来源于stack exchange,提问作者user3574603
相关产品推荐
相关产品推荐

