npm melempar kesalahan tanpa sudo

1288

Saya baru saja menginstal node dan npm melalui paket di nodejs.org dan setiap kali saya mencoba mencari atau menginstal sesuatu dengan npm ia melempar kesalahan berikut, kecuali saya sudo perintah. Saya merasa ini adalah masalah izin? Saya sudah menjadi admin.

npm ERR! Error: EACCES, open '/Users/chietala/.npm/-/all/.cache.json'
npm ERR!  { [Error: EACCES, open '/Users/chietala/.npm/-/all/.cache.json']
npm ERR!   errno: 3,
npm ERR!   code: 'EACCES',
npm ERR!   path: '/Users/chietala/.npm/-/all/.cache.json' }
npm ERR! 
npm ERR! Please try running this command again as root/Administrator.

npm ERR! System Darwin 12.2.0
npm ERR! command "node" "/usr/local/bin/npm" "search" "bower"
npm ERR! cwd /Users/chietala
npm ERR! node -v v0.10.4
npm ERR! npm -v 1.2.18
npm ERR! path /Users/chietala/.npm/-/all/.cache.json
npm ERR! code EACCES
npm ERR! errno 3
npm ERR! stack Error: EACCES, open '/Users/chietala/.npm/-/all/.cache.json'
npm ERR! 
npm ERR! Additional logging details can be found in:
npm ERR!     /Users/chietala/npm-debug.log
npm ERR! not ok code 0
Chad
sumber
35
Silakan pertimbangkan solusi menggunakan NVM : stackoverflow.com/a/24404451/1480391 (alih-alih meretas dengan izin)
Yves M.
2
@ janaspage Anda tidak dapat menginstal node atau NVM (Node Version Manager) melalui NPM (Node Package Manager), itu tidak masuk akal. NPM hadir dalam node (diinstal pada waktu yang sama). Lihatlah halaman Wikipedia: en.wikipedia.org/wiki/Npm_(software)
Yves M.
5
Akhirnya sebuah solusi yang lebih baik daripada sudo chown: github.com/sindresorhus/guides/blob/master/…
Dmitri Zaitsev
Di bawah OSX dan menginstal node dengan 0 pall resmi, solusi ini tidak berfungsi. Saya menggunakan yang ini sebagai gantinya: stackoverflow.com/a/34968008/675565
fmquaglia
2
Ini menjelaskan masalah dan perbaikannya: docs.npmjs.com/getting-started/fixing-npm-permissions
n00b

Jawaban:

2269

Ini terlihat seperti masalah izin di direktori rumah Anda. Untuk mendapatkan kembali kepemilikan dari direktori .npm , jalankan:

sudo chown -R $(whoami) ~/.npm
Nuh
sumber
102
Saya pikir itu whoamiadalah placeholder, tetapi bekerja diketik secara harfiah apa adanya, jadi itu harus variabel yang saya tidak mengerti.
Sederhana
127
whoami adalah perintah shell aktual en.wikipedia.org/wiki/Whoami . The backticks di sekitar whoamimemastikan bahwa itu dijalankan dengan benar dan kemudian ditempatkan ke dalam perintah chown
Noah
13
Anda juga bisa menentukan nama pengguna secara manual. Jika nama pengguna Anda "simpleascouldbe", perintahnya adalahsudo chown -R simpleascouldbe ~/.npm
Noah
13
npm TIDAK memerlukan atau seharusnya Anda menggunakan sudo - lihat jawaban di bawah ini @HeberLZ khususnya pilihan ke-2 mengenai: ./configure --prefix = xxxxxx
Scott Stensland
9
@ChristopherWill: Ini tidak mengubah kepemilikan direktori sistem. Ini mengubah kepemilikan direktori di direktori home pengguna, yang harus dimiliki oleh pengguna.
user4815162342
620

Izin yang Anda gunakan saat memasang Node akan diperlukan saat melakukan hal-hal seperti menulis di direktori NPM ( npm link, npm install -g, dll).

Anda mungkin menjalankan instalasi node dengan izin root, itu sebabnya instalasi paket global meminta Anda untuk menjadi root.


Solusi 1: NVM

Jangan meretas dengan izin, instal simpul dengan cara yang benar.

Pada mesin pengembangan, Anda tidak boleh menginstal dan menjalankan node dengan izin root, jika tidak hal-hal seperti npm link, npm install -gakan membutuhkan izin yang sama.

NVM (Node Version Manager) memungkinkan Anda untuk menginstal Node tanpa izin root dan juga memungkinkan Anda untuk menginstal banyak versi Node untuk bermain dengan mudah dengan mereka .. Sempurna untuk pengembangan.

  1. Copot Node (izin root mungkin akan diperlukan). Ini mungkin bisa membantu Anda.
  2. Kemudian instal NVM petunjuk berikut di halaman ini .
  3. Instal Node melalui NVM: nvm install node

Sekarang npm link, npm install -gtidak lagi mengharuskan Anda untuk menjadi root.

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


Solusi 2: Instal paket secara global untuk pengguna tertentu

Jangan meretas dengan izin, instal paket npm secara global dengan cara yang benar.

Jika Anda menggunakan OSX atau Linux, Anda dapat membuat direktori khusus pengguna untuk paket dan pengaturan global Andanpm dan nodeuntuk mengetahui cara menemukan paket yang diinstal secara global.

Lihatlah artikel hebat ini untuk petunjuk langkah demi langkah tentang pemasangan modul npm secara global tanpa sudo.

Lihat juga: dokumentasi npm tentang Memperbaiki izin npm .

Yves M.
sumber
32
Dari semua solusi yang diposting solusi NVM di sini memberikan hasil terbaik bagi saya. Sangat merekomendasikan menggunakan NVM daripada mempermainkan izin.
wenincode
9
Instruksi ini bekerja dengan sangat baik. Namun Anda mungkin ingin menghapus modul-modul yang telah Anda instal dengan sudo sebelum mencopot nodejs : npm ls -gp | awk -F/ '/node_modules/ && !/node_modules.*node_modules/ {print $NF}' | xargs npm -g rm- Saya harus menginstal ulang nodejs dan di dalam shell root dan mencopotnya, jika tidak, Anda akan terus memiliki symlink ke yo, grunt, dll…
Bruno Flávio
4
Ini adalah solusi terbaik, saya menghapus semua modul terlebih dahulu melakukan sudo npm list -g --depth=0. | awk -F ' ' '{print $2}' | awk -F '@' '{print $1}' | sudo xargs npm remove -g stackoverflow.com/a/22290968/1449157 dan kemudian dihapus npmdan diinstal melaluinvm
Fabio Antunes
3
Untuk instruksi penghapusan instalan untuk node, gunakan jawaban SO ini stackoverflow.com/a/11178106/480031
seangates
3
Mengapa boleh menggunakan root untuk menginstal node pada mesin produksi?
Bruno Peres
401

Anda juga memerlukan izin menulis di node_modulesdirektori:

sudo chown -R $USER /usr/local/lib/node_modules
Xilo
sumber
7
Serta ~/tmpdirektori untuk saya.
knownasilya
123
Saya tidak tahu mengapa ini masih mengalami peningkatan. Ini adalah praktik yang sangat buruk untuk mengubah kepemilikan direktori sistem ke pengguna tertentu! Silakan lihat jawaban di bawah untuk solusi lain (seperti membuat grup terpisah untuk pengguna node).
Christopher Will
1
saya tidak punya node_modulesdi /usr/local/lib/. wtf?
Connor Leech
27
Apa pun yang Anda lakukan - BENAR-BENAR tidak menjalankan 'sudo chmod -R whoami' di / usr / local / lib atau / usr / lib / Anda akan merusak file sudoers Anda dan Anda akan membenci diri sendiri.
qodeninja
7
semua orang, harap unduh suara ini ... Then I ran sudo chown -R $USER /* and everything was fine- TIDAK - Anda merusak mesin Anda.
commonpike
75

Mengubah pemilik pada folder "sistem-global" adalah peretasan. Pada instalasi baru, saya akan mengkonfigurasi NPM untuk menggunakan lokasi yang sudah dapat ditulis untuk program "user-global":

npm config set prefix ~/npm

Kemudian pastikan Anda menambahkan folder itu ke jalur Anda:

export PATH="$PATH:$HOME/npm/bin"

Lihat @ErikAndreas ' jawaban untuk modul NPM tidak akan menginstal secara global tanpa sudo dan lagi panduan langkah-demi-langkah oleh @sindresorhus dengan juga set $MANPATH.

Joel Purra
sumber
Saya sangat setuju, kecuali saya menyarankan bahwa jika Anda hanya mengatur awalan untuk $HOMEmaka biasanya .profileskrip Anda akan menangani $PATHwaktu berikutnya Anda sumbernya (mis. Lain kali Anda masuk).
Jess Austin
@ JessAustin: Mungkin, tetapi juga akan membawa lebih banyak kekacauan pada Anda $HOMEdan mungkin mengganggu file / subfolder NPM lainnya (yang akan datang?). Lebih suka untuk menjaga binari dari manajer paket yang berbeda / bahasa / sistem build terpisah, dan secara eksplisit mengatur $PATH(dalam skrip waktu login) sebagai gantinya.
Joel Purra
Eh, kekacauan? Kita hanya berbicara tentang modul yang diinstal secara global di ~/lib/node_modules, dengan CLI terkait, jika ada, di ~/bin. Bagi banyak pengguna, terutama jika mereka tidak memiliki root, keduanya ~/bindan ~/libsudah ada.
Jess Austin
@JessAustin: ini juga masalah tabrakan nama untuk perpustakaan dan binari. Katakanlah Anda mengarahkan NPM untuk memasukkan binari ~/bindan kemudian melakukan hal yang sama untuk satu atau dua manajer paket tambahan. Itu mungkin tidak terjadi hari ini atau besok, tetapi ada risiko yang jelas bahwa dua paket dari manajer yang berbeda memiliki tabrakan nama dan menimpa file masing-masing. Itu kasus yang cukup baik bagi saya untuk memiliki awalan yang terpisah. (Contoh konkret akan dihargai.)
Joel Purra
1
Ini harus diterima sebagai jawaban terbaik. Mengubah folder sistem-global bisa berbahaya.
Vladimir Marton
58

Saya mengalami ini ketika menginstal Recess ( https://github.com/twitter/recess ) untuk mengkompilasi CSS saya untuk Bootstrap 3.

Saat memasang reses:

-npm install recess -g
  1. Anda perlu membuka kunci izin di homedirektori Anda , seperti kata Nuh :

    sudo chown -R `whoami` ~/.npm
  2. Anda juga perlu menulis izin ke node_modulesdirektori, seperti kata Xilo , jadi jika masih tidak berfungsi, coba:

    sudo chown -R `whoami` /usr/local/lib/node_modules
  3. Jika Anda masih melihat kesalahan, Anda mungkin perlu memperbaiki /usr/localizin :

    sudo chown -R `whoami` /usr/local

Harap dicatat bahwa sebagaimana ditunjukkan dalam posting /usr/local/ ini sebenarnya bukan sistem dir jika Anda menggunakan Mac, jadi, jawaban ini sebenarnya "aman" untuk pengguna Mac. Namun, jika Anda menggunakan Linux, lihat jawaban Christopher Will di bawah ini untuk solusi multi-user friendly, system dir safe (tetapi lebih kompleks).

danomarr
sumber
35
Ini ide yang buruk. Anda mungkin tidak ingin direktori sistem dimiliki oleh pengguna tertentu. Selain masalah keamanan serius, ini juga tidak kompatibel dengan banyak pengguna.
Christopher Will
2
Ya tapi itu solusi hebat untuk lingkungan pengembangan +2, terutama jika Anda telah menginstal node.js dan hanya perlu terus bergoyang!
elliotrock
Anda benar-benar tidak boleh memiliki paket di luar direktori home Anda
Ben
1
Jika tidak ada di folder rumah Anda, itu adalah direktori sistem, meskipun ada klaim yang bertentangan. Hanya karena itu tidak digunakan oleh OS X tidak berarti itu bukan direktori sistem.
kaya remer
53

Awas!!! Awas!!! Awas!!!

chown atau chmod BUKAN solusinya, karena risiko keamanan.

Alih-alih melakukan ini, lakukan:

Cek pertama, di mana npm menunjuk ke, jika Anda menelepon:

npm config get prefix

Jika / usr dikembalikan, Anda dapat melakukan hal berikut:

mkdir ~/.npm-global
export NPM_CONFIG_PREFIX=~/.npm-global
export PATH=$PATH:~/.npm-global/bin

Ini membuat Direktori-npm di Direktori-Rumah Anda dan titik npm .

Agar perubahan ini permanen, Anda harus menambahkan perintah ekspor ke .bashrc Anda:

echo -e "export NPM_CONFIG_PREFIX=~/.npm-global\nexport PATH=\$PATH:~/.npm-global/bin" >> ~/.bashrc
suther
sumber
haruskah saya hanya beralih ke opsi 2 jika punya / usr?
Albert Laure
3
Perhatikan bahwa perintah terakhir sebenarnya menampilkan konten $PATH, bukan string itu sendiri. Anda harus mengubahnya.
Veluria
1
Ini memperbaikinya! Terima kasih. Saya mendapat 'izin ditolak, putuskan tautan' / usr / bin / <pkg> '
valbaca
1
Ini jawaban terbaik. Ini cara yang disarankan untuk menyelesaikan masalah.
Paulo Coghi - Reinstate Monica
Mengapa mengunyah risiko keamanan?
Frank
40

Jawaban lain menyarankan untuk mengubah kepemilikan atau izin direktori sistem ke pengguna tertentu. Saya sangat tidak suka melakukannya, ini bisa menjadi sangat canggung dan mungkin mengacaukan seluruh sistem!

Berikut ini adalah pendekatan yang lebih umum dan lebih aman yang mendukung multi-pengguna juga.

Buat grup baru untuk pengguna simpul dan tambahkan pengguna yang diperlukan ke grup ini. Kemudian atur kepemilikan file / direktori yang bergantung pada node ke grup ini.

# Create new group
sudo groupadd nodegrp 

# Add user to group (logname is a variable and gets replaced by the currently logged in user)
sudo usermod -a -G nodegrp `logname`

# Instant access to group without re-login
newgrp nodegrp

# Check group - nodegrp should be listed as well now
groups

# Change group of node_modules, node, npm to new group 
sudo chgrp -R nodegrp /usr/lib/node_modules/
sudo chgrp nodegrp /usr/bin/node
sudo chgrp nodegrp /usr/bin/npm

# (You may want to change a couple of more files (like grunt etc) in your /usr/bin/ directory.)

Sekarang Anda dapat dengan mudah memasang modul sebagai pengguna

npm install -g generator-angular

Beberapa modul (grunt, bower, yo dll.) Masih perlu diinstal sebagai root. Ini karena mereka membuat symlink di / user / bin /.

Edit

3 tahun kemudian saya akan merekomendasikan untuk menggunakan Node Version Manager . Ini memberi Anda banyak waktu dan masalah.

Christopher Will
sumber
2
Jika node diinstal oleh sumber, meskipun multiuser akan menjadi masalah, semua modul akan bekerja dengan sempurna tanpa menggunakan sudo. Ini juga sangat penting karena dalam kasus modul yeoman, orang tidak dapat memperbarui generator melalui sudoing aplikasi yeoman karena tidak mengizinkan eksekusi sudo :(
HeberLZ
1
Di Linux, saya biasanya menggunakan staffgrup bawaan untuk memberikan izin ke folder dev saya. Juga, ide bagus untuk dijalankan chmod g+ws node_modulesuntuk memastikan bahwa grup Anda memiliki izin baca / tulis.
jackvsworld
@ jackvsworld Saya tidak mengetahui grup staf. Saya kira ini akan menjadi solusi yang lebih lancar, karena kita tidak harus membuat grup fiktif baru .. walaupun itu akan menjadi kurang eksplisit. Tapi terima kasih atas masukan ini.
Christopher Will
Secara umum, /usr/libberada di bawah kendali manajer paket sistem Anda dan Anda tidak boleh melakukan perubahan apa pun di sana.
rich remer
23

The dokumentasi resmi tentang cara untuk memperbaiki npm installperizinan dengan EACCESkesalahan terletak pada https://docs.npmjs.com/getting-started/fixing-npm-permissions .

Saya mengalami masalah ini setelah instalasi simpul menggunakan .pkginstaller pada OSX. Ada beberapa jawaban yang bagus di sini, tetapi saya belum melihat tautan ke npmjs.com.

Opsi 1: Ubah izin ke direktori default npm

  1. Temukan path ke direktori npm:

    npm config get prefix

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

PERINGATAN : Jika jalur yang ditampilkan hanya / usr , beralih ke Opsi 2 .

  1. 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 ).

Opsi 2: Ubah direktori default npm ke direktori lain

Ada saat-saat ketika Anda tidak ingin mengubah kepemilikan direktori default yang digunakan npm (yaitu / usr ) karena ini dapat menyebabkan beberapa masalah, misalnya jika Anda berbagi sistem dengan pengguna lain.

Sebagai gantinya, Anda dapat mengonfigurasi npm untuk menggunakan direktori yang berbeda sekaligus. Dalam kasus kami, ini akan menjadi direktori tersembunyi di folder rumah kami.

  1. Buat direktori untuk instalasi global:

    mkdir ~/.npm-global
  2. Konfigurasikan npm untuk menggunakan jalur direktori baru:

    npm config set prefix '~/.npm-global'
  3. Buka atau buat file ~ / .profile dan tambahkan baris ini:

    export PATH=~/.npm-global/bin:$PATH
  4. Kembali ke baris perintah, perbarui variabel sistem Anda:

    source ~/.profile
HoppyKamper
sumber
1
Terima kasih, yang ini bekerja untuk saya karena solusinya tidak. Kamu menyelamatkanku.
fmquaglia
haruskah saya hanya beralih ke opsi 2 jika punya / usr?
Albert Laure
Saya suka pilihan jawaban ini 2. (1) Tidak memiliki kerentanan keamanan menggunakan sudo, (2) mempertahankan arsitektur untuk pengguna lain, (3) referensi dokumentasi, DAN (4) memiliki baris perintah yang diperlukan entri disertakan. Terimakasih telah menambahkan!
Tom Rose
Jadi apa yang terjadi ketika Anda menginstal sesuatu yang disinkronkan /usr/bin/? Sekarang hanya pengguna Anda yang dapat mengaksesnya. Anda masuk sebagai orang lain, masih tidak memiliki akses, karena file tersebut sebenarnya ada di direktori home pengguna lain!
Frans
Bagus, ini bekerja untuk saya. Terima kasih atas penjelasannya selain perintahnya.
FrankByte.com
12

Seolah-olah kita membutuhkan lebih banyak jawaban di sini, tapi tetap saja ..

Sindre Sorus memiliki panduan Menginstal paket-paket npm secara global tanpa sudo pada OS X dan Linux yang menguraikan cara menginstal dengan bersih tanpa mengacaukan izin:

Berikut adalah cara untuk menginstal paket secara global untuk pengguna tertentu.

  1. Buat direktori untuk paket global Anda

    mkdir "${HOME}/.npm-packages"
  2. Referensi direktori ini untuk penggunaan di masa depan di .bashrc / .zshrc Anda:

    NPM_PACKAGES="${HOME}/.npm-packages"
  3. Tunjukkan ke npm tempat menyimpan paket Anda yang terinstal secara global. Dalam $HOME/.npmrcfile Anda tambahkan:

    prefix=${HOME}/.npm-packages
  4. Pastikan node akan menemukannya. Tambahkan yang berikut ini ke .bashrc / .zshrc Anda:

    NODE_PATH="$NPM_PACKAGES/lib/node_modules:$NODE_PATH"
  5. Pastikan Anda akan menemukan binari dan halaman manual yang diinstal. Tambahkan yang berikut ke .bashrc/ Anda .zshrc:

    PATH="$NPM_PACKAGES/bin:$PATH"
    # Unset manpath so we can inherit from /etc/manpath via the `manpath`
    # command
    unset MANPATH # delete if you already modified MANPATH elsewhere in your config
    MANPATH="$NPM_PACKAGES/share/man:$(manpath)"

Lihat npm-g_nosudo untuk melakukan langkah-langkah di atas secara otomatis

Periksa sumber panduan ini untuk mendapatkan pembaruan terbaru.

ptim
sumber
2
tx untuk edit @AndyHayden :) Metode pilihan saya disarankan dalam komentar di atas: gunakan NVM! stackoverflow.com/a/24404451/1480391
ptim
Satu-satunya solusi yang bekerja untuk saya yang tidak melibatkan mucking dengan izin. Aku benci NPM dan kebodohan izin idiotnya. Terima kasih atas solusinya!
RyanNerd
8

TL; DR

selalu gunakan sudo -iatau sudo -Hsaat menjalankan npm installuntuk menginstal paket global.

-

Saat Anda menggunakannya npm, unduh paket ke direktori home pengguna Anda. Ketika Anda menjalankan sebagai sudo, npminstal file ke direktori yang sama, tetapi sekarang file tersebut dimiliki oleh root.

Jadi inilah yang terjadi pada setiap orang yang pernah menggunakan npm:

  • instal beberapa paket lokal tanpa masalah menggunakan npm install foo
  • instal paket global menggunakan sudo install -g foo-clitanpa masalah
  • mencoba menginstal paket lokal dengan npm install bar
  • merasa frustrasi pada npmdesainer sekarang karena Anda harus pergi chmoddirektori lagi

Saat Anda menggunakan opsi -iatau -Hdengan sudo, direktori home Anda akan menjadi rootdirektori home. Instalasi global apa pun akan men-cache paket ke file yang /root/.npmbukan rootmilik di /home/me/.npm.

Selalu gunakan sudo -iatau sudo -Hketika menjalankan npm installuntuk menginstal paket global dan npmmasalah izin Anda akan mencair.

Untuk kebaikan.

http://hood.ie/blog/why-you-shouldnt-use-sudo-with-npm.html

- qv jawaban yang diterima untuk memperbaiki yang sudah kacau npm.

kaya remer
sumber
perbaikan terbaik dan sederhana
Manjeet Singh
6

Saya punya masalah serupa di modul NPM tidak akan menginstal secara global tanpa sudo , masalahnya adalah ketika saya menginstal node saya melakukannya dengan sudo melalui chris / lea ppa repo .

Solusi saya adalah meng-uninstall node dan kemudian menginstalnya 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 $ USER -R / usr / local

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

PD: Jika Anda tidak ingin mengubah kepemilikan folder / usr / local, Anda dapat menginstalnya di tempat yang sudah Anda miliki. Masalah dari pendekatan ini adalah bahwa Anda harus mengikat folder instalasi dengan baris perintah bash sehingga kita dapat menggunakan perintah node nanti

mkdir ~ / opt

./configure --prefix = ~ / opt && make && make install

echo 'export PATH = ~ / opt / bin: $ {PATH}' >> ~ / .bashrc #atau ~ / .profile atau ~ / .bash_profile atau ~ / .zshenv tergantung pada Sistem Operatif saat ini

Dengan salah satu dari pendekatan itu, Anda dapat melakukan hal berikut tanpa menggunakan sudo

npm instal -g module_to_install

HeberLZ
sumber
1
Saya akhirnya menggunakan metode ini. Apakah digunakan sudo chown $USER /use/localsebelum membangun. Terlihat bagus sejauh ini, saatnya mencoba membangun atom! Terima kasih!
prasanthv
6

Ketika Anda menjalankan npm install -g somepackage, Anda mungkin mendapatkan kesalahan EACCES yang meminta Anda untuk menjalankan perintah lagi sebagai root / Administrator. Ini masalah izin.

Sangat mudah untuk memperbaiki , buka terminal Anda (Aplikasi> Utilitas> Terminal)

sudo chown -R $USER /usr/local/lib/node_modules

** Saya sangat menyarankan Anda untuk tidak menggunakan manajemen paket dengan sudo (sudo npm -g instal sesuatu), karena Anda bisa mendapatkan beberapa masalah nanti **

Referensi: http://foohack.com/2010/08/intro-to-npm/

Juancarlos Rodríguez
sumber
Yay! yang ini melakukannya untuk saya! setelah melakukan yang lain lainnya di atas: sudo chown -R `whoami` ~/.npm, sudo chown -R `whoami` /usr/local/libdan
Regis Zaleman
8
Ini dapat menyebabkan masalah izin dengan banyak aplikasi lain, jadi saya sarankan tidak melakukan ini. Mengapa menukar satu kaleng cacing dengan yang lain?
Brad Parks
1
Atau setidaknya perbaiki ke / usr / local / lib / node_modules.
Ken
Ini, ini, dan lebih ini. Setelah membenturkan kepala ke dinding, ini berhasil. +1
dashard
Ini masalah saya. Pada macbook baru (os x 10.10.3), izin pada / usr / local / lib / node_modules adalah: $ ll / usr / local / lib / node_modules total 0 drwxr-xr-x 3 24561 roda 102B 31 Mar 31:19 . drwxrwxr-x 4 24561 admin 136B 31 Mar 18:19 .. drwxr-xr-x 26 65534 staf 884B 13 April 13 10:53 siang
tkane2000
5

Untuk Mac (diadopsi dari jawaban Christoper Will)

Mac OS X 10.9.4

  1. Preferensi Sistem> Pengguna & Grup> (membuka kunci)> tekan +:

    Akun Baru>
    Nama Grup "Grup" : nodegrp

    Setelah membuat grup, centang pengguna untuk dimasukkan dalam grup ini

  2. sudo chgrp -R nodegrp / usr / local / lib / node_modules /
    sudo chgrp nodegrp / usr / bin / node
    sudo chgrp nodegrp / usr / bin / npm
    sudo chown -R $ (whoami): nodegrp ~ / .npm

ken
sumber
1
Saya harus mengubah beberapa jalur ke / usr / local / bin tetapi selain itu solusi ini bekerja sangat baik pada mesin OX X 10.9 saya - terima kasih!
splig
Praktik buruk untuk mengubah kepemilikan direktori sistem.
kaya remer
@ Richremer Saya pikir itu tergantung pada apa yang Anda coba capai. jika folder ini awalnya hanya dapat diakses oleh sudoer maka hanya dapat diubah dengan cara ini. kami membatasi perubahan ke folder yang terkait dengan npm. Apakah lebih aman untuk tetap melakukan sudoatau mengubah kepemilikan grup folder tersebut sehingga dapat dimodifikasi oleh pengguna normal? Jika pengguna normal tidak seharusnya melakukan tindakan apa pun pada folder ini maka tentu saja tidak boleh mengubah kepemilikan grup folder tersebut.
ken
Hal yang tepat untuk dilakukan adalah menginstal paket global dengan sudo, tetapi lakukan dengan -Hflag. Secara khusus sudo -H npm install -g <pkg>,. Ini memastikan penggambaran izin yang tepat untuk folder sistem dan pengguna. Apa yang tidak ingin Anda lakukan adalah menggunakan sudo npm install -g, karena ini menginstal file yang dimiliki root ke direktori pengguna Anda. Akan lebih bagus jika npm cukup pintar untuk melakukan ini dengan cara yang benar, tetapi tidak, jadi Anda harus menggunakan -Hflag sudo untuk menginstal dengan benar secara global.
kaya kaya
4

Dalam kasus saya, itu karena izin ~ / tmp. Jadi saya lakukan:

sudo chown -R $USER ~/tmp

Dan tidak apa-apa!

bnPysse
sumber
4

Bagi saya, jalankan saja

sudo chown -R $(whoami) ~/.npm

tidak bekerja Lalu, saya mengeksekusi juga

sudo chown -R $(whoami) /usr/lib/node_modules/
sudo chown -R $(whoami) /usr/bin/node
sudo chown -R $(whoami) /usr/bin/npm

Dan semuanya bekerja dengan baik!

pengguna3753202
sumber
Anda sangat luar biasa pak :)
user805981
File dalam /usr/libadalah file sistem dan tidak boleh dimiliki oleh akun pengguna pribadi Anda.
Pengingat kaya
4

ISU : Anda (pengguna) tidak memiliki set izin yang tepat untuk direktori.

Jalan keluar instan adalah menjalankan instalasi npm menggunakan sudo, tetapi ini dapat memberi Anda kesalahan yang sama, atau instalasi yang tidak tepat.

DAN mengubah kepemilikan direktori bukanlah pilihan yang baik, tambalan sementara.


Solusi / Saran : Ubah Direktori Default npm (dari dokumen resmi )

Cadangkan komputer Anda sebelum melanjutkan.

(opsional) Jika Anda memiliki instalasi yang salah, copot dulu:

npm uninstall <package-name>  # use sudo if you used it while installation
npm cache verify  # or, npm cache clean for npm version below 5.x.x 
  1. Buat direktori untuk instalasi global:

    mkdir ~/.npm-global

  2. Konfigurasikan npm untuk menggunakan jalur direktori baru:

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

  3. Buka atau buat file ~/.profileatau ~/.bash_profiledan tambahkan baris ini:

    export PATH=~/.npm-global/bin:$PATH

  4. Kembali ke baris perintah, perbarui variabel sistem Anda, atau restart terminal:

    source ~/.profile

  5. (opsional) Uji: Unduh paket secara global tanpa menggunakan sudo.

    npm install -g jshint

Nabeel Ahmed
sumber
3

Dalam hal sudo chown -R $(whoami) ~/.npm tidak bekerja untuk Anda, atau Anda memerlukan solusi perintah non terminal.

Masalahnya adalah bahwa akun pengguna Anda tidak memiliki izin menulis ke folder node_modules, sehingga Anda dapat melakukan hal berikut

  1. Buka pencari dan tekan cmd+ shift+ gini akan membuka buka folder dengan url

  2. Tulis jalur berikut /usr/local/lib/node_modulesdan tekan go

  3. Klik kanan pada node_modulesfolder dan pilihGet Info

  4. Gulir ke bawah ke sharing & permissionsbagian

  5. Buka kunci untuk dapat melakukan perubahan.

  6. Tekan +dan tambahkan akun pengguna Anda

  7. Pastikan Anda memilih Read & Writedrop down privilege

Sekarang Anda harus dapat menginstal paket tanpa sudodan masalah izin harus diselesaikan

Amr Labib
sumber
3

Masalah: Anda tidak memiliki izin untuk menulis ke direktori yang digunakan npm untuk menyimpan paket dan perintah global.

Solusi: Izinkan izin untuk npm.

Buka terminal:

perintah + bilah spasi lalu ketik 'terminal'

Masukkan perintah ini:

sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share}
  • Catatan: ini membutuhkan kata sandi Anda.

Solusi ini memungkinkan izin untuk HANYA direktori yang diperlukan, menjaga direktori lain tetap bagus dan aman.

Mat
sumber
Menurunkan karena pengaturan kepemilikan pengguna dari folder sistem adalah anti-pola dan ini tidak diperhitungkan. Dalam kasus khusus yang npm config get prefixmengembalikan sesuatu di folder rumah, solusi ini akan memperbaiki izin, tetapi tidak mengatasi masalah mendasar menginstal paket global dengan cara yang aman untuk lingkungan bersama.
Pengingat kaya
Ini akan menulis ulang izin sebagian besar sistem operasi. Menjalankan ini di Ubuntu misalnya akan menghasilkan "sudo" perintah itu sendiri menjadi tidak dapat digunakan.
Sahand Seifi
2

Perbaikan hebat lainnya di sini untuk mengkonfigurasi NPM dengan benar, jalankan perintah berikut:

npm config set prefix '~/.npm_packages'
PATH=$PATH:$HOME/.npm_packages/bin; export PATH
Guillaume Le Mière
sumber
2

Anda bisa mencoba ini, berfungsi di ubuntu dan mac

sudo chown -R $(whoami) /usr/local/lib/node_modules
Adeojo Emmanuel IMM
sumber
1
Saya menjalankan ini dan bekerja 100% untuk saya di mac: sudo chown -R $ (whoami) / usr / local / lib / node_modules
leeroya
1

Apa yang bagi saya sepertinya pilihan terbaik adalah yang disarankan dalam dokumentasi npm , yang pertama memeriksa di mana global node_modules diinstal secara default dengan menjalankan npm config get prefix. Jika Anda mendapatkan, seperti yang saya lakukan pada Trusty,/usr Anda mungkin ingin mengubahnya ke folder yang dapat Anda miliki dengan aman tanpa mengacaukan segalanya seperti yang saya lakukan.

Untuk melakukannya, pilih atau buat folder baru di sistem Anda. Anda mungkin ingin memilikinya di direktori home Anda atau, seperti saya, di bawah /usr/localuntuk konsistensi karena saya juga pengguna Mac (saya lebih suka tidak perlu melihat ke tempat yang berbeda tergantung pada mesin yang kebetulan saya berada di depan). Alasan lain yang baik untuk melakukan itu adalah kenyataan bahwa /usr/localfolder tersebut mungkin sudah ada di PATH Anda (kecuali jika Anda ingin dipusingkan dengan PATH Anda) tetapi kemungkinan folder Anda yang baru dibuat tidak dan Anda harus menambahkannya ke PATH diri Anda di file .bash-profil atau .bashrc Anda .

Singkatnya, saya mengubah lokasi default dari modul global dengan npm config set prefix '/usr/local', membuat folder /usr/local/lib/node_modules(akan digunakan oleh npm) dan mengubah izin untuk folder yang digunakan oleh npm dengan perintah:

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

Sekarang Anda dapat menginstal modul apa pun secara global dengan aman. Semoga ini membantu!

yago
sumber
1

Inilah cara saya memecahkan masalah pada Windows 8.1:

  • Pergi ke instal nodejs Anda (biasanya C: \ Program Files \ nodejs)
  • Klik kanan folder node_modules dan pergi ke properti
  • Klik tab Keamanan dan lanjutkan
  • Di bagian atas Anda akan melihat "Pemilik: SISTEM", klik ubah
  • Masukkan pengguna yang Anda inginkan izinnya dan klik Ok
  • Centang kotak di bagian bawah pengaturan lanjutan "Ganti semua entri izin objek anak dengan entri izin yang dapat diwarisi dari objek ini" dan klik ok
  • Lakukan apa saja instal / perbarui npm yang Anda butuhkan
KCaradonna
sumber
1

Solusi terbaik adalah ini yang disediakan oleh dokumentasi npm.


Untuk Ubuntu solusi yang disarankan adalah Opsi # 2

Langkah singkat:
Buat direktori untuk instalasi global:
mkdir ~/.npm-global

Konfigurasikan npm untuk menggunakan jalur direktori baru: dapat membantu Anda memverifikasi apakah awalan telah diperbarui atau tidak. Hasilnya adalah <Direktori Beranda Anda> /. Npm-global
npm config set prefix '~/.npm-global'
npm config get prefix

Buka atau buat file ~ / .profile dan tambahkan baris ini:
export PATH=~/.npm-global/bin:$PATH

Kembali ke baris perintah, perbarui variabel sistem Anda:
source ~/.profile

Alih-alih langkah 2-4 Anda juga dapat menggunakan variabel ENV yang sesuai (mis. Jika Anda tidak ingin memodifikasi ~ / .profile):

NPM_CONFIG_PREFIX=~/.npm-global


Untuk Mac solusi yang disarankan adalah Opsi # 3

Pada Mac OS Anda dapat menghindari masalah ini sama sekali dengan menggunakan manajer paket Homebrew

brew install node

Himanshu
sumber
NPM_CONFIG_PREFIX ini tidak akan berfungsi. Ini adalah kesalahan dalam npm-descriptiton. Lihat posting saya di atas, bagaimana melakukannya dengan cara yang benar: stackoverflow.com/a/41395398/1256697
suther
1

Saya mengatasinya dengan mengubah pemilik dari root ke nama pengguna saya

sudo chown -R me:me /home/me/.config/configstore/

ubah saya dengan nama pengguna dan grup Anda.

Salem
sumber
1

Saya suka menggunakan grup ubuntu untuk mencapai ini alih-alih mengubah pemilik. Cukup sederhana.

  1. Pertama instal nodejs dan npm menggunakan apt-get

    sudo apt-get update && sudo apt-get install nodejs npm

  2. Cari tahu siapa yang masuk yaitu nama pengguna, jalankan perintah berikut untuk melihatnya di terminal

    whoami

  3. Anda dapat melihat daftar grup yang ditugaskan dengan menggunakan perintah yang sangat sederhana, biasanya grup pertama adalah nama pengguna Anda sendiri

    groups

  4. Jalankan berikut untuk memungkinkan akses ke pengguna yang masuk

    sudo chmod 777 -R /usr/local && sudo chgrp $(whoami) -R /usr/local

  5. Perbarui npm dan nodejs

    npm install -g npm

Anda diatur, pengguna Anda dapat menjalankan perintah npm tanpa sudo

Anda juga dapat merujuk ke tautan ini https://askubuntu.com/a/1115373/687804

Gitesh Dalal
sumber
0

Pada Mac OS X, ketika menginstal dengan Homebrew brew install npm , jalur instalasinya ada /usr/local/share/npm/pada keduanya bin/dan lib/node_modules/subfolder.

Menjalankan perintah ini untuk mengubah ke pemilik ke pengguna Anda yang saat ini login harus memperbaikinya semuanya, dan memungkinkan Anda untuk menginstal paket NPM global tanpa sudo.

sudo chown -R $USER ~/.npm /usr/local/share/npm/

Joel Purra
sumber
1
Saat ini saya akan merekomendasikan jawaban saya yang lain untuk pertanyaan yang menggunakan ini npm config.
Joel Purra
0

Sebenarnya, saya juga mengalami masalah yang sama. Saya menjalankan Ubuntu. Masalah saya muncul karena saya kehilangan kunci publik Ubuntu. Bahkan memperbarui sistem saya tidak terjadi. Itu memberi kesalahan GPG. Dalam hal ini, Anda bisa mendapatkan kembali kunci Anda dengan menggunakan perintah ini:

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys <key in GPG error>

Setelah itu npm berfungsi dengan baik!

sam100rav
sumber
0

John Papa menunjuk ke sejarah dan alasan di balik masalah ini dan memberikan perbaikan yang solid :

Langkah-langkah John Papa adalah:

  1. Gunakan brew untuk menginstal node tanpa npm
  2. Perbarui .bash_profile / .bashrc Anda agar npm dan node tahu di mana harus menginstal dan menemukan paket
  3. Gunakan brew untuk memperbarui simpul dan npm untuk memperbarui sendiri

Semoga ini bisa membantu yang penasaran!

kapal
sumber
0

Ini adalah solusi yang saya manfaatkan dan kerjakan. Saya mencoba menggunakan whoamitidak pernah berhasil.

sudo chown -R $USER /usr/local/lib/node_modules

kemudian

sudo chown -R $USER /usr/local/bin/npm

kemudian

sudo chown -R $USER /usr/local/bin/node

Casey Robinson
sumber
0

Jawaban Yves M. sangat mirip dengan solusi saya. Berikut adalah perintah yang saya gunakan, yang sedikit berbeda dari perintahnya.

curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.31.0/install.sh | bash

Kemudian permintaan untuk versi terbaru:

nvm ls-remote

Kemudian instal versi terbaru:

nvm install YOUR_VERSION_HERE

contoh

nvm install v5.8.0
Ryan Loggerythm
sumber