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

5

我有一个基于Rails 4.1的应用程序,正在尝试组织我的环境变量。目前,在我的config/文件夹中有一个secrets.yml文件。我还安装了figaro gem。我的目标是将所有的环境变量都放在不提交到git中的application.yml文件中,然后使用提交到git的secrets.yml文件将变量从application.yml映射到应用程序中。当我使用Rails.application.secrets打印这些文件时,它只显示像这样的哈希值:

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

我的外部服务在这个环境变量设置下都无法正常工作。当我查看跟踪时,实际上是像这样通过请求传递ENV ['ACCOUNT_ID']:

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

此外,在我的应用程序中,我无法使用Rails.application.secrets.account_id访问我的env变量。
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
2个回答

11

这个 gem 提供了一个生成器:

$ rails generate figaro:install

生成器会创建一个config/application.yml文件,并修改.gitignore文件,以防止该文件被提交到git仓库中。
您可以将环境变量作为键/值对添加到config/application.yml中:
GMAIL_USERNAME: Your_Username

环境变量将作为 ENV 变量在应用程序的任何地方都可用:

ENV["GMAIL_USERNAME"]

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

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

Figaro.env.gmail_username

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

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

在这种情况下,ENV["HELLO"] 在开发环境中会产生“developers”,在生产环境中会产生“users”,否则会产生“world”。

rails generate figaro:install 在我的安装中找不到。我在gemfile中加入了gem figaro,'1.1.1',运行了bundle install,但是生成器不在那里。 - Ekkstein

1
你说环境变量被“传递到请求中”,但是当我查看你的代码片段时,我认为这些变量首先没有被识别为环境变量。
如果你想向字符串注入变量,请仔细检查是否使用了以下格式,特别是 # 和 {}:
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"

3
很抱歉这个答案没有帮到您!有什么反馈可以让我在未来提供更有用的答案吗? - Topher Hunt
1
我觉得这对访问我的环境变量很有用。谢谢。 - Jessica Fav

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接