npm 告诉 .env 文件不存在(但它确实存在),它甚至可以打印它



我想要的只是在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/shdot 命令中,文件名相对于$PATH,不包括当前工作目录。您实际上可以通过以下方式对其进行测试:

$ sh
sh-5.1$ . .env
sh: .: .env: file not found
sh-5.1$

这就是您需要确保将相对路径明确提及为. ./.env的原因。 但是,在/bin/bashdot 命令 (.( 是 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 在工作目录中运行文件时,这可能会让一些人感到惊讶,但他们的搜索规则未设置为查看工作目录。因此,外壳找不到外壳文件。

相关内容

最新更新