NPM modülleri sudo olmadan global olarak yüklenmez


126

Ubuntu 12.04 LTS'yi yeni yükledim ve her şeyden önce şu adımları yaptım :

  1. Aşağıdaki komut dosyasıyla paket yöneticisi aracılığıyla Node yüklendi

    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. Yeoman, express, n, yeoman'ın jeneratörlerini global olarak kurmaya çalıştım ve hepsi aynı hatayı döndürdü

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

    npm ERR! {[Hata: EACCES, symlink '../lib/node_modules/n/bin/n'] errno: 3, kod: 'EACCES', yol: '../lib/node_modules/n/bin/n'}

    npm ERR!

    npm ERR! Lütfen bu komutu kök / Yönetici olarak tekrar çalıştırmayı deneyin.

    npm ERR! Sistem Linux 3.8.0-29-jenerik

    npm ERR! komut "/ usr / bin / node" "/ usr / bin / npm" "install" "-g" "-d" "n"

    npm ERR! cwd / home / heberlz

    npm ERR! düğüm -v v0.10.20

    npm ERR! npm -v 1.3.11

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

    npm ERR! kod EACCES

    npm ERR! errno 3

    npm ERR! yığın Hatası: EACCES, symlink '../lib/node_modules/n/bin/n'

    npm ERR!

    npm ERR! Ek günlük kaydı ayrıntıları şurada bulunabilir:

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

    npm ERR! tamam değil kodu 0

  3. Aşağıdaki klasörlerin ~ / .npm, / usr / lib / node, / usr / lib / node_modules ve aşağıdaki sembolik bağların / usr / bin / node, / usr / bin / nodejs'nin yinelemeli mülkiyeti , kesinlikle başarı olmadan geri alındı

Daha sonra sorun yaşamamak için yeoman ve jeneratörlerini sudo olmadan kurmam gerekiyor :(


Teşekkürler Phil, şimdi çok daha iyi görünüyor
HeberLZ

2
Npm'nin global paketleri / usr yerine $ HOME'a yüklemesini istiyorsanız, github.com/sindresorhus/guides/blob/master/…
Albay Panic

bu benim için işe yarayan şeydi github.com/nodejs/node-v0.x-archive/issues/… :ln -s /usr/bin/nodejs /usr/bin/node
Loïc MICHEL

Olası npm
Louis

Yanıtlar:


318

Ubuntu 12.04 ve Chris Lea'nın PPA'sını kullanarak aşağıdaki işleri benim için yükleyin:

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

ve $ HOME / .npm-packages / bin 'i $ PATH yoluna eklemek

eklemek .bashrc

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

@passy'den https://stackoverflow.com/a/18277225 bakın


9
Bu çok daha temiz bir çözüme benziyor. Ana dizininizdeki sistem klasörlerini sevmiyorsanız, ~ / .local / share / npm gibi bir konum da kullanabilirsiniz.
JeroenHoek

Öneki değiştirdikten sonra, npm'nin kendisi de dahil olmak üzere önceden kurduğunuz tüm genel modülleri yeniden kurmanız gerektiğine dikkat edilmelidir.
Dziamid

Bu iyi görünüyor, ancak kullanıcıya yazma izni vermeyi çok daha kolay buldum /usr/lib/node_modules/. Ya da bir nodejs unix grubu oluşturmak ve bu gruba o dizine yazma izni vermek bile uygun olabilir.
mehulkar

Eklenti için bir küçük ayrıntı zorunda olduğunu yapmak ~ / npm dizini kendini. Aksi takdirde, npm ENOENT hatasıyla çıkacaktır.
Jason Farnsworth

6
Bu npm için neden varsayılan değil? Paylaşım için teşekkürler.
Dorian

23

Zaten $HOME/binyolunuzdaysa, daha basit bir çözüm sadece ...

npm config set prefix ~
  • Yeni düğüm komutları şimdi $HOME/bindizininize yüklenecek .
  • Yolunuzu değiştirmenize gerek yok!

Bu tartışma gerçekten çalıştırmanın güvenlik risklerini azaltmakla ilgili sudoolduğundan, herhangi bir düğüm uygulamasının, yüklemekte olduğunuzu düşündüğünüz kayıtlı düğüm paketi adıyla eşleşmeyen bir uygulama adı yüklüyor olabileceğini de bilmelisiniz. Dolayısıyla, npm installmevcut bir sistem komutunun veya zaten sahip olduğunuz bir komutun yerini alması gibi bir güvenlik riski vardır $HOME/bin. Endişeleniyorsanız, önce yüklediğiniz uygulamanın dosyasındaki bin, ve scriptsözelliklerini kontrol edin package.json.

Genel olarak en güvenli olanı:

  • (a) $HOME/binSistem komutlarının yerini almaması için yolunuzun sonunu yerleştirin.
  • (b) "" eklemeyin. veya sizin içinde herhangi bir göreceli yol, $PATHböylece yanlışlıkla geçerli dizinde olan bir komutu çalıştırmazsınız.

Referans:


1
Bir diğer önemli güvenlik sorunu, bir düğüm paketi için bir depoda npmgördüğünüz kaynak kodun github.com, npm.orgkayıt sunucusundan yüklediğiniz kodla aynı olmayabilir !
Tony O'Hagan

Teoride, iyi hazırlanmış bir düğüm paketi mutlu bir şekilde yüklenecek olsa da ~/bin, bazı düğüm paketleri (veya bunların bağımlı paketleri) yalnızca kurulurken test edilmiştir, sudobu nedenle test edilmemiş bir "kurulum ortamı" sorunuyla karşılaşabileceğinizi unutmayın. Diğer herhangi bir ortam sorunu gibi (işletim sisteminin değiştirilmesi gibi), "bir kez yaz, her yerde test et" ilkesi hala geçerlidir.
Tony O'Hagan

Bu yöntemin dezavantajı npm'nin ~ / lib adında ek bir dizin oluşturmasıdır. Organizasyon uygulamalarınıza bağlı olarak, bu arzu edilmeyebilir.
Bay S

12

Ekim 2014 itibarıyla:

Node.js, NodeSource Debian ve Ubuntu ikili dağıtım havuzlarında mevcuttur .

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

Bu kadar.

Eski cevap:

Sudo kullanmadan en hızlı yol, burada isaac tarafından açıklandığı gibidir.

Sudo ile paket yönetimi yapmamanızı şiddetle tavsiye ediyorum! Paketler rastgele komut dosyaları çalıştırabilir, bu da sudoing'i bir paket yöneticisi komutunu elektrikli testere saç kesimi kadar güvenli hale getirir. Elbette, hızlı ve kesinlikle herhangi bir engeli aşacak, ancak aslında bu engelin orada kalmasını isteyebilirsiniz.

Bunun yerine bunu bir kez yapmanızı öneririm:

sudo chown -R $USER /usr/local

DÜZENLE:

Mevcut kullanıcı için / usr / local sahipliğini değiştirmeyle ilgili belirli güvenlik endişeleri ve işlevsellik sınırlamaları vardır:

Bunu söyledikten sonra, global modülü sudo kullanmadan kurmak istiyorsanız, belirtilenden daha iyi bir çözüm (pragmatik açıdan) görmüyorum. Güvenlik ve kullanım kolaylığı çok geniş bir konudur ve bunun kolay bir cevabı yoktur - sadece gereksinimlerinize bağlıdır.


23
Bu kötü bir fikir çünkü / usr / local hepsini tek bir kullanıcıya ait yapıyor.
Reed G. Law

4
@ ReedG.Law'ın da belirttiği gibi, bu gerçekten kötü bir fikir. Herhangi bir kullanıcı için / usr / local hte sahipliğini değiştirmeyin.
Christopher Will

3
Reed G Yasasına katılıyorum - / usr / local değiştirmek KÖTÜ KÖTÜ KÖTÜ bir fikirdir. Benim durumumda yönlere bakıyordum ve öyle yaptım: sonra bunu geliştirme yapan başka bir kişiyle PAYLAŞMAM GEREKİYORUM. Geri döndüm ve (umarım) tüm değişiklikleri aldım. Bu sadece güvenlik değil, aynı zamanda işlevsellik.
Lloyd Sargent

3
Sistemde yalnızca bir kullanıcı varsa bu çözümün herhangi bir dezavantajı var mı?
Connorbode

2
Üzgünüm, kastetti /usr/local/lib/node_modulesvenode
Creynders

11

Sorun, npm modüllerini global olarak yüklerken hataları önlemek için sudo kullanarak düğüm kurmamdı, biri ASLA sudo ile düğüm yüklememeliydi.

Benim çözümüm oldu düğümü yeniden Şu şekilde:

Nodejs.org'dan en son kararlı düğüm kaynaklarını indirin # durumumda node-v0.10.20.tar.gz

tar -zxf node-v0.10.20.tar.gz #uncompress kaynakları

cd node-v0.10.20 #enter sıkıştırılmamış klasör

sudo chown -R $ KULLANICI / usr / yerel

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

Dikkat edilmesi gereken bir nokta, yalnızca / usr / local klasörünün sahipliğini almanın benim durumumda işe yaramayacağıdır çünkü düğüm kurulumunun kendisi sudo ile yapılmıştır.

Yeoman'ı kurmak için son adım: # yeoman.io'da "npm install -g yo" yapmanın zaten bower ve grunt kurduğunu söylese de, başarısız olan bazı grunt alt modülleri var, bu yüzden bunu kendi kendine kurarak düzelttim

npm kurulum -g bower

npm install -g grunt

npm kurulum -g yo

npm kurulum -g jeneratör-açısal


Teoride harika, ancak aynı etkiyi yalnızca genel olarak modüllere erişmek için Düğüm oluşturmaya ve 4 ek modül yüklemeye zorlanmadan elde etmenin bir yolu var mı?
Dan Nissenbaum

Seçilen cevap tam da ihtiyacınız olduğu gibi çalışır. Bu, 2 yıl önce henüz başka bir halka açık çözüm olmadığında yaptığım şeydi, ama şimdi işe yaramaz
HeberLZ

5

Bu sorunu ortam değişkeni ve kabuk takma adıyla çözdüm:

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

Benim için npm, .npmrc'deki "önek" yapılandırma ayarına uymadı.


2

Bu benzer SO gönderisine göre: npm, sudo olmadan hata atıyor

Dizinle ilgili bir sahiplik sorununuz olabilir gibi görünüyor ~/.npm.

Buradaki cevapta olduğu gibi, şunu deneyin:

sudo chown -R `whoami` ~/.npm

Aslında bu, çalışamadığımda denediğim şeyin 3. adımında açıkladığım gibi işe yaramadı, sorun, sudo kullanarak düğüm kurmuş olmamdı, bu da bazı durumlarda sorun yaratabilir. Düğümü silip kaynaklarından yeniden yükledikten sonra, her şey beklendiği gibi çalışmaya başladı!
HeberLZ

@HeberLZ Sanırım haklısın, bunu dün gece başka bir makinede yapmayı denedim ve işe yaramadı. Benim de ilgilenmem gereken başka izin sorunları vardı. Yine de, bu npm'yi kaynaktan yüklememenin en iyi yolunun ne olduğundan emin değilim.
prasanthv

Yorumlardaki soruya bağlantı verin veya mevcut soruyu kopya olarak işaretleyin. Diğer sorulardan cevapları kopyalayıp yapıştırmak yardımcı olmaz.
givanse

@HeberLZ, bu cevabın olumsuz oyu, yaptığınız sorunun başlığına hitap ettiği için belirsizdir.
Sebastian Sastre

Cevabı ne zaman reddettiğimi hatırlamıyorum, ama benim özel durumumda yazdıklarınız sorunu çözmedi, bu yüzden muhtemelen cevabı reddettiğimi düşünüyorum. Soru üzerinde belirtildiği gibi: "Aşağıdaki klasörlerin tekrar tekrar sahip olması ~ / .npm, / usr / lib / node, / usr / lib / node_modules ve aşağıdaki sembolik bağlar / usr / bin / node, / usr / bin / nodejs kesinlikle başarılı olamadı ".npm ve diğer tüm klasörlerin sahipliğini elde etmeye çalıştım
HeberLZ

2

Npm dizininin yolunu bulun:

npm config get prefix

Birçok sistem için bu / usr / local olacaktır.

Npm dizinlerinin sahibini mevcut kullanıcının adıyla değiştirin (kullanıcı adınız!):

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

Bu, npm ve diğer bazı araçlar (lib / node_modules, bin ve share) tarafından kullanılan alt klasörlerin izinlerini değiştirir.

İşte tüm ayrıntılar için bağlantı

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


Hayati. Eklemekten kaçınmaya çalışın binve shareparantez içine. Görmezden gelmek, bu klasörlerin sahipliğini mevcut kullanıcı sudoolarak değiştirmeye ve sisteme yeni paketler yüklemede sorunlara yol açabilir çünkü mülkiyeti de değişecektir
A.Ametov

bu
komut


1

Aslında, köke ait olan bir kullanıcı klasörünün iznini değiştirdim:

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

Sonra sudo olmadan "npm install" ve "bower install" yapabilirim! İyi çalıştı!


0

lubuntu 14.04.3 kullanarak, .npm ve npm önekinin sahipliğini değiştirmeyi denedim, yolumu güncelledim, npm yüklü modülleri sudo olmadan ana dizinime yükledim, ancak yol yanlıştı, bu nedenle ember gibi modüller bulunamadı, linuxbew sorunu çözdü, hızlı düğüm / npm için burada kurulum kılavuzu


0

Bu sorun ve aynı nedenin neden olduğu diğer sorunlar, kullanıcı alanına Node yüklenerek çözülebilir.

Bunu sadece kopyalayıp terminalinize yapıştırarak yapabilirsiniz

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

Düğümün en son sürüme güncellenmesi için aynı komutlar da başlatılabilir.

Ortamınızı düzenlemeyi unutmayın. Sadece bir kez yap

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

Sudo olmadan Node.js'nin nasıl kurulacağını öğrenmek için bu makaleye göz atın .

Bu konuyla ilgili daha genel bir çözüm için (yani, yerel olarak yazılım yükleme) bkz. Nokta yazılımı .


0

sadece nvm'yi kullanın, farklı düğüm sürümleri arasında dinamik olarak geçiş yapabilirsiniz ve bu, kullanıcınız için yerel olarak kurulur. Sudo gerekmez. Sadece önceden eski düğümü tamamen temizlediğinizden emin olun.

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


-2

Bulduğum en iyi çözüm, Node.js'yi tar paketinden kullanıcı ana dizinine yüklemek ve lib klasörü konumunu bağlamaktı. Yapman gerekenler işte burada

Bu, Nodej'leri varsayılan / usr / local / yerine ~ / .local / altına kuracaktır.

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.

Paketleri kurarken hala sahiplik veya izin hatasıyla karşılaşırsanız, ~ / .local / dir sahipliğini çalıştırarak değiştirin.

chown -R user:user ~/.local/

Artık paketleri 'npm' aracılığıyla yüklemekte iyi olmalısınız

Not: YUKARIDAKİ KOMUTLARIN TÜMÜ KULLANICI OLARAK ÇALIŞTIRILACAKTIR. SUDO VEYA KÖK GİRİŞİ KULLANMAYIN

'/ USR / LIB /' KAPSAMINDAKİ KLASÖRLERİN İZNİNİ ASLA DEĞİŞTİRMEYİN. KARARSIZ İşletim Sistemine Yol Açacak



-2

Pawel Grzybek'in açıklamalarını çok ikna edici buluyorum : 3 basit sudo komutuna indirgiyorlar, küresel npm kurulumları için bir daha asla sudo kullanmak zorunda değiller:

sudo chown -R $(whoami) /usr/local/lib/node_modules
sudo chown -R $(whoami) /usr/local/bin
sudo chown -R $(whoami) /usr/local/share
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.