使用 foreman gem 时,我包含一个 .env 文件来为我的开发环境指定不同的环境变量。
但是,在与其他开发人员协作处理项目时,保持我们的 .env 文件彼此同步而不将来自 Twilio 和 Pusher 等服务的凭据检查到源代码管理中,这是一种好方法?
目前,我在根目录保留了一个更新的 README.md,用于指定我们需要哪些密钥,但是每次拉取时都必须查看自述文件是一项额外的工作。
我们(我没有想出这个,但我的团队已经使用它一段时间了)有一个env
子目录,该子目录位于我们运行 foreman 的目录中。 在 env 中,有像 DATABASE_URI
或 MY_ENV_KEY
之类的文件,或者您需要的任何其他文件,其值是环境变量应设置为的值。
然后我们有一个名为 start_server.sh
的脚本,我们从 Foreman 的 procfile 调用它:
#!/bin/bash
for env_file in `pwd`/env/*;
do
name_of_var=`basename $env_file`
get_val_of_var_cmd='echo "$'$name_of_var'"'
val_of_var=`eval "$get_val_of_var_cmd"`
if [[ "$val_of_var" == "" ]];
then
val_of_var=`cat $env_file`
cmd="export $name_of_var='$val_of_var'"
echo "Setting $name_of_var=$val_of_var"
eval $cmd
else
echo "Using $name_of_var=$val_of_var"
fi
done
exec bundle exec unicorn $*
可以将env
目录及其中的文件添加到源代码管理中。
自从提出这个问题以来,我发现了约翰·雷西格(John Resig)的这篇文章,内容是关于他从同事克雷格·西尔弗斯坦(Craig Silverstein)那里学到的技巧。
http://ejohn.org/blog/keeping-passwords-in-source-control/
但是,我将选择他的原始解决方案,而不是将密钥加密到源代码管理中,即创建一个包含空值的虚拟密钥文件,并将实际密钥存储在安全但可供我的协作者访问的地方。