0

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

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

它没有用:

 ERR_PNPM_RECURSIVE_EXEC_FIRST_FAIL  not found: dev

但是当我尝试时:

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

它运作良好。

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

4

1 回答 1

2

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

当 PowerShell 调用 PowerShell生命令(包括.ps1文件)时,它自己的参数绑定器会解释(第一个)--参数并将其删除;也就是说,目标命令永远不会看到它。( 的语义--类似于 Unix 实用程序的语义:--告诉参数绑定器将后续参数视为位置参数,即使它们看起来像参数(选项)名称,例如-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 对其本机命令的解析方式不同。

于 2022-02-13T19:45:14.500 回答