IlmHamroh
JavaScript Full-stack/16-qism. Frontend asboblari: npm, bundlerlar, config13/48-dars14 daqiqa
Mundarija (20)

pnpm: tez va qat'iy paket menejeri — store, symlinklar, workspace va allowBuilds

Qisqacha: pnpm har paket faylini kompyuterda bir marta — umumiy omborda (store) saqlaydi. Loyihalarga esa qattiq havola (hard link) qiladi. Ildizdagi node_modules da faqat siz e'lon qilgan paketlar turadi, qolganlari node_modules/.pnpm ichida symlinklar bilan ulanadi — shuning uchun fantom bog'liqlik ishlamaydi. pnpm 12 paketlarning o'rnatish skriptlarini (postinstall) sukut bo'yicha bloklaydi: ruxsat allowBuilds bilan beriladi. Monorepo uchun — pnpm-workspace.yaml va versiyalar katalogi (catalog:).

Bu darsda

  • pnpm node_modules ni qanday qurishini ko'rasiz: store, .pnpm, symlink va hard link.
  • vazifalar nusxasini pnpm import bilan pnpm'ga o'tkazib, npm bilan o'lchab solishtirasiz.
  • Fantom bog'liqlik pnpm'da nega ishlamasligini va shamefullyHoist ni bilasiz.
  • pnpm add, why, dlx, approve-builds va allowBuilds bilan ishlaysiz.
  • pnpm-workspace.yaml, workspace:* va catalog: bilan kichik monorepo quriladi.

Oldin bilishingiz kerak: node_modules ichida, Lock-fayllar va npm ci, .npmrc va registry sozlamalari.

1. Nega bu kerak?

Sardorning kompyuterida o'nta loyiha bor, har birida ESLint, Prettier, TypeScript. Masalan, vazifalar ning node_modules i — 86 MB, o'n loyiha — taxminan bir gigabayt, ichida bir xil fayllar o'n martadan. Node_modules ichida darsida yana bir muammo ko'rdik: ms e'lon qilinmagan, lekin ishlaydi (fantom bog'liqlik).

pnpm ("performant npm") — ikkala muammoni boshqa tuzilma bilan hal qiladigan paket menejeri. Vue, Vite va boshqa ko'p ochiq loyihalarning repolari pnpm'da. Bugun uni o'rnatmasdan (global o'rnatishsiz) sinab, raqamlar bilan solishtiramiz. vazifalar kanoni npm'da qoladi — bu dars tajriba.

Maslahat: Chiqishlar 2026-10-10 da Windows 11, Node 24.21.0 va pnpm 12.10.1 bilan olingan (2026-10-06 da chiqqan; npm view pnpm dist-tags da latest). Biz pnpm'ni global o'rnatmadik: darsdagi pnpm — npx -y pnpm@12.10.1 ning qisqa nomi (Git Bash funksiyasi pnpm() { npx -y pnpm@12.10.1 "$@"; }). Doimiy o'rnatish yo'llari — rasmiy hujjatda (pnpm.io/installation): npm i -g pnpm, Corepack yoki mustaqil o'rnatuvchi. Ombor (store) ham sinov papkasiga yo'naltirilgan, shuning uchun yo'llar …\xdg-data\pnpm\store ko'rinishida.

2. pnpm qanday quradi

2.1 vazifalar ni pnpm'ga o'tkazish

kurs/mashqlar/16/13-pnpm/ ga vazifalar ning nusxasini oling (asl loyihaga tegmang). pnpm import — package-lock.json dan o'sha versiyalar bilan pnpm-lock.yaml yasaydi:

bash
pnpm import
text
Done in 7.5s using pnpm v12.10.1

Yangi lock boshi:

text
lockfileVersion: '9.0'

settings:
  autoInstallPeers: true
  excludeLinksFromLockfile: false

importers:

  .:
    devDependencies:
      '@eslint/js':
        specifier: 10.0.1
        version: 10.0.1(eslint@10.12.0)
…

YAML formati (lock-fayllar darsidagi jadval). specifier — package.json dagi yozuv, version — aniq versiya. 10.0.1(eslint@10.12.0) — paket qaysi peer bilan birga o'rnatilgani. Endi package-lock.json ni o'chiring — loyihada bitta lock-fayl bo'lsin. O'rnatish (--frozen-lockfile — npm ci ning pnpm'dagi o'xshashi):

bash
pnpm install --frozen-lockfile
text
✓ Lockfile passes supply-chain policies (verified 5s ago)
Lockfile is up to date, resolution step is skipped
Progress: resolved 102, reused 0, downloaded 14, added 0
Packages are hard linked from the content-addressable store to the virtual store.
  Content-addressable store is at: …\xdg-data\pnpm\store\v11
  Virtual store is at:             node_modules/.pnpm
…
Packages: +102
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Progress: resolved 102, reused 0, downloaded 102, added 102, done

devDependencies:
+ @eslint/js 10.0.1
+ @typescript/native <- typescript 7.0.2
+ eslint 10.12.0
+ globals 17.13.0
+ prettier 3.9.9
+ typescript <- @typescript/typescript6 6.0.2
+ typescript-eslint 8.71.1
+ web-vitals 6.2.3

Done in 18.3s using pnpm v12.10.1

(Yuklab olish qatorlari qisqartirildi.) Xuddi npm'dagidek 102 paket. Ikki muhim qator: "Paketlar content-addressable store dan virtual store ga qattiq havola qilindi". Birinchi qatordagi tekshiruv — pnpm 12 ning lock-faylni ta'minot zanjiri qoidalariga solishtirishi (Ta'minot zanjiri xavfsizligi).

2.2 Uch qavat

flowchart LR
  S["store (bitta, umumiy)<br/>fayllar mazmun hash'i bilan"] -- "hard link" --> V["node_modules/.pnpm<br/>eslint@10.12.0/…"]
  V -- "symlink" --> R["node_modules/eslint"]
  V -- "symlink" --> D["…/.pnpm/eslint@10.12.0/<br/>node_modules/debug"]

Content-addressable store (mazmun bo'yicha manzillangan ombor) — har fayl o'z mazmunining hash'i nomi bilan saqlanadi (lock-fayllar darsidagi integrity g'oyasi). Bir xil fayl ikkinchi marta saqlanmaydi.

Hard link (qattiq havola) — diskdagi bitta faylning ikkinchi nomi: nusxa emas, joy egallamaydi. Symlink (ramziy havola) — "u yoqda turibdi" degan ko'rsatkich, kirish nuqtalari darsidagi file: o'rnatishda ko'rgansiz.

Ildizdagi node_modules:

bash
ls -a node_modules
text
.
..
.bin
.modules.yaml
.pnpm
.pnpm-workspace-state-v1.json
@eslint
@typescript
eslint
globals
prettier
typescript
typescript-eslint
web-vitals

Faqat package.json dagi 8 ta paket (va ularning scope papkalari)! npm'da bu yerda 75 ta papka edi. Ular — havolalar:

text
eslint -> .pnpm/eslint@10.12.0/node_modules/eslint

.pnpm ichida esa 104 ta papka — har paket versiyasi uchun bittadan. Har birining o'z node_modules i bor, unda faqat o'sha paket e'lon qilgan bog'liqliklar (havola sifatida). Shuning uchun eslint o'z debug ini topadi — Node qidiruvi .pnpm/eslint@10.12.0/node_modules/ dan boshlanadi.

Ikkinchi loyiha (ikkinchi/) — o'sha package.json va lock bilan:

text
Progress: resolved 102, reused 102, downloaded 0, added 102, done
…
Done in 1.7s using pnpm v12.10.1

reused 102, downloaded 0 — hammasi omborda bor edi. Windows'ning fsutil hardlink list buyrug'i bitta faylning hamma nomlarini ko'rsatadi (Prettier'ning package.json i):

text
…\kurs\mashqlar\16\13-pnpm\ikkinchi\node_modules\.pnpm\prettier@3.9.9\node_modules\prettier\package.json
…\kurs\mashqlar\16\13-pnpm\vazifalar\node_modules\.pnpm\prettier@3.9.9\node_modules\prettier\package.json
…\xdg-data\pnpm\store\v11\files\c4\739a7f7a3d…(hash davomi)

Bitta fayl, uch nom: ikki loyiha va ombor. Diskda u bir marta turadi.

Tekshirib ko'ring: pnpm loyihasida node_modules ni o'chirdingiz. Ombordagi fayllar ham o'chadimi?

Javob

Yo'q. Hard link — faylning bir nomi; nomlardan birini o'chirsangiz, qolganlari (ombordagi) qoladi. Shuning uchun keyingi pnpm install yana reused bilan bir zumda tugaydi. Ishlatilmayotgan ombor fayllarini tozalash — pnpm store prune.

3. O'lchov: npm va pnpm

vazifalar (102 paket), har buyruq 5 marta, kesh/ombor to'la (pnpm npx siz, to'g'ridan-to'g'ri node …/pnpm.mjs bilan — npx ning ishga tushish vaqti qo'shilmasin):

vazifalar: o'rnatish vaqti (5 o'lchov medianasi)
  • npm ci (noldan)6,2 s
  • pnpm install, node_modules yo'q1,1 s
  • pnpm install, node_modules bor0,28 s

Manba: O'lchov: Windows 11, Intel Core i5-12500H, 16 GB, Node 24.21.0, npm 11.19.0, pnpm 12.10.1, 2026-10-10

Xom raqamlar (ms): npm ci — 4333, 5495, 6825, 6950, 6192; pnpm, node_modules yo'q — 1155, 1096, 1092, 1108, 1070; pnpm, node_modules bor — 291, 286, 280, 232, 236. Bizning mashinada pnpm noldan o'rnatishda taxminan 5.6 baravar tez (6.2 s / 1.1 s). Lock-fayllar darsidagi alohida o'lchovda npm ci medianasi 6.4 s chiqqan. Mashina o'sha, lekin kun va yuk boshqa. Shuning uchun bitta o'lchovga emas, medianaga qaraymiz. Sabab: fayllar yuklanmaydi va nusxalanmaydi, faqat havola qilinadi. Birinchi o'rnatish (ombor bo'sh) esa ikkalasida ham tarmoqqa bog'liq — bizda pnpm 18.3 s (sekin internet ogohlantirishlari bilan).

Disk: npm'ning node_modules i 86 MB. pnpm'da du bir loyihaga 84 MB ko'rsatadi. Lekin ikki pnpm loyihasi va ombor birgalikda — 99 MB, chunki hard link bir marta sanaladi. Ikki npm loyihasi esa 172 MB.

4. Qat'iylik: fantom bog'liqlik yo'q

Node_modules ichida darsidagi tajriba, endi pnpm loyihasida:

bash
node --input-type=module \
  -e "import ms from 'ms'; console.log(ms('1d'))"
text
Error [ERR_MODULE_NOT_FOUND]: Cannot find package 'ms' imported from …\kurs\mashqlar\16\13-pnpm\vazifalar\[eval1]

npm'da bu 86400000 chiqargan edi. pnpm'da ildizda ms yo'q — u faqat debug ning ichida. Fantom bog'liqlik o'rnatish paytida emas, birinchi ishga tushirishda ochiladi — bu pnpm'ning eng katta foydasi. vazifalar ning o'zi esa toza: pnpm test — ℹ tests 143, ℹ pass 143, pnpm lint va pnpm run tip — xatosiz. Demak vazifalar hech qanday arvohga tayanmaydi.

ms ni kim olib kelgan — npm ls ning pnpm'dagi o'xshashi:

bash
pnpm why ms
text
ms@2.1.3
└─┬ debug@4.4.3
  ├─┬ @eslint/config-array@0.23.5
  │ └─┬ eslint@10.12.0
…
Found 1 version of ms

(Daraxt qisqartirildi.) Pastdan yuqoriga o'qiladi: ms ← debug ← … ← vazifalar.

Ba'zi eski asboblar fantomlarga tayanadi va pnpm'da sinadi. Vaqtinchalik chora — pnpm-workspace.yaml da shamefullyHoist: true ("uyalmasdan ko'tar"): pnpm npm kabi hammasini ildizga chiqaradi. Sinovda shundan keyin ms yana ishladi va ildizda 75 ta papka paydo bo'ldi. Nomi bejiz shunday emas — bu chekinish, yechim emas.

5. Kundalik buyruqlar

npm pnpm Izoh
npm install pnpm install (pnpm i)
npm ci pnpm install --frozen-lockfile CI'da pnpm buni o'zi yoqadi
npm i nom / -D pnpm add nom / -D
npm run build pnpm build run shart emas
npm pnpm Izoh
npm ls nom / npm explain pnpm why nom
npx nom pnpm dlx nom / pnpm exec nom dlx — yuklab, exec — loyihadagi
npm uninstall pnpm remove
npm dedupe pnpm dedupe

pnpm add picocolors — "^1.1.1" yozdi (pnpm ham sukut bo'yicha ^; aniq versiya — -E yoki saveExact). pnpm dlx cowsay@1.6.0 Salom — sigir chiqdi, paket esa vaqtinchalik papkaga (…/xdg-cache/pnpm/dlx/…) o'rnatildi, loyihaga tegmadi.

6. O'rnatish skriptlari: allowBuilds

Ba'zi paketlar o'rnatilganda o'z kodini ishga tushiradi — postinstall skripti. esbuild ham:

bash
npm view esbuild@0.28.2 scripts.postinstall
text
node install.js

Bu foydali (masalan, binarni tekshirish), lekin xavfli ham: zararli paket ham aynan shu yo'l bilan kompyuteringizda kod bajaradi (Ta'minot zanjiri). pnpm 10 dan beri bunday skriptlar sukut bo'yicha bloklanadi:

bash
pnpm add -D esbuild@0.28.2
text
…
devDependencies:
+ esbuild 0.28.2

Error: ERR_PNPM_IGNORED_BUILDS

  × adding a new package
  ╰─▶ Ignored build scripts: esbuild@0.28.2
  help: Run "pnpm approve-builds" to pick which dependencies should be allowed
        to run scripts.

"O'rnatish skriptlari e'tiborsiz qoldirildi: esbuild. Qaysi paketlarga ruxsat berishni pnpm approve-builds bilan tanlang". pnpm 12.10.1 da bu xato — buyruq 1 bilan tugadi. Ruxsat berish:

bash
pnpm approve-builds esbuild
text
✓ Lockfile passes supply-chain policies (verified 19s ago)
Already up to date
.../esbuild@0.28.2/node_modules/esbuild postinstall$ node install.js
.../esbuild@0.28.2/node_modules/esbuild postinstall: Done

Skript ishladi va pnpm-workspace.yaml ga yozildi:

text
allowBuilds:
  esbuild: true

Bu ro'yxat Git'ga commit qilinadi — jamoa "qaysi paket kod bajara oladi" degan qarorni ko'radi va ko'rib chiqadi.

Diqqat: Eski maqolalarda (pnpm 10) bu sozlama onlyBuiltDependencies: [esbuild] deb yozilgan. Biz uni pnpm 12.10.1 da sinadik — u ishlamadi, xuddi o'sha ERR_PNPM_IGNORED_BUILDS chiqdi. Yangi nomi — allowBuilds. Versiya almashganda sozlama nomlari o'zgaradi: maqolaning sanasiga qarang va hujjatni o'z versiyangiz uchun o'qing.

npm 11.19.0 da ham o'xshash yo'nalish bor. U npm i -D esbuild@0.28.2 da ogohlantiradi: npm warn install-scripts 1 package has install scripts not yet covered by allowScripts va npm install-scripts approve <pkg> buyrug'ini taklif qiladi. Lekin o'rnatish xatosiz tugaydi — pnpm 12 dagidek to'xtamaydi. Batafsil — Ta'minot zanjiri darsida.

7. Workspace va catalog: monorepo

Monorepo — bitta Git repozitoriyda bir nechta paket. «Bahor» uchun: @bahor/narx (narxlar) va @bahor/kassa (uni ishlatadi). kurs/mashqlar/16/13-pnpm/monorepo/:

text
monorepo/
├── package.json
├── pnpm-workspace.yaml
└── packages/
    ├── narx/   (package.json, index.js)
    └── kassa/  (package.json, index.js)

pnpm-workspace.yaml:

yaml
# «Bahor» monoreposi: hamma paketlar packages/ ichida
packages:
  - "packages/*"

# Versiyalar katalogi: bir joyda yoziladi, paketlar "catalog:" deydi
catalog:
  picocolors: 1.1.1

packages/narx/package.json da "picocolors": "catalog:" — "versiyani katalogdan ol". packages/kassa/package.json da "@bahor/narx": "workspace:*" — "registrdan emas, shu repodagi paketni ol". Ildiz package.json da: "start": "pnpm --filter @bahor/kassa start".

bash
pnpm install
pnpm start
text
Scope: all 3 workspace projects
…
Done in 856ms using pnpm v12.10.1
$ pnpm --filter @bahor/kassa start
$ node index.js
osh: 35000 so'm
ko'k choy: 5000 so'm

kassa/node_modules/@bahor/narx -> ../../../narx — symlink: narx ni o'zgartirsangiz, kassa darhol ko'radi. --filter — buyruqni faqat bitta paketda bajarish. Lock'da katalog alohida bo'lim:

text
catalogs:
  default:
    picocolors:
      specifier: 1.1.1
      version: 1.1.1

Katalog nima beradi? O'nta paketda picocolors bo'lsa, versiya bitta joyda yoziladi va hammasi bir xil bo'ladi — node_modules ichida darsidagi ikki nusxa muammosining oldi olinadi. npm'da ham workspace bor ("workspaces" maydoni), lekin katalog yo'q.

Tekshirib ko'ring: Monorepoda kassa "@bahor/narx": "workspace:*" ni ishlatadi. kassa npm'ga nashr qilinsa, foydalanuvchida nima bo'ladi?

Javob

pnpm nashr paytida workspace:* ni narx ning haqiqiy versiyasiga (1.0.0) almashtiradi — tashqi foydalanuvchi registrdan aynan shuni oladi. catalog: ham nashrda aniq versiyaga aylanadi. Shuning uchun bu yozuvlar faqat repo ichida ma'noga ega.

8. Ko'p uchraydigan xatolar

Xabar / belgi Sabab Davosi
ERR_MODULE_NOT_FOUND npm'dan o'tgach fantom bog'liqlik paketni e'lon qiling (shamefullyHoist — oxirgi chora)
ERR_PNPM_IGNORED_BUILDS postinstall bloklandi pnpm approve-builds nom
onlyBuiltDependencies ishlamayapti pnpm 12 da yangi nom allowBuilds
ikki lock-fayl pnpm import dan keyin eski qoldi package-lock.json ni o'chiring
Belgi Sabab Davosi
pnpm: command not found pnpm o'rnatilmagan npx pnpm@… yoki rasmiy o'rnatish
du katta ko'rsatadi hard link'lar har papkada sanaladi ombor bilan birga o'lchang
workspace:* registrda topilmadi npm install ishlatildi pnpm install

9. Mashqlar

Mashqlar kurs/mashqlar/16/13-pnpm/ da. pnpm'ni npx -y pnpm@12.10.1 bilan chaqiring.

1-mashq (oson): Ildizda nima bor?

pnpm'ga o'tkazilgan vazifalar nusxasida ls node_modules va ls -la node_modules/prettier:

  • ildizdagi paket papkalari soni (.bin, .pnpm va fayllardan tashqari):
  • node_modules/prettier — papkami yoki havolami?
  • ms ni import qilish natijasi:
Yechim

8 ta: @eslint/js, @typescript/native, eslint, globals, prettier, typescript, typescript-eslint, web-vitals (scope'li ikkitasi @eslint/ va @typescript/ papkalari ichida). Hammasi — .pnpm/<nom>@<versiya>/node_modules/<nom> ga symlink. ms — ERR_MODULE_NOT_FOUND: ildizda yo'q, u faqat debug ga ko'rinadi.

2-mashq (o'rta): O'z o'lchovingiz

  1. vazifalar nusxasini oling, pnpm import, package-lock.json ni o'chiring, pnpm install --frozen-lockfile.
  2. pnpm test — testlar soni:
  3. node_modules ni o'chirib, pnpm install --frozen-lockfile ni 5 marta o'lchang (bash'da: time …). Mediana?
  4. Asl vazifalar da npm ci ni 5 marta o'lchang. Necha baravar farq?
Yechim

Bizda: pnpm mediana 1.1 s, npm ci — 6.2 s, taxminan 5.6 baravar («O'lchov» bo'limi). Sizda raqamlar boshqacha bo'ladi — disk, antivirus va internet ta'sir qiladi. Halol taqqoslash uchun ikkalasi ham "issiq" bo'lsin (kesh/ombor to'la) va npx ning o'z vaqti o'lchovga qo'shilmasin. Bir o'lchovga ishonmang — mediana.

3-mashq (o'rta): Skriptga ruxsat

Yangi papkada pnpm add -D esbuild@0.28.2. Qanday xato chiqadi? Ruxsat bering va pnpm-workspace.yaml ni o'qing.

Yechim

Error: ERR_PNPM_IGNORED_BUILDS … Ignored build scripts: esbuild@0.28.2 (chiqish kodi 1). pnpm approve-builds esbuild — postinstall: Done, faylda:

text
allowBuilds:
  esbuild: true

Bu faylni commit qiling. Har yangi allowBuilds qatori — PR'da alohida savol: "bu paketga kompyuterimizda kod bajarish huquqi kerakmi?".

4-mashq (qiyin): «Bahor» monoreposi

«Workspace va catalog» bo'limidagi monorepo'ni noldan quring: ikki paket (@bahor/narx, @bahor/kassa), picocolors faqat katalogda, kassa narx ni workspace:* bilan oladi, ildizdagi pnpm start kassani ishga tushiradi. narx dagi formatPrice(name) taom nomi va qalin narxni qaytaradi.

Yechim

packages/narx/package.json:

json
{
  "name": "@bahor/narx",
  "version": "1.0.0",
  "private": true,
  "type": "module",
  "exports": "./index.js",
  "dependencies": {
    "picocolors": "catalog:"
  }
}

packages/narx/index.js:

js
// index.js — «Bahor» narxlari va formatlash
import pc from "picocolors";

export const prices = { osh: 35000, manti: 30000, "ko'k choy": 5000 };

export function formatPrice(name) {
  return `${name}: ${pc.bold(String(prices[name]))} so'm`;
}

packages/kassa/package.json:

json
{
  "name": "@bahor/kassa",
  "version": "1.0.0",
  "private": true,
  "type": "module",
  "scripts": {
    "start": "node index.js"
  },
  "dependencies": {
    "@bahor/narx": "workspace:*"
  }
}

packages/kassa/index.js:

js
// index.js — kassa: narx paketidan foydalanadi
import { formatPrice } from "@bahor/narx";

for (const dish of ["osh", "ko'k choy"]) {
  console.log(formatPrice(dish));
}

Ildizda pnpm-workspace.yaml («Workspace va catalog» bo'limidagidek) va package.json ("private": true, "start": "pnpm --filter @bahor/kassa start"). pnpm install va pnpm start — osh: 35000 so'm, ko'k choy: 5000 so'm (terminalda raqamlar qalin). E'tibor bering: kassa picocolors ni e'lon qilmagan va uni import ham qilmaydi — pnpm'da bu talab, npm'da esa odat.

10. Real ishda

  • Ochiq kodli loyihalar (Vue, Vite, Nuxt va boshqalar) pnpm monorepo'larida. Ularga hissa qo'shmoqchi bo'lsangiz, birinchi buyruq — pnpm install.
  • CI'da pnpm --frozen-lockfile ni o'zi yoqadi; ombor keshlanadi va o'rnatish soniyalarda.
  • Xavfsizlik: allowBuilds — "kim kod bajara oladi" degan oq ro'yxat. Bu ro'yxatni PR'da ko'rib chiqish — jamoa odati.
  • Intervyu: "pnpm npm'dan nima bilan farq qiladi?", "content-addressable store nima?", "phantom dependency pnpm'da nega yo'q?".

Xulosa

  • pnpm fayllarni bitta omborda saqlaydi va loyihalarga hard link qiladi: ikkinchi loyiha reused, disk deyarli o'smaydi.
  • Ildiz node_modules — faqat e'lon qilingan paketlar (symlink), qolgani .pnpm ichida; fantom bog'liqlik ishlamaydi.
  • pnpm import — npm lock'idan o'tish; --frozen-lockfile — npm ci o'xshashi; bizda 5.6 baravar tez.
  • O'rnatish skriptlari bloklanadi: pnpm approve-builds, allowBuilds (pnpm 10 dagi onlyBuiltDependencies — 12 da ishlamadi).
  • pnpm-workspace.yaml: packages, catalog, workspace:*, --filter; shamefullyHoist — oxirgi chora.

Keyingi dars: Yarn va Bun — Yarn classic va berry, Plug'n'Play, Bun'ning bun install'i, packageManager maydoni va Corepack: mavjud loyihada qaysi menejer ekanini qanday bilasiz.

Manbalar

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
pnpm: tez va qat'iy paket menejeri — store, symlinklar, workspace va allowBuilds — IlmHamroh