먼저 새 작업 공간을 만듭니다. 다음 명령을 사용하여 설정할 수 있습니다.
npx create-nx-workspace@latest myorg --preset=ts
파일 구조는 다음과 같아야 합니다:
myorg/
├── packages/
├── tools/
├── nx.json
├── package.json
├── README.md
└── tsconfig.base.json
Nx에는 스캐폴딩 애플리케이션에 도움이 되는 제너레이터가 함께 제공됩니다. 이 제네레이터를 실행하여 is-even이라는 이름의 새 라이브러리를 만듭니다:
npx nx generate @nx/js:library is-even --publishable --importPath @myorg/is-even
이 명령:
이제 다음과 같은 구조가 생겼을 것입니다:
packages/
└── is-even/
├── src/
| └── lib/
| | ├── is-even.spec.ts
| | ├── is-even.ts
| └── index.ts
├── project.json
├── package.json
├── ...
└── tsconfig.json
이 콘텐츠로 is-even.ts를 업데이트하세요:
// packages/is-even/src/lib/is-even.ts
export function isEven(x: number): boolean {
return x % 2 === 0;
}
Nx 플러그인은 프로젝트 수준의 project.json을 사용하여 특정 프로젝트에 대해 실행할 수 있는 사용 가능한 대상에 대한 메타데이터를 관리합니다. is-even에 대해 생성된 project.json에는 빌드, 게시, 린트 및 테스트 타겟이 포함됩니다:
// packages
{
"name": "is-even",
"targets": {
"build": {
/* ... */
},
"publish": {
/* ... */
},
"lint": {
/* ... */
},
"test": {
/* ... */
}
}
}
다양한 설정을 자세히 살펴보고 패키지 빌드, 게시, 린팅 또는 테스트에 사용되는 옵션을 미세 조정할 수 있습니다. low-level의 세부 사항은 플러그인이 처리합니다.
실행
병합 모노레포 스타일로 패키지를 로컬로 링크하는 작업은 tsconfig.base.json 파일의 TypeScript 경로 매핑을 활용하여 Nx에서 자동으로 처리합니다.
이를 설명하기 위해 다른 패키지 is-odd를 생성해 보겠습니다. 이를 위해 생성기를 다시 실행할 수 있습니다:
npx nx generate @nx/js:library is-odd --publishable --importPath @myorg/is-odd
이제 tsconfig.base.json에 두 개의 항목이 있다는 점에 유의하세요:
// tsconfig.base.json
{
"compileOnSave": false,
"compilerOptions": {
...
"paths": {
"@myorg/is-even": ["packages/is-even/src/index.ts"],
"@myorg/is-odd": ["packages/is-odd/src/index.ts"]
}
}
}
is-odd 패키지의 is-odd.ts 구현을 업데이트하여 @myorg/is-even 패키지에서 isEven을 가져오세요:
// packages/is-odd/src/lib/is-odd.ts
import { isEven } from '@myorg/is-even';
export function isOdd(x: number): boolean {
return !isEven(x);
}
이 작업만 완료하면 됩니다.
Typescript Paths
라이브러리가 생성되면 Nx는 tsconfig.base.json 파일에
새 Typescript 경로를 추가합니다. 에디터 내부에서 실행 중인
타입스크립트 서버 프로세스가 이러한 변경 사항을
인식하지 못하는 경우가 있으므로 가져오기 문에서 인라인 오류를 제거하려면
서버를 다시 시작해야 합니다. 이 작업은 VS 코드에서 타입스크립트 파일을 볼 때
명령 팔레트에서 완료될 수 있습니다. (Command-Shift-P)
"Typescript: Restart TS server"
모노레포에서는 패키지 간 종속성뿐만 아니라 태스크 간에도 종속성이 존재합니다.
예를 들어, is-odd를 빌드할 때마다 is-even이 미리 빌드되었는지 확인해야 합니다. Nx는 nx.json에 targetDefaults 속성을 추가하여 이러한 태스크 종속성을 정의할 수 있습니다.
병합 모노레포 스타일에서는 이미 제너레이터에서 이 작업을 처리하고 있습니다. 현재 nx.json 파일에는 이미 즉시 작동하는 기본값이 포함되어 있습니다:
// nx.json
{
...
"targetDefaults": {
"build": {
"dependsOn": ["^build"],
...
},
...
},
...
}
이렇게 하면 패키지 자체의 빌드 타겟이 실행되기 전에 모든 종속 프로젝트의 빌드 타겟을 먼저 실행하도록 Nx에 지시합니다.
작업 영역의 루트에서 기존 dist 폴더를 모두 제거하고 실행합니다:
npx nx build is-odd
그러면 자동으로 npx nx build is-even이 먼저 실행되므로 dist 폴더에 두 패키지가 모두 있어야 합니다. 이전에 is-even을 빌드한 적이 있는 경우 캐시에서 복원됩니다.
is-even 패키지를 빌드하려면 실행합니다:
npx nx build is-even
동일한 명령을 두 번 실행하면 빌드 캐시가 사용 중임을 확인할 수 있습니다:
npx nx build is-even
> nx run is-even:build
Compiling TypeScript files for project "is-even"...
Done compiling TypeScript files for project "is-even".
—————————————————————————————————————————————————————————————————————
> NX Successfully ran target build for project is-even (713ms)
워크스페이스의 모든 패키지에 대해 빌드 타겟을 실행하려면 다음 명령을 사용합니다:
npx nx run-many -t build
얻을 수 있는 것은 다음과 같습니다:
npx nx run-many -t build
✔ nx run is-even:build [existing outputs match the cache, left as is]
✔ nx run is-odd:build (906ms)
—————————————————————————————————————————————————————————————————
> NX Successfully ran target build for 2 projects (914ms)
Nx read the output from the cache instead of running the command for 1 out of 2 tasks.
is-even:build에서는 빌드를 실행하지 않고 이전에 빌드가 실행되었기 때문에 캐시에서 가져온다는 점에 유의하세요. run-many 명령을 다시 실행하면 모든 빌드가 캐시됩니다.
또한 다음 명령을 사용하여 변경된 패키지에 대해서만 작업을 실행할 수 있습니다.
npx nx affected -t build
Core Features
Mental Model
Adopting Nx
Integrated Repos vs Package-Based Repos
React Tutorial
Node.js Tutorial
Reference