使用 Figaro 和 Secrets.yml 管理环境变量

Using Figaro and Secrets.yml to Manage Env Variables

我有一个 rails 4.1 应用程序,我正在尝试组织我的环境变量。截至目前,我的 config/ 文件夹中有一个 secrets.yml 文件。我还安装了 figaro gem。我的目标是将所有环境变量都放在 application.yml(未签入 git)文件中,然后使用 secrets.yml(签入 git)文件映射变量从 appliation.yml 到应用程序。当我使用 Rails.application.secrets 打印文件时,它只显示如下所示的哈希值:

:salesforce_username=>"ENV['SALESFORCE_USERNAME']"

None 我的外部服务正在使用此环境变量设置。当我查看跟踪时,实际的 ENV['ACCOUNT_ID'] 正在这样的请求中传递:

v2/accounts/ENV['ACCOUNT_ID']/envelopes

此外,我无法在我的应用程序中使用 Rails.application.secrets.account_id 访问我的环境变量。

secrets.yml

development:
  account_id: <%= ENV['ACCOUNT_ID'] %>

aplication.yml

development:
  ACCOUNT_ID: "123456"

application.rb

# preload tokens in application.yml to local ENV
config = YAML.load(File.read(File.expand_path('../application.yml', __FILE__)))
config.merge! config.fetch(Rails.env, {})
config.each do |key, value|
  ENV[key] = value.to_s unless value.kind_of? Hash
end

gem提供了一个生成器:

$ rails generate figaro:install

生成器创建一个config/application.yml文件并修改.git忽略文件以防止文件被检入 git 存储库。

您可以将环境变量作为 key/value 对添加到 config/application.yml:

GMAIL_USERNAME: Your_Username

环境变量将作为 ENV 变量在您的应用程序中的任何位置可用:

ENV["GMAIL_USERNAME"]

这让您可以方便地在代码中使用相同的变量,无论它们是由 Unix shell 还是 figaro gem 的 config/application 设置的。 ymlconfig/application.yml 文件中的变量将覆盖 Unix shell.

中设置的环境变量

在测试或其他 ENV 变量可能不合适的情况下,您可以在 Figaro 方法调用时访问配置值:

Figaro.env.gmail_username

使用此语法在开发、测试或生产环境中设置不同的凭据:

HELLO: world
development:
  HELLO: developers
production:
  HELLO: users

在这种情况下,ENV["HELLO"] 将在开发中生成“开发人员”,在生产中生成“用户”,否则生成“世界”。

你说 ENV 变量是 "passed through in the requests",但当我查看你的代码片段时,我认为这些变量一开始就没有被检测到。

如果要将变量注入字符串,请仔细检查您是否使用以下格式,尤其是 #{}:

important_string = "v2/accounts/#{ENV['ACCOUNT_ID']}/envelopes"

更笼统地说,如果您不确定在给定环境中设置了哪些环境变量,最简单的复查方法是打开 Rails 控制台并查询 ENV 像这样:

$ rails console
> puts ENV.keys # find out what ENV vars are set
=> (returns a long list of var names)
> puts ENV['DEVISE_PEPPER']
=> "067d793e8781fa02aebd36e239c7878bdc1403d6bcb7c380beac53189ff6366be"