Modul NPM tidak akan menginstal secara global tanpa sudo

126

Saya baru saja menginstal ulang Ubuntu 12.04 LTS, dan sebelum hal lain saya lakukan langkah-langkah ini :

  1. Node yang diinstal melalui manajer paket dengan skrip berikut

    sudo apt-get update
    
    sudo apt-get install python-software-properties python g++ make
    
    sudo add-apt-repository ppa:chris-lea/node.js
    
    sudo apt-get update
    
    sudo apt-get install nodejs
  2. Mencoba memasang yeoman, express, n, generator yeoman secara global dan semuanya mengembalikan kesalahan yang sama

    npm ERR! Galat: EACCES, symlink '../lib/node_modules/n/bin/n'

    npm ERR! {[Kesalahan: EACCES, symlink '../lib/node_modules/n/bin/n'] errno: 3, kode: 'EACCES', path: '../lib/node_modules/n/bin/n'}}

    npm ERR!

    npm ERR! Silakan coba jalankan perintah ini lagi sebagai root / Administrator.

    npm ERR! Sistem Linux 3.8.0-29-generik

    npm ERR! perintah "/ usr / bin / node" "/ usr / bin / npm" "instal" "-g" "-d" "n"

    npm ERR! cwd / home / heberlz

    npm ERR! simpul -v v0.10.20

    npm ERR! npm -v 1.3.11

    npm ERR! path ../lib/node_modules/n/bin/n

    npm ERR! kode EACCES

    npm ERR! errno 3

    npm ERR! stack error: EACCES, symlink '../lib/node_modules/n/bin/n'

    npm ERR!

    npm ERR! Detail logging tambahan dapat ditemukan di:

    npm ERR! /home/heberlz/npm-debug.log

    npm ERR! bukan kode 0

  3. Kepemilikan kembali folder berikut secara rekursif ~ / .npm, / usr / lib / node, / usr / lib / node_modules, dan dari symlinks berikut / usr / bin / node, / usr / bin / nodejs sama sekali tidak berhasil

Saya perlu menginstal yeoman dan generatornya tanpa sudo agar tidak bermasalah nanti :(

HeberLZ
sumber
Terima kasih Phil, sekarang terlihat jauh lebih baik
HeberLZ
2
Jika Anda ingin npm menginstal paket global dalam $ HOME daripada / usr, ikuti panduan github.com/sindresorhus/guides/blob/master/…
Kolonel Panic
inilah yang bekerja untuk saya github.com/nodejs/node-v0.x-archive/issues/… :ln -s /usr/bin/nodejs /usr/bin/node
Loïc MICHEL
Kemungkinan duplikat kesalahan melempar npm tanpa sudo
Louis

Jawaban:

318

Ubuntu 12.04 dan menggunakan PPA Chris Lea untuk menginstal karya-karya berikut untuk saya:

npm config set prefix '~/.npm-packages'

dan menambahkan $ HOME / .npm-packages / bin ke $ PATH

tambahkan ke .bashrc

export PATH="$PATH:$HOME/.npm-packages/bin"

lihat https://stackoverflow.com/a/18277225 dari @passy

ErikAndreas
sumber
9
Ini terlihat seperti solusi yang jauh lebih bersih. Jika Anda tidak menyukai folder sistem di direktori home Anda, Anda juga bisa menggunakan lokasi seperti ~ / .local / share / npm.
JeroenHoek
Perlu dicatat bahwa setelah Anda mengubah awalan, Anda harus menginstal ulang semua modul global yang telah Anda instal sebelumnya, termasuk npm itu sendiri.
Dziamid
Ini tampaknya baik-baik saja, tetapi saya merasa jauh lebih mudah untuk memberikan izin kepada pengguna untuk menulis /usr/lib/node_modules/. Atau mungkin bahkan tepat untuk membuat grup unix nodejs dan memberikan izin grup itu untuk menulis ke direktori itu.
mehulkar
Satu detail kecil untuk ditambahkan adalah Anda harus membuat direktori ~ / npm sendiri. Selain itu, npm akan keluar dengan kesalahan ENOENT.
Jason Farnsworth
6
Mengapa ini bukan default untuk npm? Terima kasih telah berbagi.
Dorian
23

Jika sudah ada $HOME/bindi jalur Anda, solusi yang lebih sederhana hanyalah ...

npm config set prefix ~
  • Perintah node baru sekarang akan diinstal ke $HOME/bindirektori Anda .
  • Tidak perlu mengubah jalur Anda!

Karena diskusi ini benar-benar tentang mengurangi risiko keamanan menjalankan sudo, Anda juga harus menyadari bahwa setiap aplikasi simpul berpotensi menginstal nama aplikasi yang tidak cocok dengan nama paket simpul terdaftar yang Anda pikir Anda pasang. Jadi ada risiko keamanan yang npm installakan menggantikan perintah sistem yang ada atau yang sudah Anda miliki $HOME/bin. Jika Anda khawatir, periksa bin, dan scriptsproperti di package.jsonfile aplikasi yang Anda instal terlebih dahulu.

Secara umum, ini paling aman untuk:

  • (a) Tempatkan $HOME/binterakhir di jalur Anda sehingga perintah sistem tidak digantikan.
  • (b) jangan sertakan "." atau jalur relatif di Anda $PATHsehingga Anda tidak secara tidak sengaja menjalankan perintah yang kebetulan berada di direktori saat ini.

Referensi:

Tony O'Hagan
sumber
1
Masalah keamanan penting lainnya npmadalah kode sumber yang Anda lihat pada github.comrepo untuk paket node mungkin bukan kode yang sama dengan yang Anda instal dari npm.orgserver registri!
Tony O'Hagan
Sementara secara teori paket node yang dibuat dengan baik akan dengan senang hati menginstal ~/bin, beberapa paket node (atau paket dependen mereka) hanya telah diuji sebagai instalasi dengan sudojadi sadarilah bahwa Anda mungkin menghadapi masalah "lingkungan instalasi" yang belum teruji. Seperti masalah lingkungan lainnya (seperti perubahan OS) prinsip "tulis sekali, uji di mana-mana" masih berlaku.
Tony O'Hagan
Kerugian dari metode ini adalah npm membuat direktori tambahan, yang disebut ~ / lib. Bergantung pada praktik organisasi Anda, ini mungkin tidak diinginkan.
Tn. S
13

Adapun Oktober 2014:

Node.js tersedia dari repositori distribusi biner NodeSource Debian dan Ubuntu .

curl -sL https://deb.nodesource.com/setup | sudo bash -
sudo apt-get install -y nodejs

Itu dia.

Jawaban usang:

Cara tercepat tanpa menggunakan sudo seperti dijelaskan di sini oleh isaac

Saya sangat menyarankan Anda untuk tidak melakukan manajemen paket dengan sudo! Paket dapat menjalankan skrip sewenang-wenang, yang membuat sudoing perintah manajer paket seaman potongan rambut gergaji. Tentu, ini cepat dan pasti akan memotong semua hambatan, tetapi Anda mungkin benar-benar ingin hambatan itu tetap ada.

Saya sarankan melakukan ini sekali sebagai gantinya:

sudo chown -R $USER /usr/local

EDIT:

Ada beberapa kekhawatiran keamanan dan batasan fungsionalitas terkait perubahan kepemilikan / usr / lokal ke pengguna saat ini:

Karena itu, jika Anda ingin menginstal modul global tanpa menggunakan sudo, saya tidak melihat solusi yang lebih baik (dari sudut pandang pragmatis) daripada yang disebutkan. Keamanan vs kemudahan penggunaan adalah topik yang sangat luas, dan tidak ada jawaban mudah untuk itu - itu hanya tergantung pada kebutuhan Anda.

Andrei Karpushonak
sumber
23
Ini adalah ide yang buruk karena membuat semua / usr / local milik pengguna tunggal.
Reed G. Law
4
Seperti yang ditunjukkan oleh ReedG.Law, ini benar-benar ide yang buruk. Jangan mengubah kepemilikan hte dari / usr / lokal ke pengguna tertentu.
Christopher Will
3
Saya harus setuju dengan Reed G Law - mengubah / usr / local adalah ide yang BURUK BURUK. Dalam kasus saya, saya melihat arah dan melakukannya: kemudian ingat bahwa saya harus BERBAGI dengan orang lain yang melakukan pengembangan. Saya kembali dan (semoga) mendapat semua perubahan. Ini bukan hanya keamanan, tetapi juga fungsionalitas.
Lloyd Sargent
3
Apakah ada kerugian untuk solusi ini jika hanya ada satu pengguna pada sistem?
connorbode
2
Maaf, berarti /usr/local/lib/node_modulesdannode
Creynders
11

Masalahnya adalah saya menginstal node menggunakan sudo , untuk menghindari kesalahan ketika menginstal modul npm secara global satu HARUS TIDAK PERNAH menginstal node dengan sudo.

Solusi saya adalah menginstal ulang simpul dengan cara ini:

Unduh sumber node stabil terbaru dari nodejs.org #dalam kasus saya node-v0.10.20.tar.gz

tar -zxf node-v0.10.20.tar.gz #uncompress sources

cd node-v0.10.20 #memasukkan folder terkompresi

sudo chown -R $ USER / usr / local

./configure --prefix = / usr / local && make && install

Satu hal yang perlu diperhatikan adalah bahwa hanya mengambil kepemilikan dari folder / usr / local tidak akan berfungsi dalam kasus saya karena instalasi node itu sendiri dibuat dengan sudo

Langkah terakhir untuk menginstal yeoman: # walaupun di yeoman.io dikatakan bahwa melakukan "npm install -g yo" sudah menginstal bower dan grunt, ada beberapa submodul grunt yang gagal, jadi saya memperbaikinya dengan menginstalnya sendiri

npm install -g bower

npm install -g grunt

npm instal -g yo

npm instal -g generator-angular

HeberLZ
sumber
Besar secara teori, tetapi apakah ada cara untuk mencapai efek yang sama tanpa dipaksa untuk membangun Node dan menginstal 4 modul tambahan hanya untuk memiliki akses ke modul secara global?
Dan Nissenbaum
Jawaban yang dipilih berfungsi sesuai kebutuhan Anda. Inilah yang saya lakukan 2 tahun lalu ketika belum ada solusi publik lainnya, tetapi sekarang tidak ada gunanya
HeberLZ
5

Saya memecahkan masalah ini dengan variabel lingkungan dan alias shell:

export NPM_PREFIX=$HOME/node
alias npmg="npm -g --prefix $NPM_PREFIX"

Bagi saya npm tidak menghormati pengaturan konfigurasi "awalan" di .npmrc.

santervo
sumber
2

Menurut pos SO serupa ini: npm melempar kesalahan tanpa sudo

Sepertinya Anda mungkin memiliki masalah kepemilikan dengan ~/.npmdirektori.

Seperti halnya jawaban dalam pertanyaan itu, cobalah:

sudo chown -R `whoami` ~/.npm
prasanthv
sumber
Sebenarnya ini tidak berfungsi seperti yang saya jelaskan pada langkah 3 tentang apa yang saya coba ketika saya tidak bisa membuatnya berfungsi, masalahnya adalah saya telah menginstal node menggunakan sudo, yang dalam keadaan tertentu dapat membuat masalah. Setelah saya menghapus simpul dan menginstalnya kembali dari sumbernya, semuanya mulai berfungsi seperti yang diharapkan!
HeberLZ
@ HeberLZ Saya pikir Anda benar, saya baru saja mencoba melakukan ini di komputer lain kemarin malam dan tidak berfungsi. Saya memiliki masalah izin lain untuk ditangani juga. Masih tidak yakin apa cara terbaik untuk tidak menjalankan npm instalasi dari sumber ini.
prasanthv
Tautkan ke pertanyaan di komentar atau tandai pertanyaan saat ini sebagai duplikat. Tidak membantu menyalin-menempelkan jawaban dari pertanyaan lain.
givanse
@HeberLZ downvote dari anwer ini tidak berlaku karena membahas judul pertanyaan yang Anda buat.
Sebastian Sastre
Saya tidak ingat ketika saya menurunkan jawaban, tetapi dalam kasus khusus saya apa yang Anda tulis tidak memperbaiki masalah, alasan mengapa saya pikir saya mungkin menurunkan jawaban. Seperti yang dinyatakan pada pertanyaan: "Kepemilikan yang direklamasi dari folder berikut secara rekursif ~ / .npm, / usr / lib / node, / usr / lib / node_modules, dan dari symlink berikut / usr / bin / node, / usr / bin / nodejs sama sekali tidak berhasil "Saya memang mencoba untuk mendapatkan kepemilikan .npm, dan semua folder lainnya tanpa hasil
HeberLZ
2

Temukan path ke direktori npm:

npm config get prefix

Untuk banyak sistem, ini akan menjadi / usr / lokal.

Ubah pemilik direktori npm menjadi nama pengguna saat ini (nama pengguna Anda!):

sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share}

Ini mengubah izin sub-folder yang digunakan oleh npm dan beberapa alat lainnya (lib / node_modules, bin, dan bagikan).

Ini tautan untuk detail lengkap

https://docs.npmjs.com/getting-started/fixing-npm-permissions

Monis Majeed
sumber
Vital. Cobalah untuk menghindari menambahkan bindan shareke dalam tanda kurung. Mengabaikan dapat menyebabkan perubahan kepemilikan folder ini ke pengguna saat ini dan masalah dengan menginstal paket baru ke sistem dengan sudokarena kepemilikannya akan berubah juga
A.Ametov
pujian ini menghancurkan semua sistem file saya: (
UA_
1

Jika Anda menggunakan mesin pengembang, Anda mungkin lebih baik mempertimbangkan menggunakan nvm .

Jika tidak, Anda hanya ingin menginstal menggunakan pengelola paket favorit Anda.

Apa pun masalahnya, saya sarankan memeriksa jawaban ini di stackoverflow

Iam Zesh
sumber
1

Sebenarnya, saya baru saja mengubah izin folder pengguna yang dimiliki oleh root:

sudo chown -R $USER ~/.config/configstore

Lalu aku bisa "npm install" dan "bower install" tanpa sudo! Bekerja dengan baik!

Vinggui
sumber
0

menggunakan lubuntu 14.04.3, saya mencoba mengubah kepemilikan awalan .npm dan npm, memperbarui jalur saya, npm memasang modul ke direktori home saya tanpa sudo tetapi jalurnya salah sehingga modul seperti bara tidak ditemukan, linuxbew memecahkan masalah, cepat panduan pengaturan di sini untuk node / npm

Conor
sumber
0

Masalah ini dan lainnya yang disebabkan oleh alasan yang sama dapat diselesaikan menginstal Node di ruang pengguna.

Anda dapat melakukannya hanya dengan menyalin dan menempel di terminal Anda

NODEJS_ROOT=${NODEJS_ROOT:-~/nodejs}
cd /tmp
wget -N http://nodejs.org/dist/node-latest.tar.gz && tar xzf node-latest.tar.gz
NODEJS_CURRENT=$(tar tf node-latest.tar.gz|head -1)
mkdir -p $NODEJS_ROOT/$NODEJS_CURRENT
cd $NODEJS_CURRENT
./configure --prefix=$NODEJS_ROOT/$NODEJS_CURRENT && make install
cd $NODEJS_ROOT
rm current 2> /dev/null # Removes current symbolic link, if any
ln -s $NODEJS_CURRENT current

Perintah yang sama dapat diluncurkan juga untuk membuat Node diperbarui ke versi terbaru.

Jangan lupa mengedit lingkungan Anda. Hanya sekali, lakukan

echo "export NODEJS_ROOT=$NODEJS_ROOT"            >> $HOME/.bash_profile
echo 'export PATH=$NODEJS_ROOT/current/bin:$PATH' >> $HOME/.bash_profile
source $HOME/.bash_profile # reload your env, so you can use node right now

Lihatlah artikel ini sebagai penjelasan tentang cara menginstal Node.js tanpa sudo .

Untuk solusi yang lebih umum tentang topik ini (mis. Instal perangkat lunak secara lokal) lihat dotsoftware .

Gianluca Casati
sumber
0

cukup gunakan nvm Anda akan dapat beralih secara dinamis antara berbagai versi simpul dan diinstal secara lokal untuk pengguna Anda. Tidak perlu sudo. Pastikan Anda telah sepenuhnya membersihkan simpul lama sebelumnya.

https://github.com/nvm-sh/nvm

Marko Nalis
sumber
-2

Solusi terbaik yang saya temukan adalah menginstal Node.js dari paket tar ke direktori home pengguna & menautkan lokasi folder lib. Inilah yang perlu Anda lakukan

Ini akan menginstal Nodejs di bawah ~ / .local / daripada default / usr / local /

Add this to your ~/.npmrc (create the file if it doesn't exist already):

root =    /home/YOUR-USERNAME/.local/lib/node_modules
binroot = /home/YOUR-USERNAME/.local/bin
manroot = /home/YOUR-USERNAME/.local/share/man
Download the Nodejs source code from nodejs.org and install it under your ~/.local tree:

tar xf node......
cd node........
./configure --prefix=~/.local
make
make install

Create ~/.node_modules symlink. (This directory will be automatically searched when you load modules using require "module" in scripts. I'm not sure why Node doesn't search ~/.local/lib/node_modules by default.)

cd
ln -s .local/lib/node_modules .node_modules
Is ~/.local/bin in your path? Type

which npm
If it says ~/.local/bin/npm, you're done.

Otherwise, do this...

export PATH=$HOME/.local/bin:$PATH
...and add that line to your ~/.profile file, so it'll run every time you log in.

Jika Anda masih mengalami kesalahan kepemilikan atau izin saat menginstal paket, maka ubah kepemilikan ~ / .local / dir dengan menjalankan

chown -R user:user ~/.local/

Sekarang Anda harus menginstal paket-paket melalui 'npm'

Catatan: SEMUA PERINTAH DI ATAS AKAN DIJALANKAN SEBAGAI PENGGUNA. JANGAN GUNAKAN SUDO ATAU ROOT LOGIN

PERNAH MENGUBAH PERIZINAN FOLDER DI BAWAH '/ USR / LIB /'. AKAN MENUJU OS YANG TIDAK STABIL

Shank_Transformer
sumber
-2

Saya menemukan penjelasan Pawel Grzybek sangat meyakinkan: Mereka mendidih menjadi 3 perintah sudo sederhana, tidak pernah harus menggunakan sudo lagi untuk instalasi npm global:

sudo chown -R $(whoami) /usr/local/lib/node_modules
sudo chown -R $(whoami) /usr/local/bin
sudo chown -R $(whoami) /usr/local/share
Frank Nocke
sumber