如果你在Rails中,YAML可以包含ERB。
将它们结合起来,以下是如何使用<%= %>
从一个文件中引用另一个文件:
database.yml
<% if File.exists?('/tmp/mysql.sock') %>
<%= IO.read('config/database.mysql.yml') %>
<% else %>
<%= IO.read('config/database.sqlite.yml') %>
<% end %>
数据库.sqlite.yml
sqlite: &defaults
adapter: sqlite3
pool: 5
timeout: 5000
development:
<<: *defaults
database: db/development.sqlite3
test:
<<: *defaults
database: db/test.sqlite3
production:
<<: *defaults
database: db/production.sqlite3
数据库.mysql.yml
development:
adapter: mysql2
# ... the rest of your mysql configuration ...
我找到了使用ERB解决我的情况的方法。
我对YAML模块进行了猴子补丁,以添加两个新方法。
module YAML
def YAML.include file_name
require 'erb'
ERB.new(IO.read(file_name)).result
end
def YAML.load_erb file_name
YAML::load(YAML::include(file_name))
end
end
我有三个YAML文件。
mod1_config.yml
mod1:
age: 30
city: San Francisco
mod2_config.yml
mod2:
menu: menu1
window: window1
all_config.yml
<%= YAML::include("mod1_config.yml") %>
<%= YAML::include("mod2_config.yml") %>
使用方法YAML::load_erb
而不是YAML::load
来解析yaml文件。
config = YAML::load_erb('all_config.yml')
config['mod1']['age'] # 30
config['mod2']['menu'] # menu1
注意事项:
private method 'include' called for Psych:Module (NoMethodError)
,你有什么猜测如何解决吗?
我已经在 initializers/yaml.rb
中添加了 YAML 模块。 - swapab如果你的目标是在 YAML 文件中避免重复,而不必要包含外部文件,那么我建议你这样做:
development: &default
adapter: mysql
encoding: utf8
reconnect: false
database: db_dev
pool: 5
username: usr
password: psw
host: localhost
port: 3306
dev_cache:
<<: *default
new:
<<: *default
database: db_new
test:
<<: *default
database: db_test
YAML::ENGINE.yamler = 'syck'
才能使其正常工作 https://dev59.com/pVfUa4cB1Zd3GeqPJpsi#6140900 - evanrmurphyhttps://github.com/entwanderer/yaml_extend
https://rubygems.org/gems/yaml_extend
yaml_extend 为 YAML 添加了 YAML#ext_load_file 方法。
该方法类似于原始的 YAML#load_file,通过文件继承进行扩展。
# start.yml
extends: 'super.yml'
data:
name: 'Mr. Superman'
age: 134
favorites:
- 'Raspberrys'
-
# super.yml
data:
name: 'Unknown'
power: 2000
favorites:
- 'Bananas'
- 'Apples'
YAML.ext_load_file('start.yml')
导致
data:
name: 'Mr. Superman'
age: 134
power: 2000
favorites:
- 'Bananas'
- 'Apples'
- 'Raspberrys'
I'm using this:
load_config.rb (initializer)
cf_1 = YAML::load(File.read("/etc/my_app/config.yml"))
cf_2 = YAML::load(File.read(File.join(Rails.root, "config", "config.yml")))
CONFIG = cf_1.merge(cf_2)
CONFIG['value']
!include
不是指令而是标签。这不是Python(或PyYAML)的特性,而是“poze”库的特性:
poze.configuration 公开了一个名为include的默认指令。
YAML规范没有定义这样的标准标签。
!include
标签。我希望有人已经编写了类似“poze”库中自定义标签的自定义标签。我猜这是时候自己编写自定义标签了 :-) - Harish Shetty这取决于你需要做什么。如果你需要传输文件,可以对内部的yaml文件进行base64编码。