DEBUG.WIKI
ZgoCloud:多地区部署,按需选节点;日本、美国、香港、德国
搬瓦工;先看线路,再选 VPS;CN2 GIA · 对应线路套餐;查看线路 →
V.PS:让项目靠近用户,亚太、欧洲、北美 KVM VPS

yargs 环境变量设为 1 却解析成 false,NO_ 也没有否定

yargs-parser 22.0.0 仅将布尔字符串 true 视为真,环境变量也不套用 CLI 的 no 前缀语义。使用明确的 true/false,并核对命令行优先级与实际变量名。

命令行工具用 yargs 读取环境变量,设置 MY_CMD_DO_THING=1 后,布尔选项反而变成 false;设置 MY_CMD_NO_DO_THING=true,原选项却仍然是 true。先确认环境变量已经进入进程,再看解析器如何解释字符串,不要按 JavaScript 的一般真值规则推断结果。

当前正式 yargs 18.2.0 依赖 yargs-parser 22.x;已核对的 22.0.0 对声明为 boolean 的字符串值使用严格比较 value === 'true'。环境变量里的字符串 1、yes、on 都不等于小写 true。环境变量的 NO_ 前缀也没有自动套用命令行 --no-* 的否定语义。

选项确实声明成了 boolean

下面是 ESM 命令行脚本中的完整配置,Node 必须满足所用 yargs 的运行时要求:

import yargs from 'yargs';
import { hideBin } from 'yargs/helpers';

const argv = yargs(hideBin(process.argv))
  .env('MY_CMD')
  .option('doThing', { type: 'boolean', default: true })
  .parseSync();

console.log(argv.doThing);

先确认没有同名命令行参数覆盖;未设置对应环境变量时,doThing 保持默认值 true。

使用正向变量时,MY_CMD_DO_THING=true 会得到 true,MY_CMD_DO_THING=false 会得到 false;但 MY_CMD_DO_THING=1 也会得到 false,不能按一般真值规则把字符串 1 当成开启。

只设置 MY_CMD_NO_DO_THING=true 不会否定原来的 doThing,它仍然取默认值 true。

最后一种写法可能形成另一个普通名称的参数,而不是修改 doThing。启用严格选项检查的应用还可能因未知参数而失败,不能把“不报错”视为否定已经生效。

用正向变量传明确的 true 或 false

能控制部署配置时,把正向变量写成精确的小写字符串:

MY_CMD_DO_THING=false node main.mjs

main.mjs 应替换为实际脚本路径。也可以在真正的命令行中使用 --no-doThing;这一参数否定路径与环境变量命名是分开的。CLI 参数优先于环境变量,环境变量又优先于配置与默认值,因此排查时应同时记录启动命令,避免一个遗留参数覆盖新设置。

如果外部系统只能提供 0 和 1,应在自己维护的输入边界明确解析并校验,再按应用配置合并优先级。不要对字符串调用 Boolean(value),因为 Boolean('false') 也是 true。也不要期待 option 的 coerce 在布尔转换之后还能恢复原来到底是字符串 1 还是 false。

空字符串、大小写变体和拼错的值最好按接口约定拒绝,而不是默默把它们都当作关闭。若关闭选项会跳过某项必要任务,应先在允许的测试环境核对实际行为,再调整部署配置。

升级 yargs 或 parser 后,仍要分别检查默认值、true、false、1、NO_ 变量和 CLI 覆盖这几条路径。如果依赖版本改变了字符串转换或变量命名规则,应按实际安装的 parser 核对,避免旧部署配置悄悄改变功能开关。