146 lines
5.4 KiB
Markdown
146 lines
5.4 KiB
Markdown
# Node Tutorial - Part 3: Task-Running
|
|
|
|
Common tasks include:
|
|
|
|
- Building an application
|
|
- Serving an application locally for development purposes
|
|
- Running your unit tests
|
|
- Linting your code
|
|
|
|
When you ran your generators in Part 1, you already set up these more common tasks for each project.
|
|
|
|
## Defining Targets
|
|
|
|
Here's the `project.json` file for your `products-data-client` project:
|
|
|
|
```json {% fileName="libs/products-data-client/project.json" %}
|
|
{
|
|
"name": "products-data-client",
|
|
"$schema": "../../node_modules/nx/schemas/project-schema.json",
|
|
"sourceRoot": "libs/products-data-client/src",
|
|
"projectType": "library",
|
|
"targets": {
|
|
"build": {
|
|
"executor": "@nrwl/js:tsc",
|
|
"outputs": ["{options.outputPath}"],
|
|
"options": {
|
|
"outputPath": "dist/libs/products-data-client",
|
|
"main": "libs/products-data-client/src/index.ts",
|
|
"tsConfig": "libs/products-data-client/tsconfig.lib.json",
|
|
"assets": ["libs/products-data-client/*.md"]
|
|
}
|
|
},
|
|
"lint": {
|
|
"executor": "@nrwl/linter:eslint",
|
|
"outputs": ["{options.outputFile}"],
|
|
"options": {
|
|
"lintFilePatterns": ["libs/products-data-client/**/*.ts"]
|
|
}
|
|
},
|
|
"test": {
|
|
"executor": "@nrwl/jest:jest",
|
|
"outputs": ["{workspaceRoot}/coverage/libs/products-data-client"],
|
|
"options": {
|
|
"jestConfig": "libs/products-data-client/jest.config.ts",
|
|
"passWithNoTests": true
|
|
}
|
|
}
|
|
},
|
|
"tags": []
|
|
}
|
|
```
|
|
|
|
You can see that three targets are defined here: `build`, `lint` and `test`.
|
|
|
|
The properties inside each of these these targets is defined as follows:
|
|
|
|
- `executor` - which Nx executor to run. The syntax here is: `<plugin name>:<executor name>`
|
|
- `outputs` - this is an array of files that would be created by running this target. (This informs Nx on what to save for it's caching mechanisms you'll learn about in [4 - Workspace Optimizations](/node-tutorial/4-workspace-optimization)).
|
|
- `options` - this is an object defining which executor options to use for the given target. Every Nx executor allows for options as a way to parameterize it's functionality.
|
|
|
|
## Running Tasks
|
|
|
|

|
|
|
|
Run the `build` target for your `products-data-client` project:
|
|
|
|
```{% command="npx nx build products-data-client" path="~/my-products" %}
|
|
|
|
> nx run products-data-client:build
|
|
|
|
Compiling TypeScript files for project "products-data-client"...
|
|
Done compiling TypeScript files for project "products-data-client".
|
|
|
|
———————————————————————————————————————————————————————————————————————————————————————————————
|
|
|
|
> NX Successfully ran target build for project products-data-client (780ms)
|
|
```
|
|
|
|
You can now find your built `products-data-client` distributable in your `dist/libs/products-data-client` directory, as specified in the `outputPath` property of the `build` target options in your `project.json` file.
|
|
|
|
Next, run a lint check on `products-data-client`:
|
|
|
|
```{% command="npx nx lint products-data-client" path="~/my-products" %}
|
|
|
|
> nx run products-data-client:lint
|
|
|
|
|
|
Linting "products-data-client"...
|
|
|
|
All files pass linting.
|
|
|
|
|
|
———————————————————————————————————————————————————————————————————————————————————————————————
|
|
|
|
> NX Successfully ran target lint for project products-data-client (777ms)
|
|
```
|
|
|
|
Next, add some tests to your data client in the `products-data-client.spec.ts` file:
|
|
|
|
```typescript {% fileName="libs/products-data-client/src/lib/products-data-client.spec.ts" %}
|
|
import {
|
|
createProductsDataClient,
|
|
exampleProducts,
|
|
} from './products-data-client';
|
|
|
|
describe('productsDataClient', () => {
|
|
it('should get all example products', async () => {
|
|
const productsDataClient = createProductsDataClient();
|
|
const products = await productsDataClient.getProducts();
|
|
expect(products).toEqual(Object.values(exampleProducts));
|
|
});
|
|
|
|
it('should get example product by id', async () => {
|
|
const productsDataClient = createProductsDataClient();
|
|
const product = await productsDataClient.getProductById('1');
|
|
expect(product).toEqual(exampleProducts['1']);
|
|
});
|
|
});
|
|
```
|
|
|
|
And then run your `test` target:
|
|
|
|
```{% command="npx nx test products-data-client" path="~/my-products" %}
|
|
|
|
> nx run products-data-client:test
|
|
|
|
PASS products-data-client libs/products-data-client/src/lib/products-data-client.spec.ts
|
|
productsDataClient
|
|
✓ should get all example products (1 ms)
|
|
✓ should get example product by id
|
|
|
|
Test Suites: 1 passed, 1 total
|
|
Tests: 2 passed, 2 total
|
|
Snapshots: 0 total
|
|
Time: 0.843 s
|
|
Ran all test suites.
|
|
|
|
———————————————————————————————————————————————————————————————————————————————————————————————
|
|
|
|
> NX Successfully ran target test for project products-data-client (2s)
|
|
```
|
|
|
|
## What's Next
|
|
|
|
- Continue to [4: Workspace Optimization](/node-tutorial/4-workspace-optimization)
|