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 对其本机命令的解析方式。
在我的项目中,我正在尝试将 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 对其本机命令的解析方式。