CLI11 min read

Workspace'lar

Nest kodni tashkil qilishning ikki rejimini qo'llab-quvvatlaydi:

Nest kodni tashkil qilishning ikki rejimini qo'llab-quvvatlaydi:

  • standart rejim: o'z dependency'lari va sozlamalari bo'lgan, modul ulashishni yoki murakkab buildlarni optimallashtirishni talab qilmaydigan alohida, loyiha markazli ilovalarni qurish uchun foydali. Bu default rejim.
  • monorepo rejimi: bu rejim kod artefaktlarini yengil monoreponing bir qismi sifatida ko'radi va developer jamoalari va/yoki ko'p loyiha muhitlari uchun ko'proq mos bo'lishi mumkin. U build jarayonining ayrim qismlarini avtomatlashtirib, modulli komponentlarni yaratish va kompozitsiya qilishni osonlashtiradi, koddan qayta foydalanishni rag'batlantiradi, integratsion testlarni yengillashtiradi, eslint qoidalari va boshqa konfiguratsiya siyosatlari kabi loyiha darajasidagi artefaktlarni ulashishni oson qiladi va Git submodullari kabi alternativalarga qaraganda foydalanishga oson. Monorepo rejimi nest-cli.json faylida ko'rsatilgan workspace tushunchasidan foydalanib, monorepo komponentlari o'rtasidagi munosabatlarni muvofiqlashtiradi.

Shuni ta'kidlash kerakki, Nestning deyarli barcha imkoniyatlari kodni tashkil qilish rejimidan mustaqil. Bu tanlovning yagona ta'siri - loyihalaringiz qanday kompozitsiya qilinishi va build artefaktlari qanday generatsiya qilinishidir. CLI dan tortib core modullargacha va add-on modullargacha bo'lgan boshqa barcha funksionalliklar har ikki rejimda ham bir xil ishlaydi.

Shuningdek, siz istalgan vaqtda standart rejimdan monorepo rejimiga oson o'tishingiz mumkin, shuning uchun qaysi yondashuvning foydasi ko'proq ekanligi aniq bo'lguncha bu qarorni kechiktirishingiz mumkin.

Standart rejim

nest newni ishga tushirganda, built-in schematic yordamida yangi project yaratiladi. Nest quyidagilarni bajaradi:

  1. nest newga bergan name argumentiga mos yangi papka yaratadi
  2. Shu papkani minimal darajadagi Nest ilovaga mos default fayllar bilan to'ldiradi. Bu fayllarni typescript-starter repozitoriyasida ko'rishingiz mumkin.
  3. Ilovangizni kompilyatsiya qilish, test qilish va servis qilish uchun turli vositalarni sozlaydigan nest-cli.json, package.json va tsconfig.json kabi qo'shimcha fayllarni taqdim etadi.

Shundan so'ng siz starter fayllarini o'zgartirishingiz, yangi komponentlar qo'shishingiz, dependency'larni qo'shishingiz (masalan, npm install) va ilovangizni ushbu hujjatlarning qolgan qismida tasvirlanganidek rivojlantirishingiz mumkin.

Monorepo rejimi

Monorepo rejimini yoqish uchun standart rejim tuzilmasidan boshlaysiz va projects qo'shasiz. Loyiha to'liq application bo'lishi mumkin ( nest generate app buyrug'i bilan workspace'ga qo'shiladi) yoki library bo'lishi mumkin ( nest generate library buyrug'i bilan workspace'ga qo'shiladi). Bu turdagi loyiha komponentlari tafsilotlarini quyida muhokama qilamiz. Hozir e'tibor qaratiladigan asosiy nuqta shuki, mavjud standart rejim tuzilmasiga loyiha qo'shishning o'zi uni monorepo rejimiga aylantiradi. Keling, misol ko'raylik.

Agar biz quyidagini ishga tushirsak:

Terminal
1$ nest new my-project

Biz standart rejim tuzilmasini yaratamiz, u quyidagicha ko'rinadi:

node_modules
src
app.controller.ts
app.module.ts
app.service.ts
main.ts
nest-cli.json
package.json
tsconfig.json
eslint.config.mjs

Buni quyidagicha monorepo rejimiga o'tkazishimiz mumkin:

Terminal
1$ cd my-project
2$ nest generate app my-app

Shu paytda nest mavjud tuzilmani monorepo rejimi tuzilmasiga aylantiradi. Bu bir nechta muhim o'zgarishlarga olib keladi. Papkalar tuzilmasi endi quyidagicha bo'ladi:

apps
my-app
src
app.controller.ts
app.module.ts
app.service.ts
main.ts
tsconfig.app.json
my-project
src
app.controller.ts
app.module.ts
app.service.ts
main.ts
tsconfig.app.json
nest-cli.json
package.json
tsconfig.json
eslint.config.mjs

generate app schematic kodingizni qayta tashkil qiladi - har bir application loyihasini apps papkasi ostiga ko'chiradi va har bir loyihaning root papkasiga loyiha uchun maxsus tsconfig.app.json faylini qo'shadi. Bizning original my-project ilovamiz monoreponing default loyihasiga aylanadi va endi apps papkasi ostida joylashgan yangi my-app bilan tengdosh bo'ladi. Default loyihalar haqida quyida to'xtalamiz.

Warning

Standart rejim tuzilmasini monorepoga aylantirish faqat kanonik Nest loyiha tuzilmasiga rioya qilgan loyihalarda ishlaydi. Xususan, konvertatsiya paytida schematic src va test papkalarini loyiha papkasidan rootdagi apps papkasi ostiga ko'chirishga urinadi. Agar loyiha bu tuzilmani ishlatmasa, konvertatsiya muvaffaqiyatsiz bo'lishi yoki ishonchsiz natija berishi mumkin.

Workspace loyihalari

Monorepo o'z a'zolarini boshqarish uchun workspace tushunchasidan foydalanadi. Workspace'lar projectsdan tashkil topadi. Loyiha quyidagilardan biri bo'lishi mumkin:

  • application: main.ts fayli orqali ilovani bootstrap qiladigan to'liq Nest ilova. Kompilyatsiya va build masalalaridan tashqari, workspace ichidagi application turidagi loyiha standart rejim tuzilmasidagi ilova bilan funksional jihatdan bir xil.
  • library: umumiy maqsadli funksiyalar to'plamini (modullar, providerlar, controllerlar va h.k.) paketlash usuli bo'lib, boshqa loyihalarda foydalaniladi. Kutubxona o'zicha ishlay olmaydi va main.ts fayliga ega emas. Batafsil hereda o'qing.

Barcha workspace'larda default loyiha bo'ladi (bu application turidagi loyiha bo'lishi kerak). Bu nest-cli.json faylidagi yuqori darajadagi "root" propertysi bilan aniqlanadi va u default loyiha rootiga ishora qiladi (batafsil ma'lumot uchun CLI properties bo'limiga qarang). Odatda bu siz boshlagan standart rejim ilovasi bo'ladi va keyin nest generate app yordamida monorepoga aylantiriladi. Bu qadamlarni bajarganingizda, ushbu property avtomatik to'ldiriladi.

Default loyihalar nest build va nest start kabi nest buyruqlarida loyiha nomi berilmaganda ishlatiladi.

Masalan, yuqoridagi monorepo tuzilmasida

Terminal
1$ nest start

my-project ilovasini ishga tushiradi. my-appni ishga tushirish uchun quyidagini ishlatamiz:

Terminal
1$ nest start my-app

Ilovalar

Application turidagi loyihalar, yoki oddiy qilib "ilovalar", ishga tushirish va deploy qilish mumkin bo'lgan to'liq Nest ilovalardir. Application turidagi loyiha nest generate app bilan generatsiya qilinadi.

Bu buyruq typescript starterdagi standart src va test papkalarini o'z ichiga olgan loyiha skeletini avtomatik generatsiya qiladi. Standart rejimdan farqli ravishda, monorepodagi application loyihasida package.json kabi package dependency artefaktlari yoki .prettierrc va eslint.config.mjs kabi loyiha konfiguratsiya fayllari bo'lmaydi. Ularning o'rniga monorepo darajasidagi dependency va config fayllari ishlatiladi.

Biroq schematic loyiha root papkasida loyiha uchun maxsus tsconfig.app.json faylini generatsiya qiladi. Bu config fayl avtomatik ravishda mos build opsiyalarini o'rnatadi, jumladan kompilyatsiya output papkasini to'g'ri belgilaydi. Fayl yuqori darajadagi (monorepo) tsconfig.json faylini kengaytiradi, shuning uchun global sozlamalarni monorepo bo'ylab boshqarib, zarur bo'lsa ularni loyiha darajasida override qilishingiz mumkin.

Kutubxonalar

Aytilganidek, kutubxona turidagi loyihalar yoki oddiy qilib "kutubxonalar" - bu ilovalarga kompozitsiya qilib ishlatiladigan Nest komponentlari paketlari. Kutubxona turidagi loyiha nest generate library bilan generatsiya qilinadi. Nimalar kutubxonaga kirishini aniqlash - arxitektura dizayni qarori. Kutubxonalarni libraries bobida batafsil muhokama qilamiz.

CLI properties

Nest standard va monorepo tuzilmasidagi loyihalarni tashkil qilish, build va deploy qilish uchun kerakli metadatani nest-cli.json faylida saqlaydi. Siz loyihalar qo'shganingizda Nest bu faylga avtomatik qo'shadi va yangilaydi, shuning uchun odatda siz uni o'zgartirish yoki tahrirlash haqida o'ylamasangiz ham bo'ladi. Biroq, qo'lda o'zgartirmoqchi bo'lgan ayrim sozlamalar bo'lishi mumkin, shuning uchun faylni umumiy darajada tushunish foydali.

Yuqoridagi qadamlar orqali monorepo yaratganimizdan so'ng nest-cli.json quyidagicha ko'rinadi:

JavaScript
1{
2  "collection": "@nestjs/schematics",
3  "sourceRoot": "apps/my-project/src",
4  "monorepo": true,
5  "root": "apps/my-project",
6  "compilerOptions": {
7    "webpack": true,
8    "tsConfigPath": "apps/my-project/tsconfig.app.json"
9  },
10  "projects": {
11    "my-project": {
12      "type": "application",
13      "root": "apps/my-project",
14      "entryFile": "main",
15      "sourceRoot": "apps/my-project/src",
16      "compilerOptions": {
17        "tsConfigPath": "apps/my-project/tsconfig.app.json"
18      }
19    },
20    "my-app": {
21      "type": "application",
22      "root": "apps/my-app",
23      "entryFile": "main",
24      "sourceRoot": "apps/my-app/src",
25      "compilerOptions": {
26        "tsConfigPath": "apps/my-app/tsconfig.app.json"
27      }
28    }
29  }
30}

Fayl quyidagi bo'limlardan iborat:

  • standard va monorepo darajasidagi sozlamalarni boshqaruvchi yuqori darajadagi global bo'lim
  • har bir loyiha haqida metadataga ega bo'lgan yuqori darajadagi "projects" propertysi. Bu bo'lim faqat monorepo rejimdagi tuzilmada mavjud.

Yuqori darajadagi propertylar quyidagilar:

  • "collection": komponentlarni generatsiya qilish uchun ishlatiladigan schematics collectionga ishora qiladi; odatda bu qiymatni o'zgartirmasligingiz kerak
  • "sourceRoot": standart rejimdagi yagona loyiha source code rootiga yoki monorepo rejimdagi default loyiha rootiga ishora qiladi
  • "compilerOptions": kompilyator opsiyalarini ko'rsatadigan key-value map; tafsilotlar quyida
  • "generateOptions": global generate opsiyalarini ko'rsatadigan key-value map; tafsilotlar quyida
  • "monorepo": (faqat monorepo) monorepo rejim tuzilmasi uchun bu qiymat doimo true
  • "root": (faqat monorepo) default loyiha project rootiga ishora qiladi

Global kompilyator opsiyalari

Bu propertylar nest build yoki nest startning bir qismi bo'lgan istalgan kompilyatsiya bosqichiga ta'sir qiladigan kompilyator va turli opsiyalarni belgilaydi, va tsc yoki webpack kabi kompilyatorga bog'liq bo'lmaydi.

Property nomiProperty qiymati turiTavsif
webpackbooleantrue bo'lsa webpack compiler ishlatiladi. false bo'lsa yoki yo'q bo'lsa tsc ishlatiladi. Monorepo rejimida default true (webpack), standart rejimda default false (tsc). Batafsil ma'lumot quyida. (deprecated: o'rniga builderdan foydalaning)
tsConfigPathstring(faqat monorepo) nest build yoki nest start project opsiyasisiz chaqirilganda foydalaniladigan tsconfig.json sozlamalari fayliga ishora qiladi (masalan, default loyiha build yoki start qilinganda).
webpackConfigPathstringWebpack opsiya fayliga ishora qiladi. Ko'rsatilmagan bo'lsa, Nest webpack.config.js faylini qidiradi. Batafsil ma'lumot uchun quyiga qarang.
deleteOutDirbooleantrue bo'lsa, kompilyator chaqirilganida avval kompilyatsiya output direktoriyasini o'chiradi (tsconfig.jsonda sozlangan, default ./dist).
assetsarrayHar bir kompilyatsiya bosqichi boshlanganda non-TypeScript assetsni avtomatik tarqatishni yoqadi (asset tarqatish --watch rejimidagi incremental compile'larda bo'lib o'tmaydi). Batafsil ma'lumot uchun quyiga qarang.
watchAssetsbooleantrue bo'lsa, barcha non-TypeScript assetslarni kuzatgan holda watch rejimida ishlaydi. (Assetsni yanada nozik boshqarish uchun quyidagi Assets bo'limiga qarang).
manualRestartbooleantrue bo'lsa, serverni qo'lda qayta ishga tushirish uchun rs shortcutini yoqadi. Default qiymat false.
builderstring/objectLoyiha kompilyatsiyasi uchun qaysi builder ishlatilishini ko'rsatadi (tsc, swc, yoki webpack). Builder xatti-harakatini moslashtirish uchun type (tsc, swc, yoki webpack) va optionsdan iborat obyekt berishingiz mumkin.
typeCheckbooleantrue bo'lsa, SWC ishlatiladigan loyihalarda type checkingni yoqadi (builder swc bo'lganda). Default qiymat false.

Global generate opsiyalari

Bu propertylar nest generate buyrug'i uchun default generate opsiyalarini belgilaydi.

Property nomiProperty qiymati turiTavsif
specboolean or objectAgar qiymat boolean bo'lsa, true bo'lganda spec generatsiyasi default yoqiladi, false bo'lganda o'chiriladi. CLI buyruq qatorida berilgan flag bu sozlamani override qiladi, xuddi loyiha darajasidagi generateOptions ham (quyida). Agar qiymat obyekt bo'lsa, har bir key schematic nomini bildiradi va boolean qiymat o'sha schematic uchun spec generatsiyasi yoqilgan/yo'qligini belgilaydi.
flatbooleanTrue bo'lsa, barcha generate buyruqlari flat tuzilma generatsiya qiladi

Quyidagi misolda spec fayllarini generatsiya qilish default bo'yicha barcha loyihalar uchun o'chirilgan bo'ladi:

JavaScript
1{
2  "generateOptions": {
3    "spec": false
4  },
5  ...
6}

Quyidagi misolda flat fayl generatsiyasi default bo'ladi:

JavaScript
1{
2  "generateOptions": {
3    "flat": true
4  },
5  ...
6}

Quyidagi misolda spec fayl generatsiyasi faqat service schematicsi uchun o'chirilgan (masalan, nest generate service...):

JavaScript
1{
2  "generateOptions": {
3    "spec": {
4      "service": false
5    }
6  },
7  ...
8}
Warning

spec obyekt sifatida berilganda, generation schematics uchun key hozircha avtomatik alias handlingni qo'llab-quvvatlamaydi. Bu service: false deb yozib, s aliasi orqali service generatsiya qilsangiz ham spec generatsiya qilinishini anglatadi. Oddiy schematic nomi ham, alias ham to'g'ri ishlashi uchun quyidagi kabi ikkisini ham ko'rsating.

{ "generateOptions": { "spec": { "service": false, "s": false } }, ... }

Loyiha darajasidagi generate opsiyalari

Global generate opsiyalariga qo'shimcha ravishda, loyiha darajasidagi generate opsiyalarini ham ko'rsatishingiz mumkin. Loyiha darajasidagi generate opsiyalari global generate opsiyalaridagi formatning aynan o'zidir, ammo har bir loyiha ichida ko'rsatiladi.

Loyiha darajasidagi generate opsiyalari global generate opsiyalarini override qiladi.

JavaScript
1{
2  "projects": {
3    "cats-project": {
4      "generateOptions": {
5        "spec": {
6          "service": false
7        }
8      },
9      ...
10    }
11  },
12  ...
13}
Warning

Generate opsiyalari uchun ustuvorlik tartibi quyidagicha: CLI buyruq qatorida ko'rsatilgan opsiyalar loyiha darajasidagi opsiyalardan ustun. Loyiha darajasidagi opsiyalar global opsiyalarni override qiladi.

Belgilangan kompilyator

Turli default kompilyatorlarning sababi shundaki, kattaroq loyihalarda (masalan, monorepolarda) webpack build vaqtlarida va barcha loyiha komponentlarini bitta faylga yig'ishda sezilarli ustunlikka ega bo'lishi mumkin. Agar alohida fayllarni generatsiya qilishni xohlasangiz, "webpack"ni falsega o'rnating, bu build jarayonini tsc (yoki swc)dan foydalanishga majbur qiladi.

Webpack opsiyalari

Webpack opsiya fayli standart webpack configuration optionsni o'z ichiga olishi mumkin. Masalan, node_modulesni bundlega qo'shish uchun (default bo'yicha ular tashqarida) webpack.config.jsga quyidagini qo'shing:

JavaScript
1module.exports = {
2  externals: [],
3};

Webpack config fayli JavaScript fayl bo'lgani uchun, default opsiyalarni qabul qilib, o'zgartirilgan obyektni qaytaradigan funksiya ham taqdim etishingiz mumkin:

JavaScript
1module.exports = function (options) {
2  return {
3    ...options,
4    externals: [],
5  };
6};

Assets

TypeScript kompilyatsiyasi kompilyator outputini (.js va .d.ts fayllari) ko'rsatilgan output direktoriyasiga avtomatik tarqatadi. Shuningdek, .graphql fayllar, images, .html fayllar va boshqa assetlar kabi non-TypeScript fayllarni tarqatish ham qulay bo'lishi mumkin. Bu nest buildni (va istalgan initial compilation bosqichini) yengil development build bosqichi sifatida ko'rishga imkon beradi, bunda siz non-TypeScript fayllarni tahrirlab, iterativ ravishda kompilyatsiya va test qilishingiz mumkin. Assets src papkasida joylashgan bo'lishi kerak, aks holda ular ko'chirilmaydi.

assets kalitining qiymati tarqatiladigan fayllarni ko'rsatuvchi elementlar massividir. Elementlar glob-ga o'xshash fayl spetsifikatsiyalari bo'lgan oddiy stringlar bo'lishi mumkin, masalan:

TypeScript
1"assets": ["**/*.graphql"],
2"watchAssets": true,

Yanada nozik nazorat uchun elementlar quyidagi kalitlarga ega obyekt bo'lishi mumkin:

  • "include": tarqatiladigan assetlar uchun glob-ga o'xshash fayl spetsifikatsiyalari
  • "exclude": include ro'yxatidan chiqarib tashlanadigan assetlar uchun glob-ga o'xshash fayl spetsifikatsiyalari
  • "outDir": assetlar tarqatiladigan path (root papkaga nisbatan)ni ko'rsatuvchi string. Default bo'yicha kompilyator outputi sozlangan direktoriyaga teng.
  • "watchAssets": boolean; true bo'lsa, ko'rsatilgan assetlarni watch rejimida kuzatadi

Masalan:

TypeScript
1"assets": [
2  { "include": "**/*.graphql", "exclude": "**/omitted.graphql", "watchAssets": true },
3]
Warning

Yuqori darajadagi compilerOptions propertysida watchAssetsni o'rnatish assets propertysi ichidagi watchAssets sozlamalarini override qiladi.

Loyiha propertylari

Bu element faqat monorepo rejimidagi tuzilmalar uchun mavjud. Odatda bu propertylarni tahrirlashingiz kerak emas, chunki Nest monorepo ichida loyihalarni va ularning konfiguratsiya opsiyalarini topish uchun ulardan foydalanadi.