4

我正在尝试将数据库备份作为 Capistrano (v3) 部署脚本的一部分(对于 NON-Rails 应用程序)。

该脚本工作正常——如果我将数据库配置硬编码到其中。

现在我想从 .env 文件加载数据库配置。在我的本地机器上,我的 .env 文件(位于 Capfile 旁边的 repo 根目录中)如下所示:

DB_NAME='local_name'
DB_USER='local_user'
DB_PASSWORD='local_pw'
DB_HOST='127.0.0.1'

在服务器上,.env 文件(Capistrano 已放置在shared文件夹中并从文件夹中符号化到current)读取如下:

DB_NAME='dev_name'
DB_USER='dev_user'
DB_PASSWORD='dev_pw'
DB_HOST='127.0.0.1'

但是,在运行 cap deploy 时,我得到以下信息:

INFO [292e2535] Running /usr/bin/env mysqldump -u local_user --password='local_pw' --databases local_name -h 127.0.0.1 | bzip2 -9 > /var/www/vhosts/xxxxx/backups/database_local_name_2014-05-29_22:52:07.sql.bz2 on <server>

即它正在使用我的本地 .env 文件,而实际上我希望它加载服务器上存在的 .env 文件。如果可能的话,我不希望我的所有团队都必须管理一个单独的 .env.production 文件!

我的脚本的相关部分如下(使用Dotenv gem):

require 'dotenv'
Dotenv.load '.env'
username, password, database, host = ENV['DB_USER'], ENV['DB_PASSWORD'], ENV['DB_NAME'], ENV['DB_HOST']

任何帮助将不胜感激!

4

2 回答 2

4

您可以使用Dotenv::Parser.call(string). 我正在使用 Capistrano 2.14(这是旧版本!)

desc <<-desc
  ENV test
desc
task :test do
  text = capture "cat #{shared_path}/.env"
  ENV2 = Dotenv::Parser.call(text)
  puts ENV2['DB_NAME']
end
于 2014-07-22T15:15:15.197 回答
0

在 Capistrano 3 下,我需要修复 Krisztián Ferenczi 的答案

task :load_remote_environment do
  on roles(:app) do
    set :default_environment, Dotenv::Parser.call(capture("cat #{shared_path}/.env"))
  end
end
after 'deploy:set_current_revision', 'load_remote_environment'

在 Capfile 中

require 'dotenv'
于 2017-09-29T10:27:56.703 回答