我想要的只是在npm脚本中简单地使用环境变量,而无需安装不必要的依赖项。
我在项目根目录中有一个.env
文件,其中包含
AWS_S3_BUCKET_ID=whatever
我的package.json
包含这些脚本
"scripts": {
"grep": "echo $(grep AWS_S3_BUCKET_ID .env | cut -d '=' -f2)",
"source": "source .env && echo $AWS_S3_BUCKET_ID",
"test-source": "[ -f .env ] && cat .env && npm run source"
},
信不信由你,npm run grep
执行,而npm run source
则不执行。
现在,荒谬的是npm run source
返回以下错误消息
sh: line 0: source: .env: file not found
npm run test-source
首先打印文件内容 (!!(,然后说该文件不存在。
这种行为有原因吗?
编辑:我在Linux上
试试这个:
...
"source": ". ./.env && echo $AWS_S3_BUCKET_ID",
...
我根本无法让 source 命令在 npm 脚本下的 Ubuntu 中工作(sh:1:source:未找到(,但这对我有用的是像你这样的最小项目设置。
在此答案中注明: https://stackoverflow.com/a/670209/4068418
在/bin/sh 应该遵守的 POSIX 标准中,命令是 。(一个点(,而不是来源。源命令是一个已被拉入 bash 的 csh 主义。
你也可以使用 npm 的 env-cmd 包来跨平台,但似乎你可以只让你的脚本成为 Linux。
看起来这与npm-run
默认使用/bin/sh
而不是/bin/bash
的事实有关。
这可能会让人感到惊讶,因为在/bin/sh
dot 命令中,文件名相对于$PATH
,不包括当前工作目录。您实际上可以通过以下方式对其进行测试:
$ sh
sh-5.1$ . .env
sh: .: .env: file not found
sh-5.1$
这就是您需要确保将相对路径明确提及为. ./.env
的原因。 但是,在/bin/bash
dot 命令 (.
( 是 source 的别名,它的行为不同,并将当前工作目录作为文件查找的一部分,因此以下两个命令都是同义词,并且"如您所料"地工作
$ /bin/bash
$ . .env
$ source .env
要解决此问题,您可以如@wowyesokay所述,只需使用相对文件路径,或使用标志script-shell
标志运行 NPM 脚本。正如npm run test-source --script-shell /bin/bash
.或者,您可能希望将该选项添加到.npmrc
文件中,以便所有调用都使用 script-shell 作为 bash。
在此页面上,您可以找到有关 dot 命令的一些有价值的解释/bin/sh
,最值得注意的是,这部分:
如果文件名中有斜杠,.(点( 查找命名文件。如果没有斜杠.(dot( 在 PATH 变量中指定的目录中搜索文件。当他们使用 dot 在工作目录中运行文件时,这可能会让一些人感到惊讶,但他们的搜索规则未设置为查看工作目录。因此,外壳找不到外壳文件。