【发布时间】:2011-03-17 16:28:11
【问题描述】:
我想在我的 amazon_s3.yml 配置文件中做这样的事情:
access_key_id: ENV['S3_KEY']
secret_access_key: ENV['S3_SECRET']
...但我知道这行不通。不确定这是否可能,但您可以将 Ruby 代码放在 YAML 文件中吗?
【问题讨论】:
我想在我的 amazon_s3.yml 配置文件中做这样的事情:
access_key_id: ENV['S3_KEY']
secret_access_key: ENV['S3_SECRET']
...但我知道这行不通。不确定这是否可能,但您可以将 Ruby 代码放在 YAML 文件中吗?
【问题讨论】:
如果它是通过 ERB 解释的,则可以,在这种情况下,它就像一个 ERB 视图,Ruby 代码在 <% 和 %> 之间移动
试试:
access_key_id: <%= ENV['S3_KEY'] %>
secret_access_key: <%= ENV['S3_SECRET'] %>
...看看它是否有效
【讨论】:
通常/不直接。我这样说是因为为了使用 ruby 结果,您需要在加载文件之前首先使用诸如 ERB 之类的东西。在代码方面,您需要从以下内容开始:
loaded_data = YAML.load_file("my-file.yml")
甚至
loaded_data = YAML.load(File.read("my-file.yml"))
收件人:
loaded_data = YAML.load(ERB.new(File.read("my-file.yml")).result)
在这种特定情况下,您必须查看加载文件的内容 - 在某些情况下, 它可能已经设计为直接从环境中加载,或者您可能需要:
由于有一些使用 amazon_s3.yml 的插件,因此可能值得发布您正在使用的哪个库使用它 - 或者,我相信从快速的 google 中,AWS 库允许您将 AMAZON_ACCESS_KEY_ID 和 AMAZON_SECRET_ACCESS_KEY 定义为环境变量它会开箱即用。
【讨论】:
使用 fd. 的示例,如果您的应用程序配置为使用 HAML,请尝试使用字符串插值替换 ERB 语法。例如:
access_key_id: #{ENV['S3_KEY']}
secret_access_key: #{ENV['S3_SECRET']}
代替:
access_key_id: <%= ENV['S3_KEY']} %>
secret_access_key: <%= ENV['S3_SECRET'] %>
【讨论】:
access_key_id: <%= ENV['S3_KEY']} %> 中的大括号错字
无需任何额外代码(Rails 4.2)对我来说就像一个魅力:
default: &default
adapter: <%= 'mysql2' %>
【讨论】:
在 Rails 4.2 中,使用 ERB 语法将评估代码并返回字符串。
# environment variables
S3_KEY=01234
S3_SECRET=56789
# yaml file
access_key_id: <%= ENV['S3_KEY'] %>
secret_access_key: <%= ENV['S3_SECRET'] %>
# then you can do
ENV.fetch('access_key_id')
=> "01234"
ENV.fetch('secret_access_key')
=> "56789"
您还可以在 YAML 文件中的字符串中编写 ruby 代码,然后稍后对其进行评估
# yaml file
retry_interval: '5.minues'
# then you can do
eval(ENV.fetch('retry_interval'))
=> 300 seconds
注意:使用 eval 时要非常小心,因为它可能会带来严重的安全风险
【讨论】: