nx:运行命令默认参数值

问题描述 投票:0回答:3

我使用此版本在 nx mono 存储库中创建了 React 库

nx: 15.6.3

我在packages/my-library命令中添加了运行多个命令

generate react component
generate react-stories

使用这些插件

@nrwl/react:component
-
@nrwl/react:component-story

这就是目标

"generate-atom": {
      "executor": "nx:run-commands",
      "options": {
        "commands": [
          {
            "command": "nx g @nrwl/react:component --project=core --style=@emotion/styled --export --directory=atoms/{args.group} --name={args.name}",
            "forwardAllArgs": true,
            "bgColor": "bgBlue"
          },
          {
            "command": "nx g @nrwl/react:component-story --project=core --componentPath=atoms/{args.group || 'common'}/{args.name}/{args.name}.tsx",
            "forwardAllArgs": true
          }
        ],
        "cwd": "packages/core",
        "parallel": false
      }
    },

当我从 nx 调用这个目标时,组件是在内部创建的

packages/core/src/atoms/undefined/button

这是我正在使用的命令

npx nx run core:generate-atom --args="--name=button"

如果没有通过,我们如何默认

group
的值?

json nrwl nx.dev
3个回答
2
投票

您应该使用nx:run-commands

Args Interpolation
Shell Parameter Expansion的组合,如下:

    "generate-atom": {
      "executor": "nx:run-commands",
      "options": {
        "commands": [
          {
            "command": "nx g @nrwl/react:component --project=core --style=@emotion/styled --export --directory=atoms/{args.group} --name={args.name}",
            "forwardAllArgs": true,
            "bgColor": "bgBlue"
          },
          {
            "command": "nx g @nrwl/react:component-story --project=core --componentPath=atoms/${\"{args.group}\"/undefined/common}/{args.name}/{args.name}.tsx",
            "forwardAllArgs": true
          }
        ],
        "cwd": "packages/core",
        "parallel": false
      }
    },

在上面的示例中,

nx:run-commands
执行器将用相应的值替换任何出现的
/{args\.([^}]+)}/g
正则表达式,并作为参数传递给命令,其中缺少的参数将被视为
undefined
。因此,传递给 Shell 的结果命令看起来像
${"undefined"/undefined/common}
,我们使用 Shell 参数扩展 将其与
"undefined"
进行匹配,并将其替换为
"common"


1
投票

TL;DR 答案:

bash -c \"nx g @nrwl/react:component-story --project=core --componentPath=atoms/$([[ {args.group} = undefined ]] && echo common || echo {args.group})/{args.name}/{args.name}.tsx 

解释:

Nx 的运行命令在底层使用节点的

child_process.exec
参见源代码)。

const childProcess = exec(commandConfig.command, {
  maxBuffer: LARGE_BUFFER,
  env: processEnv(color),
  cwd,
});

不幸的是,它不能很好地与 shell 插值配合使用(根据我的经验)。举个最简单的例子,执行

exec('echo $0', (error, stdout) => console.log(stdout)
会打印
$0
,而不是按预期打印 shell。

为了解决这个问题,我添加了

bash -c "<your actual command here>"

设置默认值的下一步是使用此答案中的三元运算符来打印所需的值:

[[ {args.group} = undefined ]] && echo <your default value> || echo {args.group}

等效的 JavaScript 是:

args.group === "undefined" ? <your default value> : args.group

然后您可以将其放入子 shell 中以获取所需的值:

$([[ {args.group} = undefined ]] && echo <your default value> || echo {args.group})

最后在你的命令中使用它的结果,如下所示:

bash -c \"nx g @nrwl/react:component-story --project=core --componentPath=atoms/$([[ {args.group} = undefined ]] && echo common || echo {args.group})/{args.name}/{args.name}.tsx 

这很难阅读,但我还没有找到更简洁的方法。


0
投票

从 Nx v18.1.1 开始,您可以通过直接提供值作为选项或在具有默认值的 args 中来

提供默认值

{
  "name": "my-lib",
  "targets": {
    "argsAsOptions": {
      "command": "./cli.ts {args.exampleArg}"
      "options": {
        "exampleArg": "defaultValue"
      }
    },
    "useArgsOption": {
      "command": "./cli.ts {args.exampleArg}"
      "options": {
        "args": ["--exampleArg=defaultValue"]
      }
    }
  }
}

然后可以通过提供参数来覆盖该值,例如

nx argsAsOptions my-lib --exampleArg="override"
© www.soinside.com 2019 - 2024. All rights reserved.