nx/packages/workspace/docs/run-commands-examples.md

118 lines
3.1 KiB
Markdown

`workspace.json`:
```json
//...
"frontend": {
"architect": {
//...
"ls-project-root": {
"builder": "@nrwl/workspace:run-commands",
"options": {
"command": "ls apps/frontend/src"
}
}
}
}
```
```bash
<%= cli %> run frontend:ls-project-root
```
##### Chaining commands, interpolating args and setting the cwd
Let's say each of our workspace projects has some custom bash scripts in a `scripts` folder.
We want a simple way to create empty bash script files for a given project, that have the execute permissions already set.
Given that Nx knows our workspace structure, we should be able to give it a project and the name of our script, and it should take care of the rest.
The `commands` option accepts as many commands as you want. By default, they all run in parallel.
You can run them sequentially by setting `parallel: false`:
```json
"create-script": {
"builder": "@nrwl/workspace:run-commands",
"options": {
"commands": [
"mkdir -p scripts",
"touch scripts/{args.name}.sh",
"chmod +x scripts/{args.name}.sh"
],
"cwd": "apps/frontend",
"parallel": false
}
}
```
By setting the `cwd` option, each command will run in the `apps/frontend` folder.
We run the above with:
```bash
<%= cli %> run frontend:create-script --args="--name=example"
```
or simply with:
```bash
<%= cli %> run frontend:create-script --name=example
```
##### Custom **done** conditions
Normally, `run-commands` considers the commands done when all of them have finished running. If you don't need to wait until they're all done, you can set a special string, that considers the command finished the moment the string appears in `stdout` or `stderr`:
```json
"finish-when-ready": {
"builder": "@nrwl/workspace:run-commands",
"options": {
"command": [
"echo 'READY' && sleep 5 && echo 'FINISHED'"
],
"readyWhen": "READY"
}
}
```
```bash
<%= cli %> run frontend:finish-when-ready
```
The above command will finish immediately, instead of waiting for 5 seconds.
##### Nx Affected
The true power of `run-commands` comes from the fact that it runs through `nx`, which knows about your dependency graph. So you can run **custom commands** only for the projects that have been affected by a change.
We can create some configurations to generate docs, and if run using `nx affected`, it will only generate documentation for the projects that have been changed:
```bash
nx affected --target=generate-docs
```
```json
//...
"frontend": {
"architect": {
//...
"generate-docs": {
"builder": "@nrwl/workspace:run-commands",
"options": {
"command": "npx compodoc -p apps/frontend/tsconfig.app.json"
}
}
}
},
"api": {
"architect": {
//...
"generate-docs": {
"builder": "@nrwl/workspace:run-commands",
"options": {
"command": "npx compodoc -p apps/api/tsconfig.app.json"
}
}
}
}
```