sudo npm install -g ni ishga tushirish Internetda juda keng tarqalgan maslahat bo'lib tuyuladi. mean.io, taniqli veb-ramka kompilyatsiya generatori/kutubxonasi hatto buni o'z bosh sahifasida qilishni taklif qiladi.

sudo npm install (va potentsial sudo npm <anything>) dan foydalanish yomon fikr ™. Bu kamida bir necha sabablarga ko'ra muammo:

  • npm install ixtiyoriy skriptlarni ishga tushirish imkoniyatiga ega. npm qanday sozlanganligi va registrni oʻzgartirishingiz va u DNS-dan foydalanishi mumkinligi sababli, umuman olganda, siz tasodifan zararli paketni oʻrnatishingiz, toʻliq yaroqli paket sifatida niqoblangan zararli paketni oʻrnatishingiz yoki Agar root sifatida ishga tushirilsa, tizimingizga qandaydir zarar keltiradigan skriptlarni ishga tushirishi mumkin bo'lgan yaxshi niyatli paket.
  • sudo npm install (-gsiz) ishga tushirilsa, faqat ildiz foydalanuvchi tomonidan o'zgartirilishi mumkin bo'lgan mahalliy katalog yaratiladi. Agar siz keyinchalik xuddi shu katalog yoki loyihada npm <something> ni bajarishga harakat qilsangiz, bu haqiqatan ham siz uchun ishlarni buzishi mumkin.
  • Hatto sudo npm install -g ham toʻgʻri oʻrnatish maqsadi bilan sizni chalkashtirib yuborishi va kelajakda npm dan sudosiz foydalanishni qiyinlashtirishi mumkin, ayniqsa, agar siz npm konfiguratsiya oʻrta oqimini oʻzgartirsangiz. root foydalanuvchisi npm keshingizda fayllar va ~/.npm/_locks kabi potentsial fayl yaratishi mumkin va yaratadi va kelajakdagi npm install yoki npm install -g sizga dahshatli EACCES xatosini beradi.

sudo ni npm bilan ishlatish haqida gap ketganda: shunchaki buni qilmang.

npm install -g o'zingiz uchun

Ko'pincha siz faqat bitta foydalanuvchidan tugun va global o'rnatilgan ikkilik fayllardan foydalanishni talab qiladigan tizimda ishlaysiz (o'z kompyuteringizda, serverlarda ba'zi node foydalanuvchi). npm install -g muammosining eng oddiy yechimi tugun modullari o'rnatilgan joyni oddiygina o'zgartirishdir.

Aniq prefiks

npm global miqyosda qaerga o'rnatilishini yoki hech bo'lmaganda global miqyosda nima deb atalishini aniqlash uchun prefix sozlamasidan foydalanadi. npm prefix -g ni ishga tushirish orqali prefiks nimaga o'rnatilganligini ko'rishingiz mumkin va bu /usr kabi bo'lishi mumkin. Bu istalmagan. Buning o'rniga, joriy foydalanuvchi kirish huquqiga ega bo'lgan katalogga tugun modullarini global o'rnatish yaxshi bo'lar edi.

npm --prefix=/home/your-user/.global-node-modules install -g grunt-cli

Albatta, siz prefiksni xohlaganingizcha o'zgartirishingiz mumkin. Har safar ushbu --prefix parametrini kiritish juda og'riqli bo'lar edi, shuning uchun xayriyatki, npm standart sozlamalarni tekshirish uchun foydalanadigan .npmrc fayli mavjud. Meniki shunday ko'rinadi:

# ~/.npmrc tmp=/home/ajcrites/files/node-tmp cache=/home/ajcrites/.npmcache prefix=/home/ajcrites/.npm

Siz o'zingiz xohlagan qiymatlarni tanlashingiz mumkin, albatta. npm buyrug'iga qo'llashingiz yoki .npmrc-da o'rnatishingiz mumkin bo'lgan barcha konfiguratsiya sozlamalarining to'liq ro'yxati npm help 7 config ro'yxatida keltirilgan (buni topish uchun biroz vaqt kerak bo'ldi).

Qanday bo'lmasin, bir nechta chiroyli, o'zgacha yashirin papkalarni tanlaganingizdan so'ng, npm install -g (va ba'zi hollarda npm install) ni ishga tushirganingizda, npm install -g uy katalogiga, /usr katalogiga va boshqa joylarga har xil axlatlarni qo'yishni to'xtatadi. ).

Afsuski, npm-debug.log ... "hali" ni qaerga qo'yish uchun konfiguratsiya sozlamasi mavjud emasga o'xshaydi.

Xulosa, .npmrc da prefix ni o'rnatish yoki oddiygina --prefix dan foydalanish npm install -g ni sudosiz ishlatish imkonini beradi.

Lekin kuting! Bundan tashqari, ikkilik fayllar yo'lingizda ekanligiga ishonch hosil qilishingiz kerak. Yo'lingizga $PREFIX/bin qo'shing. Shunday qilib, mening holatimda:

# .zshrc / .bashrc / .profile / etc. export PATH=$PATH:$HOME/.npm/bin export NODE_PATH=$NODE_PATH:$HOME/.npm/lib/node_modules

E'tibor bering, NODE_PATH sozlamasi node kutubxonalar uchun ushbu yo'lni tekshirishga olib keladi. "Qo'shimcha ma'lumot bu erda" va bu har doim ham ma'qul bo'lishi mumkin yoki bo'lmasligi mumkin. Men uni to'liqlik uchun kiritdim.

nvm dan foydalanish

.npmrc va $PATH ni sozlash juda ko'p ish bo'lishi mumkin. Xo'sh, aslida emas, lekin shunday deb tasavvur qiling.

npm/node joriy versiyangiz muhimligini ham yodda tuting. Ba'zi kutubxonalar faqat v0.10 talabini qo'llab-quvvatlashi yoki bajarishi mumkin, holbuki siz tizimingizda v0.12 ishlayotgan bo'lishingiz mumkin.

nvm juda kam sozlashni talab qiluvchi ajoyib paket boʻlib, osongina oʻrnatish va tugun versiyalari oʻrtasida almashish imkonini beradi. Agar siz ma'lum bir versiya bilan ko'p ishlayotgan bo'lsangiz va uni istalgan vaqtda qobiqni ishga tushirganingizda ishlatmoqchi bo'lsangiz, profilingizga nvm use <specific-version> qo'shishingiz mumkin.

Xo'sh, nega bu ajoyib? nvm prefiksingizni yangilaydi! -- hech bo'lmaganda hali o'rnatmagan bo'lsangiz. U ~/.nvm/<version>/bin ga ikkilik fayllarni o'rnatadi. nvm use ni ishga tushirganingizda, u ushbu katalogni $PATH-ga qo'shadi! Va agar siz nvm use system yoki boshqa versiyaga qaytsangiz, u uni mos ravishda o'chiradi.

Shunday ekan, shuni yodda tutingki, nvm use dan keyin oʻrnatilgan ikkilik fayllar faqat xuddi shu nvm use ni takrorlaganingizda foydalanish mumkin boʻladi (agar siz ularni aniq kiritish uchun yoʻlingizni yangilamasangiz).

E'tibor bering, agar sizda .npmrc qurilmangizda prefix o'rnatilmagan bo'lsa, nvm faqat buni amalga oshiradi. Albatta, siz hali ham npm --prefix bilan hamma narsani bekor qilishingiz mumkin. Agar .npmrc da prefix boʻlsa yoki --prefix dan foydalansangiz, nvm use dan keyin ishlatilgan npm install -g prefiks sozlamalaringizdan foydalanaveradi. Menimcha, bu odatda yaxshi narsa.

Men nvm to'g'ri manbalanmaganligi sababli kichik muammolarga duch keldim. Siz shunchaki source /path/to/nvm/nvm.sh ni bajarishingiz kerak. nvm buni avtomatik ravishda profilingizga qo‘shishga harakat qiladi, lekin u har doim ham kutilganidek ishlamasligi mumkin. .zshrc, .bashrc va kerak bo'lganda boshqalarni yangilang.

npm install -g server uchun

Oldingi bo'lim tugun ilovasini o'rnatayotgan server uchun juda mos keladi. Odatda serveringizda tugunni ishga tushirish uchun mas'ul bo'lgan foydalanuvchi (uni node yoki xohlaganingizcha chaqiring) bo'ladi. Ularning .npmrc ni sozlang yoki --prefix dan mos ravishda foydalanish uchun qurish ishlarini sozlang.

Bu hali ham sudo npm install uchun foydalanish holati emas.

npm install -g barcha foydalanuvchilar uchun

Tizimda bir nechta foydalanuvchilarga butun dunyo bo'ylab tugunlar paketi ikkiliklari va kutubxonalarini o'rnatish va ulardan foydalanishga ruxsat berish uchun imkoniyat bo'lishi mumkin. Buning uchun sudo dan foydalanishga hali ham sabab yo'q -- ​​hech bo'lmaganda npm buyrug'i uchun emas.

Mening yechimim global tugun modullarini o'rnatish uchun katalog yaratishni o'z ichiga oladi - ehtimol /var da, garchi /usr to'g'ri bo'lishi mumkin bo'lsa ham ... Men hali ham bundan ehtiyot bo'laman, chunki /usr/bin da tugun bo'lmagan narsalar mavjud.

sudo addgroup npm-global-installers sudo mkdir -p /usr/{bin,lib/node_modules} sudo chgrp -R npm-global-installers !$ sudo chmod -R g+w !$

Yuqoridagi !$ "oldingi buyruqning oxirgi so'zi" uchun tarixni kengaytirish yoki ikkala holatda ham /usr/{bin,lib/node_modules}.

Bu /usr/lib ga tugun modullarini qo'shish uchun npm install -g ni ishga tushirishi mumkin bo'lgan guruh yaratadi. Siz tizimingizdagi ushbu guruhga ishonchli foydalanuvchilarni qo'shishingiz va tugun modullarining haqiqiy global o'rnatilishini amalga oshirishingiz mumkin.

Biroq bu yechim uchun asosiy ogohlantirish shundaki, npm-global-installers tizimidagi har bir kishi boshqalarning global oʻrnatishlarini oʻchirib qoʻyishi mumkin. Shaxslar bu muammoni o'zlarining prefikslari yordamida hal qilishlari mumkin, ammo bu global o'rnatish maqsadini buzadi.

Yana bir yechim - oddiygina npm-global-intaller foydalanuvchiga ega bo'lish va uning prefix ni ~/npm ga yangilash -- keyin hamma o'z $PATH ga ~npm-global-installer/npm ni qo'shish. Boshqa foydalanuvchilar ushbu global o'rnatishlarni npm-global-installer foydalanuvchisi (yo'q root -- men buni sinab ko'rmadim va sizda ruxsat yo'q ~/.npm/_locks bo'lishi mumkin) yoki ushbu katalog yordamida ushbu global o'rnatishlarni amalga oshirishi mumkin. guruhga/jahonga yozish mumkin bo'lishi mumkin.

Yuqoridagi ikkala echim ham bir nechta foydalanuvchilarga butun tizim bo'ylab tugunlar paketi ikkilik/kutubxonalardan foydalanishga ruxsat berish uchun mos keladi.

Albatta, agar siz boshqa foydalanuvchining oʻrnatilgan kutubxonalaridan foydalanmoqchi boʻlsangiz, uni qoʻshish uchun $NODE_PATH-ni yangilashingiz mumkin. Agar siz ikkilikdan foydalanmoqchi bo'lsangiz, uni qo'shish uchun $PATH ni yangilang yoki shunchaki /home/other-user/path/to/node/bin/script ni bajaring (agar siz uni bajara olasiz deb hisoblasangiz).

Men allaqachon sudo npm install ni ishga tushirganman. Yordam bering!

Agar siz npm install bilan g'alati xatolarga duch kelsangiz -- ayniqsa, o'tmishda sudo npm install qilganingizdan keyin EACCES ko'p gapiradigan narsalar, bu npm o'zgartirmoqchi bo'lgan kataloglardagi ruxsatlar muammosi bo'lishi mumkin. Bu npm yaxshi ma'noda soqov bo'lishining natijasidir. U mamnuniyat bilan siz aytgan ishni bajarishga harakat qiladi va ildiz ruxsatiga ega bo'lgan fayllar va kataloglarni yaratadi yoki sizda bunday ruxsat bo'lmaganda ularni o'zgartirishga harakat qiladi.

Aytish joizki, bir marta sudo npm install tomonidan yaratilgan faylni oʻzgartirishingiz kerak boʻlsa, uning ruxsatlarini oʻzgartirish yoki butunlay olib tashlash uchun imtiyozlardan foydalanishingiz kerak.

Eng oddiy yechim hozirda qaysi loyihada bo'lishidan qat'i nazar, sudo rm -rf node_modules ni bajarishdir. Xuddi shunday, agar siz global miqyosda noto'g'ri prefiks bilan tugun modullarini o'rnatgan bo'lsangiz, sudo rm -rf $(npm prefix -g)/{bin,lib/node_modules} ga o'xshash biror narsa qilishingiz kerak bo'lishi mumkin. Shuni yodda tutingki, bu busiz avval sudo bilan oʻrnatgan kutubxonalaringizni olib tashlaydi, shuning uchun ularni qayta oʻrnatishingiz kerak boʻladi. To'g'ri yo'l. Buni o'zingizning omadingiz deb hisoblang.

Aniqrog'ichiqishga e'tibor bering. npm sizga aytayotgan narsalarni o'qing va muammoni keltirib chiqaradigan katalogni toping. Uni olib tashlang. Agar uni oʻchira olmasangiz, sudo rm dan foydalanishingiz kerak boʻladi.

Oxir-oqibat, siz sudo ishlatmasdan npm install yoki npm install -g siz bajarishingiz kerak.

Ba'zida siz boshqa bog'liq bo'lmagan muammolarga duch kelishingiz mumkin (npm install oracledb sinab ko'ring!)

sudo bilan nima qilayotganingizni biling

Men ko'plab ishlab chiquvchilar saboq oladi degan fikrga ega bo'ldim

Agar biror narsa ishlamasa, sudo bilan qayta urinib ko'ring.

Bu menga shunga o'xshash vaziyatni eslatadi: agar kill jarayonni o'ldirmasa, kill -9 dan foydalaning. O'ylaymanki, siz ko'plab ishlab chiquvchilardan kill va kill -9 jarayonlarga qaysi signallarni yuborishini so'rashingiz mumkin va ko'pchilik javoban sizga bo'sh qarashadi (SIGTERM VA SIGKILL).

Xuddi shu nuqtai nazardan, sudo dan foydalanish hamma narsaga javob emas. Rootning imtiyozli foydalanuvchi deb atalishining sababi bor. Mas'uliyatni amalga oshirish orqali siz imtiyozlarga ega bo'lasiz va bu majburiyatlar orasida asosiysi buyruqni amalda bajarganingizda nima qilishini bilishdir.

Agar buyruqni sudo bilan ishga tushirishdan oldin nima qilishini aniq bilmasangiz (yoki siz ishlayotgan tizimni buzish haqida qayg'urmasangiz) kimdandir so'rang. sudo - hafsalasi pir bo'lgan holda emas, balki ehtiyotkorlik bilan foydalanish kerak bo'lgan narsa. Shunday ekan, bilingki, visudo va sudoedit ham mavjud!

Agar siz ushbu postdan biror narsani olib tashlasangiz, hech qachon hech narsa uchun sudo npm ni bajarishingiz shart emas.

Aytgancha, u "sue doo" deb talaffuz qilinadi.

Dastlab 2015-yil 9-aprelda blog.explosion-pills.com saytida chop etilgan.