Moduły NPM nie będą instalowane globalnie bez sudo

126

Właśnie ponownie zainstalowałem Ubuntu 12.04 LTS, a przede wszystkim wykonałem następujące kroki :

  1. Zainstalowano Node przez menedżera pakietów z następującym skryptem

    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. Próbowałem zainstalować generatory yeoman, express, n, yeoman's na całym świecie i wszystkie zwróciły ten sam błąd

    npm ERR! Błąd: EACCES, łącze symboliczne „../lib/node_modules/n/bin/n”

    npm ERR! {[Błąd: EACCES, link symboliczny „../lib/node_modules/n/bin/n”] errno: 3, kod: „EACCES”, ścieżka: „../lib/node_modules/n/bin/n”}

    npm ERR!

    npm ERR! Spróbuj ponownie uruchomić to polecenie jako root / Administrator.

    npm ERR! System Linux 3.8.0-29-generic

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

    npm ERR! cwd / home / heberlz

    npm ERR! node -v v0.10.20

    npm ERR! npm -v 1.3.11

    npm ERR! ścieżka ../lib/node_modules/n/bin/n

    npm ERR! kod EACCES

    npm ERR! errno 3

    npm ERR! Błąd stosu: EACCES, łącze symboliczne „../lib/node_modules/n/bin/n”

    npm ERR!

    npm ERR! Dodatkowe szczegóły logowania można znaleźć w:

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

    npm ERR! nie ok kod 0

  3. Odzyskano prawa własności do następujących folderów rekurencyjnie ~ / .npm, / usr / lib / node, / usr / lib / node_modules i następujących dowiązań symbolicznych / usr / bin / node, / usr / bin / nodejs bez żadnego sukcesu

Muszę zainstalować yeoman i jego generatory bez sudo, żeby później nie mieć kłopotów :(

HeberLZ
źródło
Dzięki Phil, teraz wygląda znacznie lepiej
HeberLZ
2
Jeśli chcesz, aby npm instalował globalne pakiety w $ HOME zamiast / usr, postępuj zgodnie z instrukcją github.com/sindresorhus/guides/blob/master/ ...
Colonel Panic
to właśnie działało dla mnie github.com/nodejs/node-v0.x-archive/issues/… :ln -s /usr/bin/nodejs /usr/bin/node
Loïc MICHEL
Możliwy duplikat npm zgłasza błąd bez sudo
Louis

Odpowiedzi:

318

Ubuntu 12.04 i użycie PPA Chrisa Lei do instalacji działa dla mnie:

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

i dodanie $ HOME / .npm-packages / bin do $ PATH

dołączyć do .bashrc

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

zobacz https://stackoverflow.com/a/18277225 z @passy

ErikAndreas
źródło
9
To wygląda na znacznie czystsze rozwiązanie. Jeśli nie lubisz folderów systemowych w swoim katalogu domowym, możesz także użyć lokalizacji takiej jak ~ / .local / share / npm.
JeroenHoek
Należy zauważyć, że po zmianie prefiksu należy ponownie zainstalować wszystkie moduły globalne, które zostały wcześniej zainstalowane, w tym sam npm.
Dziamid
Wydaje się to w porządku, ale znacznie łatwiej było udzielić użytkownikowi pozwolenia na pisanie /usr/lib/node_modules/. A może nawet należałoby utworzyć grupę nodejs unix i dać tej grupie uprawnienia do zapisu w tym katalogu.
mehulkar
Jednym drobnym szczegółem do dodania jest to, że musisz samodzielnie utworzyć katalog ~ / npm. W przeciwnym razie npm zakończy pracę z ENOENT błędów.
Jason Farnsworth
6
Dlaczego nie jest to ustawienie domyślne dla npm? Dzięki za udostępnienie.
Dorian,
23

Jeśli już masz $HOME/binna swojej drodze, prostszym rozwiązaniem jest po prostu ...

npm config set prefix ~
  • Nowe polecenia dotyczące węzłów zostaną teraz zainstalowane w $HOME/binkatalogu.
  • Nie musisz zmieniać swojej ścieżki!

Ponieważ ta dyskusja naprawdę dotyczy zmniejszenia zagrożeń bezpieczeństwa związanych z uruchomieniem sudo, należy również pamiętać, że każda aplikacja węzła może potencjalnie instalować nazwę aplikacji, która nie jest zgodna z nazwą pakietu zarejestrowanego węzła, którą myślisz, że instalujesz. Istnieje więc ryzyko, że polecenie npm installzastąpi istniejące polecenie systemowe lub polecenie, które już masz $HOME/bin. Jeśli martwisz się, najpierw sprawdź właściwości bini scriptsw package.jsonpliku aplikacji, którą instalujesz.

Ogólnie najbezpieczniej jest:

  • (a) Umieść $HOME/binostatnią pozycję na ścieżce, aby polecenia systemowe nie zostały zastąpione.
  • (b) nie dołączaj „.” lub dowolną ścieżkę względną w twoim, $PATHaby przypadkowo nie uruchomić polecenia, które znajduje się w bieżącym katalogu.

Odniesienie:

Tony O'Hagan
źródło
1
Innym ważnym problemem związanym z bezpieczeństwem npmjest to, że kod źródłowy, który widzisz w github.comrepozytorium pakietu węzłów, może nie być tym samym kodem, który instalujesz z npm.orgserwera rejestru!
Tony O'Hagan,
Chociaż teoretycznie dobrze spreparowany pakiet węzłów z radością zainstaluje się w ~/bin, niektóre pakiety węzłów (lub ich pakiety zależne) zostały przetestowane tylko jako instalacje z, sudowięc pamiętaj, że możesz napotkać niesprawdzony problem ze „środowiskiem instalacyjnym”. Jak każdy inny problem ze środowiskiem (np. Zmiana systemu operacyjnego), zasada „napisz raz, przetestuj wszędzie” nadal obowiązuje.
Tony O'Hagan,
Wadą tej metody jest to, że npm tworzy dodatkowy katalog o nazwie ~ / lib. W zależności od praktyk organizacji może to nie być pożądane.
Pan S
12

W październiku 2014 r .:

Node.js jest dostępny w repozytorium dystrybucji binarnych NodeSource Debian i Ubuntu .

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

Otóż ​​to.

Nieaktualna odpowiedź:

Najszybszy sposób bez użycia sudo jest opisany tutaj przez isaaca

Gorąco zachęcam do nie zarządzania pakietami w sudo! Pakiety mogą uruchamiać dowolne skrypty, co sprawia, że ​​sudo polecenia menedżera pakietów jest tak bezpieczne, jak ostrzyżenie piły łańcuchowej. Jasne, jest szybki i na pewno pokona wszelkie przeszkody, ale możesz chcieć, aby przeszkoda tam pozostała.

Zamiast tego polecam zrobić to raz:

sudo chown -R $USER /usr/local

EDYTOWAĆ:

Istnieją pewne obawy dotyczące bezpieczeństwa i ograniczenia funkcjonalności dotyczące zmiany właściciela / usr / local na obecnego użytkownika:

Powiedziawszy to, jeśli chcesz zainstalować moduł globalny bez użycia sudo, nie widzę lepszego rozwiązania (z pragmatycznego punktu widzenia) niż wspomniane. Bezpieczeństwo vs łatwość obsługi to bardzo szeroki temat i nie ma na to prostej odpowiedzi - zależy to tylko od Twoich wymagań.

Andrei Karpushonak
źródło
23
To zły pomysł, ponieważ powoduje, że cały katalog / usr / local należy do jednego użytkownika.
Reed G. Law
4
Jak zauważył @ ReedG.Law, to naprawdę zły pomysł. Nie zmieniaj prawa własności / usr / local na żadnego konkretnego użytkownika.
Christopher Will
3
Muszę się zgodzić z prawem Reed G - zmiana / usr / local to ZŁY ZŁY ZŁY pomysł. W moim przypadku szukałem wskazówek i zrobiłem to: potem przypomniałem sobie, że muszę DZIELIĆ się tym z inną osobą zajmującą się rozwojem. Wróciłem i (miejmy nadzieję) dostałem wszystkie zmiany. To nie tylko bezpieczeństwo, ale także funkcjonalność.
Lloyd Sargent
3
Czy jest jakaś wada tego rozwiązania, jeśli w systemie jest tylko jeden użytkownik ?
connorbode
2
Przepraszam, chodziło /usr/local/lib/node_modulesinode
Creynders
11

Problem polegał na tym, że zainstalowałem węzeł za pomocą sudo , aby uniknąć błędów podczas globalnej instalacji modułów npm, NIGDY NIE WOLNO instalować węzła z sudo.

Moim rozwiązaniem była ponowna instalacja węzła w ten sposób:

Pobierz najnowsze stabilne źródła węzłów z nodejs.org # w moim przypadku node-v0.10.20.tar.gz

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

cd node-v0.10.20 #enter nieskompresowany folder

sudo chown -R $ USER / usr / local

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

Należy zauważyć, że samo przejęcie na własność folderu / usr / local nie zadziała w moim przypadku, ponieważ sama instalacja węzła została wykonana za pomocą sudo

Ostatni krok do instalacji yeoman: # chociaż na yeoman.io jest napisane, że wykonanie "npm install -g yo" już instaluje bower i chrząknięcie, jest kilka podmodułów gruntów, które zawodzą, więc naprawiłem to instalując je samodzielnie

npm install -g bower

npm install -g grunt

npm install -g yo

npm install -g generator-kątowy

HeberLZ
źródło
Świetnie w teorii, ale czy istnieje sposób na osiągnięcie tego samego efektu bez konieczności budowania Node i instalowania 4 dodatkowych modułów tylko po to, aby mieć dostęp do modułów na całym świecie?
Dan Nissenbaum
Wybrana odpowiedź działa tak, jak potrzebujesz. To właśnie zrobiłem 2 lata temu, kiedy nie było jeszcze innego publicznego rozwiązania, ale teraz jest bezużyteczne
HeberLZ
5

Rozwiązałem ten problem ze zmienną środowiskową i aliasem powłoki:

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

Dla mnie npm nie przestrzegał ustawienia konfiguracji „prefiksu” w .npmrc.

santervo
źródło
2

Zgodnie z tym podobnym postem SO: npm zgłasza błąd bez sudo

Wygląda na to, że możesz mieć problem z własnością ~/.npmkatalogu.

Podobnie jak w przypadku odpowiedzi w tym artykule, spróbuj:

sudo chown -R `whoami` ~/.npm
prasanthv
źródło
Właściwie to nie zadziałało, jak wyjaśniłem w kroku 3 tego, co próbowałem, gdy nie mogłem tego zrobić, problem polegał na tym, że zainstalowałem węzeł za pomocą sudo, co może w pewnych okolicznościach powodować problemy. Po usunięciu węzła i ponownym zainstalowaniu go ze źródeł wszystko zaczęło działać zgodnie z oczekiwaniami!
HeberLZ
@HeberLZ Myślę, że masz rację, właśnie próbowałem to zrobić wczoraj na innym komputerze i to nie działało. Miałem też inne kwestie związane z pozwoleniami. Nadal nie jestem pewien, jaki jest najlepszy sposób, aby nie wpaść na tę instalację npm ze źródła.
prasanthv
Podaj link do pytania w komentarzach lub zaznacz aktualne pytanie jako duplikat. Kopiowanie i wklejanie odpowiedzi z innych pytań nie pomaga.
givanse
@HeberLZ głos przeciw tej odpowiedzi jest niewłaściwy, ponieważ odnosi się do tytułu zadanego pytania.
Sebastian Sastre
Nie pamiętam, kiedy przegłosowałem odpowiedź, ale w moim konkretnym przypadku to, co napisałeś, nie rozwiązało problemu, powód, dla którego myślę, że prawdopodobnie przegrałem odpowiedź. Jak stwierdzono w pytaniu: „Odzyskano prawa własności do następujących folderów rekurencyjnie ~ / .npm, / usr / lib / node, / usr / lib / node_modules oraz następujących dowiązań symbolicznych / usr / bin / node, / usr / bin / nodejs bez żadnego sukcesu "Próbowałem przejąć na własność .npm i wszystkie inne foldery bez powodzenia
HeberLZ
2

Znajdź ścieżkę do katalogu npm:

npm config get prefix

W wielu systemach będzie to / usr / local.

Zmień właściciela katalogów npm na nazwę bieżącego użytkownika (Twoja nazwa użytkownika!):

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

Zmienia to uprawnienia podfolderów używanych przez npm i niektóre inne narzędzia (lib / node_modules, bin i share).

Oto link do pełnych szczegółów

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

Monis Majeed
źródło
Istotny. Staraj się unikać dodawania bini sharew nawiasach. Ignorowanie może doprowadzić do zmiany właściciela tych folderów na obecnego użytkownika i problemy z instalacją nowych pakietów w systemie, sudoponieważ jego własność również ulegnie zmianie
A.Ametov
ta komenda niszczy cały mój system plików: (
UA_
1

Jeśli pracujesz na komputerze, na którym się rozwijasz, lepiej rozważyć użycie nvm .

Jeśli nie, po prostu chcesz zainstalować za pomocą swojego ulubionego menedżera pakietów.

Niezależnie od przypadku, polecam sprawdzenie tej odpowiedzi na stackoverflow

Iam Zesh
źródło
1

Właściwie właśnie zmieniłem uprawnienia folderu użytkownika, którego właścicielem był root:

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

Wtedy mógłbym zainstalować "npm install" i "bower install" bez sudo! Działa dobrze!

Vinggui
źródło
0

używając lubuntu 14.04.3, próbowałem zmienić własność prefiksów .npm i npm, zaktualizowałem ścieżkę, zainstalowałem moduły npm do mojego katalogu domowego bez sudo, ale ścieżka była niepoprawna, więc moduły takie jak ember nie zostały znalezione, linuxbew rozwiązał problem, szybko przewodnik konfiguracji tutaj dla node / npm

Conor
źródło
0

Ten i inne problemy spowodowane tym samym powodem można rozwiązać, instalując Node w przestrzeni użytkownika.

Możesz to zrobić po prostu kopiując i wklejając w swoim terminalu

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

Te same polecenia można również uruchomić, aby zaktualizować Node do najnowszej wersji.

Nie zapomnij edytować swojego środowiska. Tylko raz

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

Sprawdź ten artykuł, aby dowiedzieć się, jak zainstalować Node.js bez sudo .

Aby uzyskać bardziej ogólne rozwiązanie dotyczące tego tematu (np . Lokalną instalację oprogramowania), zobacz dotsoftware .

Gianluca Casati
źródło
0

po prostu użyj nvm, będziesz mógł dynamicznie przełączać się między różnymi wersjami węzłów i jest on instalowany lokalnie dla twojego użytkownika. Nie potrzeba sudo. Tylko upewnij się, że wcześniej w pełni wyczyściłeś stary węzeł.

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

Marko Nalis
źródło
-2

Najlepszym rozwiązaniem, jakie znalazłem, było zainstalowanie Node.js z pakietu tar w katalogu domowym użytkownika i powiązanie lokalizacji folderu lib. Oto, co musisz zrobić

To zainstaluje Nodejs w ~ / .local / zamiast domyślnego / 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.

Jeśli nadal napotykasz błąd własności lub uprawnień podczas instalowania pakietów, zmień własność ~ / .local / dir, uruchamiając

chown -R user:user ~/.local/

Teraz powinieneś być dobry w instalowaniu pakietów przez 'npm'

Uwaga: WSZYSTKIE POWYŻSZE POLECENIA SĄ WYKONYWANE JAKO UŻYTKOWNIK. NIE UŻYWAJ LOGOWANIA SUDO ANI ROOT

NIGDY NIE ZMIENIAJ DOPUSZCZENIA FOLDERÓW W ZAKRESIE „/ USR / LIB /”. Doprowadzi do niestabilnego systemu operacyjnego

Shank_Transformer
źródło
-2

Uważam wyjaśnienia Paweł Grzybek za bardzo przekonujące: one sprowadzają się do 3 prostych poleceń sudo nigdy konieczności używania sudo ponownie globalnych instalacjach KMP:

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
źródło