我已经通过npm (db-migrate
)安装了一个命令。作为自动化数据库迁移的一部分,我希望从命令行运行它。脚本的配置文件可以引用环境变量。我已经将数据库凭据设置为另一个文件中的环境变量。因此,我没有两次设置它们,而是告诉迁移配置使用环境变量。问题是,在运行迁移脚本之前,如何从文件中获取环境变量?此外,如何从npm bin
直接运行迁移脚本?
我找到了一个很好的解决这个问题的方法,所以我张贴这个问题和答案,至少是为了我未来的自我利益。
发布于 2019-05-07 00:10:27
这可以使用几个工具来完成:
PORT=3000 node index.js
但是我们想从文件中读取变量。这可以使用export
和xargs
来完成。
export $(cat app.env | xargs)
bin
运行脚本。bin
文件夹的路径可以使用npm bin
获得。因此,我们只需要在运行命令之前将其添加到路径中:PATH=$(npm bin):$PATH
export $(cat app.env | xargs) && PATH=$(npm bin):$PATH db-migrate up
这将读取环境变量,设置它们,将npm bin
添加到路径中,然后运行迁移脚本。
顺便说一下,app.env
的内容应该如下所示:
PORT=3000
DB_NAME=dev
DB_USER=dev_user
DB_PASS=dev_pass
更新:
这种方法有几个注意事项。首先,它将使用环境变量污染当前的shell。换句话说,在运行export...xargs
位之后,您可以运行类似于echo $DB_PASS
的内容,您的密码就会显示出来。若要防止这种情况,请将命令包装为parens:
(export $(cat app.env | xargs) && PATH=$(npm bin):$PATH db-migrate up)
parens导致在子subshell环境中执行命令。环境变量不会冒泡到当前的shell。
第二个警告是,只有当环境变量中没有空格时,这才能起作用。如果您想要空格,我找到了一个基于这个重要的评论的OK解决方案。创建一个名为load-env.sh
的文件
# loads/exports env variables from a file
# taken from: https://gist.github.com/judy2k/7656bfe3b322d669ef75364a46327836#gistcomment-3239799
function loadEnv() {
local envFile=$1
local isComment='^[[:space:]]*#'
local isBlank='^[[:space:]]*$'
while IFS= read -r line; do
[[ $line =~ $isComment ]] && continue
[[ $line =~ $isBlank ]] && continue
key=$(echo "$line" | cut -d '=' -f 1)
value=$(echo "$line" | cut -d '=' -f 2-)
eval "export ${key}=\"$(echo \${value})\""
done < "$envFile"
}
然后像这样运行命令:
(source scripts/load-env.sh && loadEnv app.env && PATH=$(npm bin):$PATH db-migrate up)
https://stackoverflow.com/questions/56013874
复制相似问题