IlmHamroh
JavaScript Full-stack/16-qism. Frontend asboblari: npm, bundlerlar, config12/48-dars15 daqiqa
Mundarija (26)

.npmrc va registry sozlamalari: save-exact, engine-strict, scope registri va token

Qisqacha: .npmrc — npm sozlamalari fayli, oddiy kalit=qiymat qatorlari. U to'rt joyda bo'lishi mumkin: loyiha ildizida (jamoa uchun, Git'da), uy papkangizda (~/.npmrc — faqat siz uchun), global va npm'ning o'zida. Ustuvorlik: buyruq bayrog'i → muhit o'zgaruvchisi → loyiha → foydalanuvchi → global. Loyiha .npmrc ida save-exact, engine-strict, scope registri yoziladi. Token esa faylga hech qachon ochiq yozilmaydi — faqat ${O'ZGARUVCHI} havolasi.

Bu darsda

  • .npmrc ning to'rt darajasini va qaysi biri yutishini bilasiz.
  • npm config get/set/ls bilan sozlamalarni o'qiysiz va yozasiz.
  • Loyihaga save-exact, engine-strict, fund, audit ni qo'yasiz.
  • Scope uchun alohida registr (@bahor:registry) va token'ni xavfsiz ulaysiz.
  • Ochiq token'ni commit'dan oldin ushlaydigan skript yozasiz.

Oldin bilishingiz kerak: Lock-fayllar va npm ci, Semver va versiya diapazonlari, Node versiya menejerlari.

1. Nega bu kerak?

Uchta voqea. Birinchisi: Sardor vazifalar da har paketni -E bilan o'rnatadi (semver darsi). Bobur esa unutdi va package.json ga ^ tushdi. Ikkinchisi: Node versiya menejerlari darsida engines faqat ogohlantirish berdi, --engine-strict ni har safar yozish kerak edi. Uchinchisi: Jasur aka «Bahor» kompaniyasining ichki paketlarini npmjs.com'ga emas, o'z serveriga qo'ymoqchi.

Uchala muammoning yechimi bitta fayl — .npmrc. "rc" — eski Unix an'anasi ("run commands"): dastur ishga tushganda o'qiydigan sozlama fayli. .bashrc, .nvmrc kabi.

Diqqat: Sizning uy papkangizdagi ~/.npmrc da npm login qilgan bo'lsangiz, haqiqiy token turadi. Uni ekranga chiqarmang, skrinshot qilmang, chatga yubormang. Biz bu darsda tajribalarni alohida papkada qildik: npm'ga NPM_CONFIG_USERCONFIG bilan vaqtinchalik "foydalanuvchi fayli"ni berdik. Darsdagi token'lar — npm_XXXX… namunasi.

Maslahat: Chiqishlar 2026-10-10 da Windows 11, Node 24.21.0 va npm 11.19.0 bilan olingan. Yo'l boshi … bilan qisqartirilgan.

2. Birinchi .npmrc

2.1 npm config set

kurs/mashqlar/16/12-npmrc/ da npm init -y. Hozirgi qiymat:

bash
npm config get save-exact
text
false

Loyiha darajasida yoqamiz:

bash
npm config set save-exact=true --location=project

Buyruq jim tugaydi (chiqish yo'q) — bu muvaffaqiyat belgisi. Loyiha ildizida .npmrc paydo bo'ldi, ichida bitta qator: save-exact=true. Endi -E siz:

bash
npm i picocolors
npm pkg get dependencies
text

added 1 package, and audited 2 packages in 2s

found 0 vulnerabilities
{
  "picocolors": "1.1.1"
}

Belgisiz "1.1.1" — xuddi -E yozgandek. Bu fayl Git'ga commit qilinadi va jamoadagi hamma uchun ishlaydi: Bobur endi unutsa ham, ^ tushmaydi.

2.2 Format

text
; izoh nuqta-vergul yoki # bilan
save-exact=true
engine-strict=true

Har qator — kalit=qiymat. Kalitlar — npm sozlamalari nomi (config hujjati da ~150 ta). Buyruq qatoridagi --save-exact bilan bir xil nom, faqat -- siz. Qo'lda yozsangiz ham bo'ladi — npm config set faqat qulaylik.

3. To'rt daraja va ustuvorlik

3.1 Qayerda turadi

Daraja Fayl Kim uchun
project (loyiha) <loyiha>/.npmrc jamoa, Git'da
user (foydalanuvchi) ~/.npmrc (C:\Users\<ism>\.npmrc) faqat siz, token shu yerda
global <npm prefix>/etc/npmrc kompyuterdagi hamma foydalanuvchi
builtin npm ichidagi npmrc npm'ning o'z sukutlari

Foydalanuvchi fayli qayerdaligini npm config get userconfig aytadi. Bu darsda u vaqtinchalik foydalanuvchi.npmrc ga yo'naltirilgan, ichida ikki qator: save-exact=false va fund=false.

3.2 Kim yutadi

Loyihada save-exact=true, "foydalanuvchida" — false:

bash
npm config get save-exact fund
text
save-exact=true
fund=false

save-exact — loyihadan (u foydalanuvchidan kuchli), fund — foydalanuvchidan (loyihada yo'q). npm config ls buni ochiq ko'rsatadi:

bash
npm config ls
text
; "user" config from …\foydalanuvchi.npmrc

fund = false
; save-exact = false ; overridden by project
; save-prefix = "^" ; overridden by project

; "project" config from …\kurs\mashqlar\16\12-npmrc\.npmrc

save-exact = true
save-prefix = ""

; "env" config from environment
…

; overridden by project — "loyiha ustidan yozdi". save-prefix ni biz yozmaganmiz: npm save-exact=true dan uni o'zi chiqargan (^ o'rniga bo'sh prefiks). Muhit o'zgaruvchisi va bayroq esa loyihadan ham kuchli:

bash
NPM_CONFIG_SAVE_EXACT=false npm config get save-exact
npm config get save-exact --save-exact=false
text
false
false

NPM_CONFIG_<NOM> — har sozlamaning muhit o'zgaruvchisi shakli (katta harf, - → _). CI'da sozlamani faylga tegmasdan o'zgartirish uchun qulay.

flowchart LR
  A["--bayroq"] --> B["NPM_CONFIG_*"]
  B --> C["loyiha .npmrc"]
  C --> D["~/.npmrc"]
  D --> E["global npmrc"]
  E --> F["npm sukuti"]

Chapdan o'ngga — kuchlidan kuchsizga. npm har sozlamani chapdan qidiradi va birinchi topganini oladi.

Tekshirib ko'ring: Sardorning ~/.npmrc ida save-exact=true, loyihada .npmrc yo'q. Bobur o'sha loyihani klonlab npm i dayjs qildi. Bobur'ning package.json iga nima yoziladi?

Javob

"^1.11.23" (yoki o'sha kungi versiya). Sardorning ~/.npmrc i faqat uning kompyuterida — Git bilan Bobur'ga bormaydi. Jamoa qoidasi bo'lsa, uni loyiha .npmrc iga yozing.

4. Loyiha uchun foydali sozlamalar

4.1 engine-strict

engines da >=26 (bizda Node 24). Faqat engine-strict=true qatori qo'shilgan .npmrc bilan:

bash
npm install
text
npm error code EBADENGINE
npm error engine Unsupported engine
npm error engine Not compatible with your version of node/npm: 12-npmrc@1.0.0
npm error notsup Not compatible with your version of node/npm: 12-npmrc@1.0.0
npm error notsup Required: {"node":">=26"}
npm error notsup Actual:   {"node":"v24.21.0","npm":"11.19.0"}

Node versiya menejerlari darsidagi --engine-strict bayrog'i endi doim yoqilgan — hech kim uni unutmaydi. .npmrc siz shu holatda faqat npm warn EBADENGINE chiqqan va o'rnatish davom etgan edi.

4.2 fund va audit

text
fund=false
audit=false

Bu ikki qator bilan npm install chiqishi bitta qatorga qisqardi:

text

added 1 package in 1s

looking for funding va found 0 vulnerabilities yo'q. fund=false — xavfsiz, faqat shovqinni kamaytiradi. audit=false esa ehtiyot bilan: o'rnatishdagi avtomatik zaiflik tekshiruvi o'chadi. Uni o'chirgan loyiha npm audit ni alohida (CI'da) yuritishi shart — Ta'minot zanjiri xavfsizligi.

4.3 Boshqa ko'p uchraydiganlar

Sozlama Nima qiladi Sukut Qachon yoqiladi
save-exact ^ siz yozadi false ilovalarda (vazifalar kabi)
engine-strict engines buzilsa — xato false Node versiyasi muhim bo'lsa
fund looking for funding xabari true false — shovqinsiz
Sozlama Nima qiladi Sukut Qachon yoqiladi
audit o'rnatishda zaiflik tekshiruvi true o'chirsangiz — CI'da npm audit
ignore-scripts paketlarning postinstall i ishlamaydi false xavfsizlik (Ta'minot zanjiri)
legacy-peer-deps peer to'qnashuvini yashiradi false deyarli hech qachon (node_modules ichida)

"Sukut" ustuni — .npmrc umuman bo'lmaganda npm qaysi qiymatni oladi (npm 11.19.0 hujjati bo'yicha).

vazifalar ga .npmrc Ta'minot zanjiri xavfsizligi darsida qo'shiladi — o'sha yerda xavfsizlik sozlamalari bilan birga.

4.4 npm config buyruqlari

Faylni qo'lda ochmasdan ham ishlash mumkin:

Buyruq Nima qiladi
npm config get nom yakuniy qiymat (hamma darajadan keyin)
npm config set nom=qiymat --location=project loyiha fayliga yozadi
npm config delete nom --location=project loyiha faylidan o'chiradi
npm config ls sizning sozlamalaringiz va manbalari

--location ni unutmang: usiz npm config set foydalanuvchi fayliga (~/.npmrc) yozadi. Bu ko'p uchraydigan chalkashlik: Sardor "loyihaga save-exact qo'ydim" deb o'ylaydi, aslida u faqat o'z kompyuterida yoqilgan. Natijada uning package.json larida aniq versiyalar, jamoadoshlarida — ^. Kim nimani o'zgartirganini git diff ham ko'rsatmaydi, chunki ~/.npmrc Git'da emas.

npm config ls -l esa npm'ning hamma sukut qiymatlarini (yuzdan ortiq) chiqaradi. Uni faqat o'zingiz o'qing: foydalanuvchi faylingizdagi qatorlar ham u yerda bo'ladi. Ekranni ulashishdan yoki chiqishni chatga tashlashdan oldin o'ylang — token (protected) bo'lsa ham, registr manzillari, ichki scope nomlari va yo'llar kompaniya haqida ko'p narsa aytadi.

Tekshirib ko'ring: Bobur npm config set engine-strict=true yozdi va hamkasbiga "endi loyihada Node versiyasi majburiy" dedi. To'g'rimi?

Javob

Yo'q. --location siz sozlama Bobur'ning ~/.npmrc iga yozildi — faqat uning kompyuterida ishlaydi. Loyiha uchun: npm config set engine-strict=true --location=project, keyin .npmrc ni commit qilish. Tekshirish: npm config ls — qiymat "project" config from … ostida bo'lishi kerak.

5. Registr: paketlar qayerdan keladi

5.1 registry

Registr (registry) — paketlar ombori-server. Sukut bo'yicha https://registry.npmjs.org/ (npm doctor ham shuni tekshirgan). Uni almashtirish mumkin: kompaniya ichki registri, yoki internet sekin joyda yaqinroq nusxa (mirror). Butun loyiha uchun: registry=https://…. Lekin ko'pincha registrni faqat bitta scope uchun almashtirish kerak bo'ladi.

5.2 Scope registri

«Bahor» ichki paketlari — @bahor/… nomli (pasport darsidagi scope). Loyiha .npmrc:

text
@bahor:registry=http://localhost:4873/

"@bahor bilan boshlangan paketlarni shu manzildan ol, qolganini — odatdagi registrdan". Sinov (bu manzilda server ishlamayapti):

bash
npm view @bahor/narx version
text
npm error code ECONNREFUSED
npm error errno ECONNREFUSED
npm error FetchError: request to http://localhost:4873/@bahor%2fnarx failed, reason: 
…
npm error If you are behind a proxy, please make sure that the 'proxy' config is set properly.  See: 'npm help config'

ECONNREFUSED — "ulanish rad etildi": npm aynan localhost:4873 ga bordi, demak scope yo'nalishi ishlayapti. Shu paytning o'zida boshqa paketlar npmjs'dan keladi:

bash
npm view picocolors version
text
1.1.1

Scope yo'nalishi xavfsizlik uchun ham muhim. Ichki paket nomi @bahor/narx bo'lsa, begona odam npmjs'da xuddi shu nomli paket chiqara olmaydi — scope egasi bitta. Scope'siz ichki nom esa ("bahor-narx") hujumchiga ochiq: u npmjs'da shu nomni egallab, yuqoriroq versiya chiqarishi mumkin. Bu hujumning nomi — dependency confusion (bog'liqlik chalkashligi), 2021-yilda Alex Birsan ko'plab yirik kompaniyalarda ko'rsatgan.

5.3 Token: faqat ${O'ZGARUVCHI}

Yopiq registr parol so'raydi. npm'da bu — token (kirish kaliti), _authToken kaliti bilan, registr manzili oldidan // bilan:

text
@bahor:registry=http://localhost:4873/
//localhost:4873/:_authToken=${BAHOR_NPM_TOKEN}

${BAHOR_NPM_TOKEN} — npm qiymatni muhit o'zgaruvchisidan oladi. Fayl Git'da tursa ham, token unda yo'q. CI'da o'zgaruvchi maxfiy sozlamadan (GitHub Actions'da secrets) beriladi. npm config ls token'ni ko'rsatmaydi:

text
; "project" config from …\kurs\mashqlar\16\12-npmrc\.npmrc

@bahor:registry = "http://localhost:4873/"
//localhost:4873/:_authToken = (protected)
audit = false
engine-strict = true
fund = false
save-exact = true
save-prefix = ""

(protected) — "himoyalangan". Lekin bu himoya faqat shu buyruqda: faylning o'zini cat qilsangiz, ochiq token ko'rinadi. Shuning uchun faylga hech qachon _authToken=npm_… yozmang.

Tuzoq: o'zgaruvchi berilmasa, npm 11.19.0 ogohlantirmadi — so'rov token'siz ketdi. Registr javobidagi xatoni (401, E401) ko'rib, avval o'zgaruvchi berilganini tekshiring.

npm login esa token'ni foydalanuvchi fayliga (~/.npmrc) ochiq yozadi. Shaxsiy kompyuterda bu odatiy holat. Faqat shu fayl hech qachon loyihaga ko'chib o'tmasin va ekranda ko'rinmasin.

5.4 Verdaccio: o'z registringiz

Verdaccio — Node'da yozilgan kichik registr-server. Rasmiy hujjatga ko'ra npx verdaccio uni http://localhost:4873/ da ishga tushiradi. U o'zida yo'q paketlarni npmjs'dan olib, keshlaydi (uplink). Ishlatilishi: kompaniya ichki paketlari, oflayn kesh, paketni nashr qilishni xavfsiz mashq qilish. Bu darsda biz serverni ishga tushirmadik. Scope yo'nalishini «Scope registri» bo'limidagi ECONNREFUSED bilan isbotladik — 4873 aynan Verdaccio'ning sukut porti. Shunga o'xshash pullik/bulutli xizmatlar: GitHub Packages, GitLab Package Registry, JFrog Artifactory.

Tekshirib ko'ring: Jasur aka: "Token'ni loyiha .npmrc iga yozib qo'ydim, repo yopiq-ku". Siz nima deysiz va qanday tuzatasiz?

Javob

Yopiq repo ham ko'p odamga ko'rinadi (hamkasblar, CI, kelajakdagi xodimlar), Git tarixi esa token'ni abadiy saqlaydi. Tuzatish: token'ni registrda bekor qilish va yangisini yaratish, faylda ${BAHOR_NPM_TOKEN} ga almashtirish, yangi token'ni CI sirlariga va har dasturchining muhitiga qo'yish. Faylni o'zgartirishning o'zi yetmaydi — eski token tarixda qoladi.

6. Ko'p uchraydigan xatolar

Xabar / belgi Sabab Davosi
sozlama ishlamayapti kuchliroq daraja ustidan yozgan npm config ls — overridden by
ECONNREFUSED faqat @scope/… da scope registri ishlamayapti server/manzilni tekshiring
E401 / E403 token yo'q yoki eskirgan ${O'ZGARUVCHI} berilganmi
EBADENGINE xato bo'ldi engine-strict=true Node versiyasini almashtiring
Belgi Sabab Davosi
hamkasbda ^ tushyapti save-exact faqat ~/.npmrc da loyiha .npmrc ga
token Git tarixida _authToken=npm_… ochiq token'ni bekor qiling, ${…}
found 0 vulnerabilities yo'qoldi audit=false CI'da npm audit

7. Mashqlar

Mashqlar kurs/mashqlar/16/12-npmrc/ da. Tajribalarda haqiqiy ~/.npmrc ga tegmaslik uchun foydalanuvchi faylini vaqtinchalik faylga yo'naltiring: NPM_CONFIG_USERCONFIG=./sinov-user.npmrc (Git Bash) — yoki faqat loyiha .npmrc bilan ishlang.

1-mashq (oson): Kim yutadi?

Loyiha .npmrc da save-exact=true va fund=false. Foydalanuvchi faylida save-exact=false va audit=false. Javob bering:

  • npm config get save-exact:
  • npm config get audit:
  • NPM_CONFIG_FUND=true npm config get fund:
  • npm config get save-exact --save-exact=false:
Yechim

Loyiha foydalanuvchidan kuchli → save-exact=true. audit loyihada yo'q → foydalanuvchidan false. Muhit o'zgaruvchisi loyihadan kuchli → fund=true. Bayroq hammadan kuchli → false. npm config ls da ko'ring: kuchsizroq qiymatlar ; overridden by … izohi bilan.

2-mashq (o'rta): Jamoa .npmrc i

Yangi loyihaga .npmrc yozing: aniq versiyalar, engines majburiy, fund va audit xabarlarisiz. npm i picocolors bilan sinang, keyin engines.node ni >=26 qilib, npm install qiling.

Yechim

.npmrc:

text
save-exact=true
engine-strict=true
fund=false
audit=false
bash
npm i picocolors
npm pkg get dependencies
text

added 1 package in 1s
{
  "picocolors": "1.1.1"
}

npm pkg set engines.node=">=26" va npm install — npm error code EBADENGINE (chiqish kodi 1). audit=false tanladingizmi — CI'ga npm audit qadamini qo'shishni unutmang.

3-mashq (qiyin): Token qo'riqchisi

Commit'dan oldin .npmrc da ochiq token yo'qligini tekshiradigan skript yozing. npmrc.mjs da:

  • parseNpmrc(text) — Map(kalit → qiymat); bo'sh qatorlar va ;/# izohlari tashlanadi; = dan oldingisi kalit.
  • findLeaks(text) — kaliti _authToken, _auth yoki _password bilan tugaydigan, lekin qiymati ${KATTA_HARFLAR} ko'rinishida bo'lmagan kalitlar ro'yxati.

tekshir.mjs — node tekshir.mjs [.npmrc]; sizib chiqish bo'lsa chiqish kodi 1. npmrc.test.mjs — kamida 2 test. Token sifatida faqat npm_XXXX namunasidan foydalaning.

Ishoralar: split(/\r?\n/) — Windows qatorlari ham; endsWith — matnni qidirish; /^\$\{[A-Z0-9_]+\}$/ — $ va { ni \ bilan ekranlash (RegExp asoslari).

Yechim

npmrc.mjs:

js
// npmrc.mjs — .npmrc matnini o'qiydi va ochiq token'larni topadi

// "kalit=qiymat" qatorlari → Map; ; yoki # — izoh qatori
export function parseNpmrc(text) {
  const map = new Map();
  for (const raw of text.split(/\r?\n/)) {
    const line = raw.trim();
    if (line === "" || line.startsWith(";") || line.startsWith("#")) {
      continue;
    }
    const eq = line.indexOf("=");
    if (eq === -1) continue;
    map.set(line.slice(0, eq).trim(), line.slice(eq + 1).trim());
  }
  return map;
}

const SECRET_KEYS = ["_authToken", "_auth", "_password"];

// Sir kalitlari ${ENV} o'rniga ochiq qiymat bilan yozilganmi?
export function findLeaks(text) {
  const leaks = [];
  for (const [key, value] of parseNpmrc(text)) {
    const isSecret = SECRET_KEYS.some((s) => key.endsWith(s));
    if (isSecret && !/^\$\{[A-Z0-9_]+\}$/.test(value)) {
      leaks.push(key);
    }
  }
  return leaks;
}

const text = "//r.example.com/:_authToken=npm_XXXX\nfund=false";
console.log(findLeaks(text)); // [ '//r.example.com/:_authToken' ]

Oxirgi ikki qator — sinash uchun. indexOf("=") — birinchi =: qiymat ichida = bo'lsa ham (base64 token oxiridagi ==) to'g'ri bo'linadi.

tekshir.mjs:

js
// tekshir.mjs — ishlatish: node tekshir.mjs [.npmrc yo'li]
// commit'dan oldin: ochiq token bo'lsa, chiqish kodi 1
import { existsSync, readFileSync } from "node:fs";
import { findLeaks } from "./npmrc.mjs";

const file = process.argv[2] ?? ".npmrc";
if (!existsSync(file)) {
  console.log(`✔ ${file} yo'q — tekshiradigan narsa yo'q`);
  process.exit(0);
}
const leaks = findLeaks(readFileSync(file, "utf8"));
for (const key of leaks) {
  console.log(`✖ ${key} — ochiq token, \${ENV} yozing`);
}
if (leaks.length === 0) console.log(`✔ ${file}: ochiq token yo'q`);
process.exitCode = leaks.length > 0 ? 1 : 0;

npmrc.test.mjs:

js
// npmrc.test.mjs — node --test npmrc.test.mjs
import { test } from "node:test";
import assert from "node:assert/strict";
import { findLeaks, parseNpmrc } from "./npmrc.mjs";

const safe = [
  "; «Bahor» loyihasi sozlamalari",
  "save-exact=true",
  "@bahor:registry=http://localhost:4873/",
  "//localhost:4873/:_authToken=${BAHOR_NPM_TOKEN}",
].join("\n");

test("kalit va qiymatlar, izohlar tashlanadi", () => {
  const map = parseNpmrc(safe);
  assert.equal(map.size, 3);
  assert.equal(map.get("save-exact"), "true");
  assert.equal(
    map.get("@bahor:registry"),
    "http://localhost:4873/",
  );
});

test("${ENV} — xavfsiz, ochiq token — sizib chiqish", () => {
  assert.deepEqual(findLeaks(safe), []);
  const leaky = safe + "\n//registry.npmjs.org/:_authToken=npm_XXXX";
  assert.deepEqual(findLeaks(leaky), [
    "//registry.npmjs.org/:_authToken",
  ]);
  assert.deepEqual(findLeaks("# _authToken=npm_XXXX"), []);
});

Ikki fayl bilan sinov:

bash
node tekshir.mjs xavfsiz.npmrc
node tekshir.mjs ochiq.npmrc
text
✔ xavfsiz.npmrc: ochiq token yo'q
✖ //registry.npmjs.org/:_authToken — ochiq token, ${ENV} yozing

Ikkinchisi 1 bilan tugaydi. Bu skriptni Git hook'lar darsida commit oldi tekshiruviga ulash mumkin. Professional asboblar (gitleaks, GitHub secret scanning) yuzlab token turlarini taniydi — lekin g'oya bir xil.

8. Real ishda

  • Deyarli har jamoa loyihasida .npmrc bor: save-exact, engine-strict, kompaniya scope registri. Begona repoda uni birinchi o'qiladigan fayllar qatoriga qo'shing (Begona repoda orientatsiya).
  • CI'da token — faqat sir sifatida (NODE_AUTH_TOKEN, NPM_TOKEN), .npmrc da ${…} havolasi. actions/setup-node ning registry-url parametri shunday .npmrc ni o'zi yaratadi.
  • Token sizib chiqsa — birinchi ish bekor qilish (revoke), keyin tarixni tozalash.
  • Intervyu: ".npmrc qayerlarda bo'ladi va qaysi biri yutadi?", "token'ni qanday saqlaysiz?", "dependency confusion nima va scope qanday himoya qiladi?".

Xulosa

  • .npmrc — kalit=qiymat sozlamalari; darajalar: loyiha, foydalanuvchi (~/.npmrc), global, builtin.
  • Ustuvorlik: bayroq → NPM_CONFIG_* → loyiha → foydalanuvchi → global → sukut; npm config ls — overridden by.
  • Jamoa sozlamalari (save-exact, engine-strict, fund) — loyiha .npmrc da, Git'da.
  • @scope:registry=… — scope uchun alohida registr; scope dependency confusion'dan himoya qiladi.
  • Token — faqat ${O'ZGARUVCHI}; ~/.npmrc dagi haqiqiy token'ni hech qachon ko'rsatmang va commit qilmang.
  • Verdaccio — o'z registringiz (sukut porti 4873).

Keyingi dars: pnpm: tez va qat'iy paket menejeri — global ombor va symlinklar bilan disk tejash, fantom bog'liqliklarni taqiqlash va vazifalar ni pnpm bilan o'rnatib o'lchash.

Manbalar

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
.npmrc va registry sozlamalari: save-exact, engine-strict, scope registri va token — IlmHamroh