Монорепозиторий (monorepo) — это подход к организации кода, при котором несколько проектов хранятся в одном репозитории. Nx — это мощный набор инструментов для работы с монорепозиториями в экосистеме Angular и не только.
Типичная структура:
my-org/
├── apps/
│ ├── frontend/ # Angular приложение
│ └── backend/ # Node.js API
├── libs/
│ ├── ui/ # Общие UI компоненты
│ └── api-interfaces # Общие типы
├── tools/
└── nx.json # Конфигурация Nx
nx generate @nrwl/angular:app my-app # Новое Angular приложение
nx generate @nrwl/angular:lib shared-ui # Библиотека компонентов
Автоматическое определение зависимостей через project.json
:
{
"targets": {
"build": {
"dependsOn": ["^build"], # Сначала собирает зависимости
"inputs": ["{projectRoot}/**/*.ts"]
}
}
}
Nx запоминает, что уже было собрано:
nx affected:build --base=main --head=HEAD
nx graph
(Отображает граф зависимостей между проектами)
npx create-nx-workspace@latest my-workspace
cd my-workspace
nx add @nrwl/angular
nx g @nrwl/angular:app my-angular-app
// В библиотеке:
@Component({ selector: 'lib-button', ... })
export class ButtonComponent {}
// В приложении:
import { ButtonComponent } from '@my-org/shared/ui';
Каждая библиотека может быть:
Nx кэширует:
nx affected --target=build --parallel --maxParallel=3
Пример конфигурации:
- run: nx affected:build --base=last-successful-commit --head=HEAD
- run: nx affected:test --base=last-successful-commit --head=HEAD
- run: nx affected:lint --base=last-successful-commit --head=HEAD
apps/
├── app-shell/ # Хост-приложение
├── feature-checkout # Микрофронтенд
└── feature-profile # Микрофронтенд
apps/
├── web-client # Angular
└── api-server # Node/NestJS
libs/
└── shared-interfaces # Общие типы
libs/
├── ui/button
├── ui/input
└── ui/tables
npx nx@latest init
apps/
project.json
для каждогоlibs/