dotenv cli 如何使用“--”(双破折号)运行 命令?

How does dotenv cli with "--" (double-dash) running commands?

在我的项目中,我正在尝试将 dotenv-cli 与 pnpm 一起使用。我在 windows 上使用 PowerShell 7.2.1。我在 package.json 中有带有包 api 和脚本 dev 的 monorepo。 首先我尝试的是:

dotenv -e .\.env -- pnpm dev --filter api

但没有成功:

 ERR_PNPM_RECURSIVE_EXEC_FIRST_FAIL  not found: dev

但是当我尝试时:

dotenv -e .\.env -- pnpm -- dev --filter api

效果很好。

正如我所读,-- 表示命令选项结束,之后只接受位置参数。那么为什么我需要使用它两次才能让我的命令生效呢?为什么会这样?

问题是,当您从 PowerShell 调用 (与从 cmd.exe 不同)时,命令名称 dotenv 解析为PowerShell 脚本,即dotenv.ps1,正如您所报告的。

当 PowerShell 调用 PowerShell-native 命令时 - 包括 .ps1 文件 - 它自己的参数绑定器解释(第一个)-- 参数并 将其删除 ;也就是说,目标命令 永远不会看到它 。 (-- 的语义类似于 Unix 实用程序的语义:-- 告诉参数绑定器将后续参数视为 positional 参数,即使它们 看起来像参数(选项)名称,例如-foo。)

因此,不幸的是,您需要指定 -- 两次 才能将单个 -- 实例传递给 .ps1 脚本本身:

# The first '--' is removed by PowerShell's parameter binder.
# The second one is then received as an actual, positional argument by
# dotenv.ps1
dotenv -e .\.env -- -- pnpm dev --filter api

或者,假设 dotenv.cmd,即 CLI 的 批处理文件 版本也存在(并且也在 $env:PATH 中列出的目录中) , 你可以通过显式调用它来绕过这个问题,而不是 .ps1; 当调用外部程序(包括由其他 shell/脚本引擎解释的脚本,例如 cmd.exe)时,PowerShell 不会 移除 --:

# Calling the batch-file form of the command doesn't require
# passing '--' twice.
dotenv.cmd -e .\.env -- pnpm dev --filter api

警告:虽然这通常无关紧要,但批处理文件解析其参数的方式不同于 PowerShell 对其本机命令的解析方式。