我只想简单地在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上
发布于 2022-04-20 12:12:07
看起来,这与npm-run
默认情况下运行脚本而不是/bin/bash
有关。
这可能会让人感到意外,因为在/bin/sh
点命令中,文件名相对于$PATH
,不包括当前的工作目录。您实际上可以通过以下方法对其进行测试:
$ sh
sh-5.1$ . .env
sh: .: .env: file not found
sh-5.1$
这就是您需要确保将相对路径显式地命名为. ./.env
的原因。但是,在/bin/bash
上,点命令(.
)是源的别名,它的行为不同,并且包含当前工作目录作为文件查找的一部分,因此下面这两个命令都是同义词和“您希望的”工作。
$ /bin/bash
$ . .env
$ source .env
为了解决这个问题,您可以使用相对文件路径,或者运行带有标志script-shell
标志的NPM脚本,就像@wowyesokay提到的那样。作为npm run test-source --script-shell /bin/bash
。或者,您可能希望将该选项添加到您的.npmrc
文件中,因此所有调用都使用script-shell作为bash。
在此页上,您可以找到关于/bin/sh
上的点命令的一些有价值的解释,最值得注意的是,这一部分:
如果文件名中有斜杠,则。(点)查找命名文件。如果没有斜线。(点)在PATH变量中指定的目录中搜索文件。当一些人使用点在工作目录中运行文件时,这可能会让他们感到惊讶,但是他们的搜索规则并不是为了查看工作目录而设置的。因此,shell找不到shell文件。
https://stackoverflow.com/questions/59859797
复制相似问题