如何访问阶段配置变量?
配置变量使用 fetch 方法访问,如下所示
local = fetch(:configuration_variable, _default_value_)
当访问在同一文件中定义的配置变量时,这可以正常工作。例如,访问之前在 deploy.rb 中定义的配置变量,或访问阶段文件中设置的配置变量。
deploy.rb 配置首先执行,然后执行来自 config/deploy/*.rb 的阶段文件。这意味着在 deploy.rb 中设置的配置变量可供阶段文件使用,但在阶段文件中创建的配置变量在 deploy.rb 中不可用。要访问它们,必须在 deploy.rb 中延迟加载它们。这之所以有效,是因为在任务运行并访问变量时,所有配置变量(来自 deploy.rb 和当前阶段文件)都已定义。
例如,让我们在生产和暂存文件中创建一个配置变量,并从 deploy.rb 访问当前变量。
config/deploy/production.rb
set :app_domain, "www.my_application.com"
config/deploy/staging.rb
set :app_domain, "stage.application_test.com"
这些变量在 deploy.rb 中使用 fetch(:nginx_port)
或 fetch(:app_domain)
不可访问,因为它们在执行 deploy.rb 时未定义。但是,它们可以使用 deploy.rb 中的 lambda 延迟加载,如下所示
config/deploy.rb
set :nginx_server_name, ->{ fetch(:app_domain) }
set :puma_bind, ->{ "unix:/tmp/#{fetch(:app_domain)}.sock" }
现在,:nginx_server_name
和 :puma_bind
变量将根据用于部署的哪个阶段文件懒惰地分配值。
如果您需要创建嵌套哈希,您可能会发现 do/end
语法更易读。
set :database_yml, -> do
{
production: {
host: 'localhost'
}
}
end