我使用此版本在 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
的值?
您应该使用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"
。
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
这很难阅读,但我还没有找到更简洁的方法。
从 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"