Ruby on Rails: можете ли вы поместить код Ruby в конфигурационный файл YAML?
Я хотел бы сделать что-то подобное в моем конфигурационном файле amazon_s3.yml:
access_key_id: ENV['S3_KEY']
secret_access_key: ENV['S3_SECRET']
... но я знаю, что это не работает. Не уверен, что это возможно, но можете ли вы поместить код Ruby в файл YAML?
Ответы
Ответ 1
Не нормально/напрямую. Я говорю это, потому что для того, чтобы использовать результаты Ruby, перед загрузкой файла вам нужно сначала использовать что-то вроде ERB. Что касается кода, вам нужно перейти от чего-то вроде:
loaded_data = YAML.load_file("my-file.yml")
Или даже
loaded_data = YAML.load(File.read("my-file.yml"))
To:
loaded_data = YAML.load(ERB.new(File.read("my-file.yml")).result)
В этом конкретном случае вам нужно будет посмотреть, что загружает файл - в некоторых случаях,
он уже может быть сконструирован так, чтобы загрузить его прямо из среды, или вам может понадобиться:
- Обезьяна Зафиксируйте код
- Fork + Используйте свою собственную версию.
Так как есть несколько плагинов, которые используют amazon_s3.yml, возможно, стоит опубликовать, какую библиотеку вы используете, которая использует его - в качестве альтернативы я считаю, что из быстрой версии Google библиотека AWS позволяет вам определять AMAZON_ACCESS_KEY_ID и AMAZON_SECRET_ACCESS_KEY как env vars и он выберет их из коробки.
Ответ 2
Вы можете, если он интерпретируется через ERB, и в этом случае он действует как вид ERB, а код Ruby находится между <%
и %>
Try:
access_key_id: <%= ENV['S3_KEY'] %>
secret_access_key: <%= ENV['S3_SECRET'] %>
... и посмотреть, работает ли он
Ответ 3
Использование fd. Например, попробуйте заменить синтаксис ERB со строчной интерполяцией, если ваше приложение настроено на использование HAML.. Например,
access_key_id: #{ENV['S3_KEY']}
secret_access_key: #{ENV['S3_SECRET']}
вместо:
access_key_id: <%= ENV['S3_KEY']} %>
secret_access_key: <%= ENV['S3_SECRET'] %>
Ответ 4
Работает как очарование для меня без дополнительного кода (Rails 4.2):
default: &default
adapter: <%= 'mysql2' %>
Ответ 5
В 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"
Вы также можете записать код ruby в строку в вашем файле YAML, а затем оценить его позже
# yaml file
retry_interval: '5.minues'
# then you can do
eval(ENV.fetch('retry_interval'))
=> 300 seconds
ПРЕДОСТЕРЕЖЕНИЕ: будьте очень осторожны при использовании eval, поскольку он может подвергнуть серьезную угрозу безопасности