npm zgłasza błąd bez sudo

1286

Właśnie zainstalowałem węzeł i npm poprzez pakiet na nodejs.org i ilekroć próbuję wyszukać lub zainstalować coś z npm, generuje następujący błąd, chyba że wykonam polecenie sudo. Mam wrażenie, że to problem z uprawnieniami? Jestem już administratorem.

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
Czad
źródło
35
Proszę rozważyć rozwiązanie za pomocą NVM : stackoverflow.com/a/24404451/1480391 (zamiast hakowania z uprawnieniami)
Yves M.
2
@janaspage Nie można zainstalować węzła lub NVM (Node Version Manager) za pośrednictwem NPM (Node Package Manager), to nie ma sensu. NPM znajduje się w węźle (jest instalowany w tym samym czasie). Zajrzyj na stronę Wikipedii: en.wikipedia.org/wiki/Npm_(software)
Yves M.
5
Wreszcie rozwiązanie lepsze niż sudo chown: github.com/sindresorhus/guides/blob/master/…
Dmitri Zaitsev
W OSX i instalowaniu węzła z 0official pkg intaller to rozwiązanie nie działało. Zamiast tego użyłem tego: stackoverflow.com/a/34968008/675565
fmquaglia
2
Wyjaśnia problem i poprawkę: docs.npmjs.com/getting-started/fixing-npm-permissions
n00b

Odpowiedzi:

2268

To wygląda na problem z uprawnieniami w twoim katalogu domowym. Aby odzyskać własność katalogu .npm, wykonaj:

sudo chown -R $(whoami) ~/.npm
Noah
źródło
102
Myślałem, że whoamito symbol zastępczy, ale działa dosłownie tak, jak jest, więc musi to być zmienna, której nie rozumiem.
SimplGy
127
whoami to rzeczywiste polecenie powłoki en.wikipedia.org/wiki/Whoami . Backticks wokół whoamizapewniają, że zostanie on poprawnie wykonany, a następnie umieszczony w poleceniu chown
Noah
13
możesz także ręcznie podać swoją nazwę użytkownika. Jeśli Twoja nazwa użytkownika to „simpleascouldbe”, polecenie brzmiałobysudo chown -R simpleascouldbe ~/.npm
Noah
13
npm NIE wymaga i nie powinieneś używać sudo - patrz odpowiedź poniżej @HeberLZ, w szczególności jego druga opcja dotycząca: ./configure --prefix = xxxxxx
Scott Stensland
9
@ChristopherWill: To nie zmienia własności katalogu systemowego. Zmienia to własność katalogów w katalogu osobistym użytkownika, które powinny być własnością użytkownika.
user4815162342
619

Uprawnienia użyłeś podczas instalacji węzła będzie wymagany podczas robienia rzeczy jak pisanie w swoim katalogu npm ( npm link, npm install -g, itd.).

Prawdopodobnie uruchomiłeś instalację węzła z uprawnieniami roota, dlatego globalna instalacja pakietu prosi cię o rootowanie.


Rozwiązanie 1: NVM

Nie hakuj z uprawnieniami, zainstaluj węzeł we właściwy sposób.

Na maszynie rozwoju, nie należy instalować i uruchamiać węzeł z uprawnieniami roota, inaczej rzeczy lubią npm link, npm install -gbędą musiały same uprawnienia.

NVM (Node Version Manager) pozwala zainstalować Node bez uprawnień roota, a także pozwala zainstalować wiele wersji Node, aby łatwo z nimi grać. Idealny do programowania.

  1. Odinstaluj węzeł (prawdopodobnie wymagane będzie zezwolenie root). To może ci pomóc.
  2. Następnie zainstaluj NVM zgodnie z instrukcjami na tej stronie .
  3. Zainstaluj węzeł za pośrednictwem NVM: nvm install node

Teraz npm link, npm install -gnie będzie już wymagać, aby być korzeń.

Edycja: Zobacz także https://docs.npmjs.com/getting-started/fixing-npm-permissions


Rozwiązanie 2: Zainstaluj pakiety globalnie dla danego użytkownika

Nie hakuj z uprawnieniami, instaluj globalnie pakiety npm we właściwy sposób.

Jeśli korzystasz z systemu OSX lub Linux, możesz utworzyć dedykowany dla użytkownika katalog dla globalnego pakietu i konfiguracji npmoraz nodewiedzieć, jak znaleźć globalnie zainstalowane pakiety.

W tym świetnym artykule znajdują się instrukcje krok po kroku dotyczące instalowania modułów npm globalnie bez sudo.

Zobacz także: dokumentacja npm na temat Naprawiania uprawnień npm .

Yves M.
źródło
32
Spośród wszystkich opublikowanych rozwiązań rozwiązanie NVM zapewniało mi najlepsze wyniki. Zdecydowanie zalecamy używanie NVM zamiast zabawy z uprawnieniami.
wenincode
9
Te instrukcje działały bardzo dobrze. Jednak prawdopodobnie będziesz chciał usunąć moduły zainstalowane z sudo przed odinstalowaniem nodejs : npm ls -gp | awk -F/ '/node_modules/ && !/node_modules.*node_modules/ {print $NF}' | xargs npm -g rm- Musiałem ponownie zainstalować nodejs w powłoce root i odinstalować je, w przeciwnym razie nadal będziesz mieć dowiązania symboliczne do ciebie, chrząkać itp.
Bruno Flávio
4
To najlepsze rozwiązanie, najpierw usunąłem wszystkie moduły, robiąc sudo npm list -g --depth=0. | awk -F ' ' '{print $2}' | awk -F '@' '{print $1}' | sudo xargs npm remove -g stackoverflow.com/a/22290968/1449157, a następnie usunąłem npmi zainstalowałem przeznvm
Fabio Antunes
3
Aby odinstalować instrukcje dla węzła, użyj tej odpowiedzi SO: stackoverflow.com/a/11178106/480031
seangates
3
Dlaczego używanie roota do instalowania węzła na maszynie produkcyjnej jest w porządku?
Bruno Peres,
401

Będziesz także potrzebować uprawnienia do zapisu w node_moduleskatalogu:

sudo chown -R $USER /usr/local/lib/node_modules
Xilo
źródło
7
Jak również ~/tmpkatalog dla mnie.
knownasilya
122
Nie wiem, dlaczego to wciąż zyskuje aprobatę. Bardzo złą praktyką jest zmiana własności katalogów systemowych na konkretnego użytkownika! Poniżej znajdziesz odpowiedź na inne rozwiązania (takie jak utworzenie oddzielnej grupy dla użytkowników węzłów).
Christopher Will
1
nie mam node_modulesw /usr/local/lib/. wtf?
Connor Leech
27
Cokolwiek zrobisz - ABSOLUTNIE nie uruchamiaj 'sudo chmod -R whoami' na / usr / local / lib lub / usr / lib / zrujnujesz swój plik sudoers i będziesz nienawidził siebie.
qodeninja,
7
wszyscy, proszę, głosujcie za tym ... Then I ran sudo chown -R $USER /* and everything was fine- NIE - rujnujecie swoją maszynę.
commonpike,
75

Zmiana właściciela folderów „system-global” to włamanie. Podczas nowej instalacji skonfigurowałbym NPM tak, aby używał już zapisywalnej lokalizacji dla programów „globalnych użytkowników”:

npm config set prefix ~/npm

Następnie upewnij się, że dodajesz ten folder do swojej ścieżki:

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

Zobacz @ErikAndreas ' odpowiedź do modułów NPM nie zainstaluje globalnie bez sudo i dłuższy krok po kroku przez @sindresorhus z także zestawów $MANPATH.

Joel Purra
źródło
Zdecydowanie się zgadzam, ale sugeruję, że jeśli po prostu ustawisz prefiks, $HOMEwówczas zazwyczaj .profileskrypt zajmie się $PATHnastępnym razem, gdy go pozyskasz (np. Przy następnym logowaniu).
Jess Austin,
@JessAustin: Być może, ale spowoduje to również więcej bałaganu $HOMEi może zakłócać inne (przyszłe?) Pliki / podfoldery NPM. Preferuj oddzielne pliki binarne z różnych menedżerów pakietów / języków / systemów kompilacji i jawnie ustawiane $PATH(w skrypcie czasu logowania).
Joel Purra
Eee, bałagan? Mówimy tylko o globalnie zainstalowanych modułach ~/lib/node_moduleswraz z powiązanym CLI, jeśli istnieją ~/bin. Dla wielu użytkowników, zwłaszcza jeśli nie mają root, oba istnieją ~/bini ~/libjuż istnieją.
Jess Austin
@JessAustin: to także kwestia kolizji nazw bibliotek i plików binarnych. Powiedzmy, że wskazujesz NPM, aby wstawić pliki binarne, ~/bina następnie wykonaj to samo dla jednego lub dwóch dodatkowych menedżerów pakietów. Może się to nie zdarzyć dzisiaj lub jutro, ale istnieje wyraźne ryzyko, że dwa pakiety od różnych menedżerów zderzą się z nazwami i zastąpią pliki innych użytkowników. To wystarczająco dobry przypadek, aby mieć osobne prefiksy. (Konkretne przykłady byłyby mile widziane.)
Joel Purra
1
Należy to zaakceptować jako najlepszą odpowiedź. Zmiana folderów globalnych dla systemu może być niebezpieczna.
Vladimir Marton,
58

Napotkałem to podczas instalowania Recess ( https://github.com/twitter/recess ) w celu skompilowania mojego CSS dla Bootstrap 3.

Podczas instalowania wnęki:

-npm install recess -g
  1. Musisz odblokować uprawnienia w swoim homekatalogu, jak mówi Noe :

    sudo chown -R `whoami` ~/.npm
  2. Potrzebujesz także uprawnień do zapisu do node_moduleskatalogu, jak mówi Xilo , więc jeśli nadal nie działa, spróbuj:

    sudo chown -R `whoami` /usr/local/lib/node_modules
  3. Jeśli nadal widzisz błędy, może być konieczne poprawienie /usr/localuprawnień :

    sudo chown -R `whoami` /usr/local

Należy pamiętać, że jak wskazano w tym poście, w /usr/local/ rzeczywistości nie jest to systemowy katalog, jeśli jesteś na komputerze Mac, więc ta odpowiedź jest w rzeczywistości całkowicie „bezpieczna” dla użytkowników komputerów Mac. Jeśli jednak korzystasz z Linuksa, zapoznaj się z odpowiedzią Christophera Will'a , aby znaleźć przyjazne dla systemu, bezpieczne dla systemu (ale bardziej złożone) rozwiązanie.

danomarr
źródło
35
To jest zły pomysł. Prawdopodobnie nie chcesz, aby katalogi systemowe były własnością konkretnego użytkownika. Oprócz poważnych obaw związanych z bezpieczeństwem nie jest to również kompatybilne z wieloma użytkownikami.
Christopher Will
2
Tak, ale jest to świetne rozwiązanie dla środowiska programistycznego +2, zwłaszcza jeśli masz już zainstalowany plik node.js i po prostu musisz się rozwijać!
elliotrock
Naprawdę nie powinieneś posiadać paczek poza swoim katalogiem domowym
Ben,
1
Jeśli nie ma go w folderze domowym, jest to katalog systemowy, pomimo wszelkich przeciwnych twierdzeń. To, że nie jest używane przez OS X, nie oznacza, że ​​nie jest to katalog systemowy.
rich remer
53

Uważaj!!! Uważaj!!! Uważaj!!!

chown lub chmod NIE jest rozwiązaniem ze względu na zagrożenie bezpieczeństwa.

Zamiast tego zrób to:

Najpierw sprawdź, gdzie npm wskazują, jeśli zadzwonisz:

npm config get prefix

Jeśli zwracany jest parametr / usr, możesz wykonać następujące czynności:

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

Spowoduje to utworzenie katalogu npm w twoim katalogu domowym i wskazanie npmgo.

Aby wprowadzić te zmiany na stałe, musisz dodać polecenie export do pliku .bashrc:

echo -e "export NPM_CONFIG_PREFIX=~/.npm-global\nexport PATH=\$PATH:~/.npm-global/bin" >> ~/.bashrc
suther
źródło
powinienem przełączyć się na opcję 2 tylko jeśli mam / usr?
Albert Laure
3
Zauważ, że ostatnie polecenie faktycznie wyświetla treść $PATH, a nie sam łańcuch. Powinieneś to zmienić.
Veluria,
1
To naprawiło to! Dziękuję Ci.
Otrzymywałem
1
To najlepsza odpowiedź. Jest to zalecany sposób rozwiązania problemu.
Paulo Coghi - Przywróć Monikę
Dlaczego unikanie zagrożenia bezpieczeństwa?
Frank
40

Inne odpowiedzi sugerują zmianę własności lub uprawnień do katalogów systemowych dla konkretnego użytkownika. Odradzam to, ponieważ może to być bardzo niezręczne i może popsuć cały system!

Oto bardziej ogólne i bezpieczniejsze podejście, które obsługuje również wielu użytkowników.

Utwórz nową grupę dla użytkowników węzłów i dodaj wymaganych użytkowników do tej grupy. Następnie ustaw własność zależnych od węzłów plików / katalogów do tej grupy.

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

Teraz możesz łatwo zainstalować moduły jako użytkownik

npm install -g generator-angular

Niektóre moduły (chrząknięcie, altana, jo itp.) Nadal będą wymagały instalacji jako root. Wynika to z faktu, że tworzą one dowiązania symboliczne w / user / bin /.

Edytować

3 lata później polecam użyć Node Version Managera . Oszczędza ci to dużo czasu i kłopotów.

Christopher Will
źródło
2
Jeśli węzeł jest instalowany przez źródła, chociaż problem stanowiłby wielu użytkowników, wszystkie moduły działałyby idealnie bez użycia sudo. Jest to również bardzo ważne, ponieważ w przypadku modułu yeoman ludzie nie mogą aktualizować generatorów poprzez sudo uruchamianie aplikacji yeoman, ponieważ nie pozwala ono na wykonanie sudo :(
HeberLZ
1
W systemie Linux zwykle używam wbudowanej staffgrupy, aby udzielić uprawnień moim folderom programistycznym. Warto także uruchomić, chmod g+ws node_modulesaby upewnić się, że Twoja grupa ma uprawnienia do odczytu / zapisu.
jackvsworld,
@jackvsworld Nie wiedziałem o grupie pracowników. Myślę, że byłoby to bardziej płynne rozwiązanie, ponieważ nie trzeba tworzyć nowej fikcyjnej grupy ... chociaż byłoby to mniej wyraźne. Ale dziękuję za ten wkład.
Christopher Will
Mówiąc ogólnie, /usr/libjest pod kontrolą menedżera pakietów systemowych i nie powinieneś wprowadzać tam żadnych zmian.
rich remer
23

Oficjalna dokumentacja , w jaki sposób naprawić npm installuprawnienia z EACCESbłędu znajduje się w https://docs.npmjs.com/getting-started/fixing-npm-permissions .

Ten problem napotkałem po nowej instalacji węzła przy użyciu .pkginstalatora w systemie OSX. Jest tu kilka świetnych odpowiedzi, ale nie widziałem jeszcze linku do npmjs.com.

Opcja 1: Zmień uprawnienia do domyślnego katalogu npm

  1. Znajdź ścieżkę do katalogu npm:

    npm config get prefix

W przypadku wielu systemów będzie to / usr / local .

OSTRZEŻENIE : Jeśli wyświetlana ścieżka to po prostu / usr , przejdź do opcji 2 .

  1. 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 do podfolderów używanych przez npm i niektóre inne narzędzia ( moduły lib / node , bin i share ).

Opcja 2: Zmień domyślny katalog npm na inny katalog

Są chwile, kiedy nie chcesz zmieniać prawa własności do domyślnego katalogu, którego używa npm (tj. / Usr ), ponieważ może to powodować pewne problemy, na przykład, jeśli udostępniasz system innym użytkownikom.

Zamiast tego możesz skonfigurować npm, aby używał zupełnie innego katalogu. W naszym przypadku będzie to ukryty katalog w naszym katalogu domowym.

  1. Utwórz katalog dla instalacji globalnych:

    mkdir ~/.npm-global
  2. Skonfiguruj npm, aby używał nowej ścieżki do katalogu:

    npm config set prefix '~/.npm-global'
  3. Otwórz lub utwórz plik ~ / .profile i dodaj ten wiersz:

    export PATH=~/.npm-global/bin:$PATH
  4. Wróć do wiersza poleceń i zaktualizuj zmienne systemowe:

    source ~/.profile
HoppyKamper
źródło
1
Dzięki, ten zadziałał dla mnie tak, jak nie przyszło rozwiązanie chown. Uratowałeś mnie.
fmquaglia
powinienem przełączyć się na opcję 2 tylko jeśli mam / usr?
Albert Laure
Uwielbiam opcję tej odpowiedzi 2. (1) Nie ma luk w zabezpieczeniach związanych z używaniem sudo, (2) zachowuje architekturę dla innych użytkowników, (3) odwołuje się do dokumentacji, ORAZ (4) ma potrzebny wiersz poleceń wpisy zawarte. Dziękuję za dodanie!
Tom Rose
Co się stanie, gdy zainstalujesz coś, co jest dowiązaniem symbolicznym /usr/bin/? Teraz tylko twój użytkownik może uzyskać do niego dostęp. Logujesz się jako ktoś inny, nadal nie ma dostępu, ponieważ pliki znajdują się w katalogu domowym innego użytkownika!
Frans
Fajnie, ten działał dla mnie. Dziękuję za wyjaśnienie oprócz poleceń.
FrankByte.com
12

Jakby potrzebowaliśmy tutaj więcej odpowiedzi, ale w każdym razie ...

Sindre Sorus ma przewodnik Instaluj pakiety npm globalnie bez sudo na OS X i Linux, opisując, jak bezproblemowo zainstalować bez bałaganu z uprawnieniami:

Oto sposób globalnej instalacji pakietów dla danego użytkownika.

  1. Utwórz katalog dla swoich globalnych pakietów

    mkdir "${HOME}/.npm-packages"
  2. Odwołaj się do tego katalogu w celu późniejszego wykorzystania w .bashrc / .zshrc:

    NPM_PACKAGES="${HOME}/.npm-packages"
  3. Wskaż npm gdzie przechowywać globalnie zainstalowany pakiet. W swoim $HOME/.npmrcpliku dodaj:

    prefix=${HOME}/.npm-packages
  4. Upewnij się, że węzeł je znajdzie. Dodaj następujące elementy do pliku .bashrc / .zshrc:

    NODE_PATH="$NPM_PACKAGES/lib/node_modules:$NODE_PATH"
  5. Upewnij się, że znajdziesz zainstalowane pliki binarne i strony podręcznika man. Dodaj następujące elementy do .bashrc/ .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)"

Sprawdź npm-g_nosudo za automatyczne wykonanie powyższych kroków

Zapoznaj się ze źródłem tego przewodnika, aby uzyskać najnowsze aktualizacje.

ptim
źródło
2
tx za edycję @AndyHayden :) Moja preferowana metoda jest sugerowana w komentarzach powyżej: użyj NVM! stackoverflow.com/a/24404451/1480391
ptim
Jedyne rozwiązanie, które zadziałało dla mnie, nie wymagając od chowania się z uprawnieniami. Nienawidzę NPM i jego idiotycznych pozwoleń głupoty. Dzięki za rozwiązanie!
RyanNerd
8

TL; DR

zawsze używaj sudo -ilub sudo -Hpodczas uruchamiania, npm installaby zainstalować pakiety globalne.

-

Podczas korzystania npmpobiera pakiety do katalogu domowego użytkownika. Po uruchomieniu jako sudo npminstaluje pliki w tym samym katalogu, ale teraz są własnością root.

Tak właśnie dzieje się absolutnie z każdą osobą, która kiedykolwiek korzystała npm :

  • zainstaluj niektóre lokalne pakiety bez problemu przy użyciu npm install foo
  • zainstaluj pakiet globalny za pomocą sudo install -g foo-cli bez problemu
  • spróbuj zainstalować pakiet lokalny za pomocą npm install bar
  • denerwuj się npmprojektantami, chmodgdy znów musisz przejść do katalogu

Gdy użyjesz opcji -ilub -Hz sudo, katalog domowy będzie rootkatalogiem domowym. Wszelkie globalne instalacje będą buforować pakiety do /root/.npmzamiast rootużywanych plików w /home/me/.npm.

Po prostu zawsze używaj sudo -ilub sudo -Hpodczas uruchamiania, npm installaby zainstalować pakiety globalne, a npmproblemy z uprawnieniami znikną.

Na dobre.

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

- qv zaakceptowana odpowiedź na naprawienie już przejebane npm.

bogate przypomnienie
źródło
najlepsza i prosta poprawka
Manjeet Singh,
6

Miałem podobny problem w modułach NPM nie można zainstalować globalnie bez sudo , problem polegał na tym, że kiedy zainstalowałem węzeł, zrobiłem to z sudo przez chris / lea ppa repo .

Moim rozwiązaniem było odinstalowanie węzła, a następnie zainstalowanie go w ten sposób:

Pobierz najnowsze stabilne źródła węzłów ze strony nodejs.org #in my case node-v0.10.20.tar.gz

tar -zxf node-v0.10.20.tar.gz # nieskompresuj źródeł

cd node-v0.10.20 #enter nieskompresowany folder

sudo chown $ USER -R / usr / local

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

PD: Jeśli nie chcesz zmieniać właściciela folderu / usr / local, możesz go zainstalować gdzieś, co już posiadasz. Problemem tego podejścia jest to, że będziesz musiał powiązać folder instalacyjny z wierszem poleceń bash, abyśmy mogli później użyć polecenia node

mkdir ~ / opt

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

echo 'export PATH = ~ / opt / bin: $ {PATH}' >> ~ / .bashrc #or ~ / .profile or ~ / .bash_profile lub ~ / .zshenv w zależności od aktualnego systemu operacyjnego

Przy każdym z tych podejść będziesz mógł wykonać następujące czynności bez korzystania z sudo

npm install -g moduł_do_instalacji

HeberLZ
źródło
1
Skończyło się na tej metodzie. Używał sudo chown $USER /use/localprzed budowaniem. Na razie wygląda dobrze, czas spróbować zbudować atom! Dzięki!
prasanthv
6

Po uruchomieniu npm install -g gdzieś, może pojawić się błąd EACCES z prośbą o ponowne uruchomienie polecenia jako root / Administrator. To kwestia uprawnień.

Jest to łatwe do naprawienia , należy otworzyć twój terminal (Aplikacje> Narzędzia> Terminal)

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

** Zdecydowanie odradzam korzystanie z zarządzania pakietami w sudo (sudo npm -g zainstaluj coś), ponieważ możesz później uzyskać pewne problemy **

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

Juancarlos Rodríguez
źródło
Tak! ten mi to zrobił! po zrobieniu inne inne wymienione powyżej: sudo chown -R `whoami` ~/.npm, sudo chown -R `whoami` /usr/local/libi
Regis Zaleman
8
Może to powodować problemy z uprawnieniami w wielu innych aplikacjach, więc sugeruję, aby tego nie robić. Po co wymieniać puszki robaków na inne?
Brad Parks,
1
Lub przynajmniej udoskonal go do / usr / local / lib / node_modules.
Ken
To, to i jeszcze więcej to. Uderzyłem głową w ścianę. +1
deska rozdzielcza
To był mój problem. Na nowym Macbooku (os x 10.10.3) uprawnienia do / usr / local / lib / node_modules były następujące: $ ll / usr / local / lib / node_modules łącznie 0 drwxr-xr-x 3 24561 koło 102B 31 marca 18:19 . drwxrwxr-x 4 24561 admin 136B 31 marca 18:19 .. drwxr-xr-x 26 65534 pracowników 884B 13 kwietnia 10:53 npm
tkane2000
5

Dla komputerów Mac (na podstawie odpowiedzi Christophera Willa)

Mac OS X 10.9.4

  1. Preferencje systemowe> Użytkownicy i grupy> (odblokuj)> naciśnij +:

    Nowe konto>
    Nazwa konta „Grupa” : nodegrp

    Po utworzeniu grupy zaznacz użytkownika, który ma zostać włączony do tej grupy

  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

rozpoznać
źródło
1
Musiałem zmienić kilka ścieżek do / usr / local / bin, ale poza tym to rozwiązanie działało świetnie na mojej maszynie OX X 10.9 - dzięki!
splig
Zła praktyka zmiany własności katalogów systemowych.
bogate przypomnienie
@richremer Myślę, że to zależy od tego, co próbujesz osiągnąć. jeśli folder jest pierwotnie dostępny tylko dla sudoer, można go zmienić tylko w ten sposób. ograniczamy zmianę do folderu związanego z npm. Czy bezpieczniej byłoby zachować sudolub zmienić własność grupy folderów, aby mogła być modyfikowana przez zwykłego użytkownika? Jeśli zwykły użytkownik nie powinien wykonywać żadnych działań na tym folderze, to oczywiście nie powinien zmieniać własności grupy do tego folderu.
Ken
Właściwą rzeczą jest zainstalowanie globalnych pakietów za pomocą sudo, ale zrób to z -Hflagą. W szczególności sudo -H npm install -g <pkg>. Zapewnia to prawidłowe określenie uprawnień do folderów systemowych i użytkowników. To, czego nie chcesz robić, to używać sudo npm install -g, ponieważ instaluje pliki należące do katalogu głównego do katalogu użytkownika. Byłoby wspaniale, gdyby npm były wystarczająco inteligentne, aby zrobić to we właściwy sposób, ale tak nie jest, więc musisz użyć -Hflagi sudo, aby poprawnie zainstalować globalnie.
rich remer
4

W moim przypadku dzieje się tak z powodu zgody ~ / tmp.

sudo chown -R $USER ~/tmp

I jest OK!

bnPYSse
źródło
4

Dla mnie wykonaj tylko

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

nie działa Potem też wykonuję

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

I wszystko działa dobrze!

użytkownik3753202
źródło
Jesteś bardzo niesamowity, proszę pana :)
user805981,
Pliki w /usr/libsą plikami systemowymi i nie powinny być własnością twojego osobistego konta użytkownika.
rich remer
4

PROBLEM : Ty (użytkownik) nie masz odpowiedniego zestawu uprawnień do katalogu.

Natychmiastowym wyjściem jest uruchomienie instalacji npm przy użyciu sudo, ale może to dać ten sam błąd lub nieprawidłową instalację.

ORAZ zmiana własności katalogu nie jest dobrą opcją, tymczasową łatką.


Rozwiązanie / Sugestia : Zmień domyślny katalog npm (z oficjalnych dokumentów )

Utwórz kopię zapasową komputera przed przejściem do przodu.

(opcjonalnie) W przypadku błędnej instalacji najpierw ją odinstaluj:

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. Utwórz katalog dla instalacji globalnych:

    mkdir ~/.npm-global

  2. Skonfiguruj npm, aby używał nowej ścieżki do katalogu:

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

  3. Otwórz lub utwórz plik ~/.profilelub ~/.bash_profilei dodaj ten wiersz:

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

  4. Wróć do wiersza poleceń, zaktualizuj zmienne systemowe lub ponownie uruchom terminal:

    source ~/.profile

  5. (opcjonalnie) Test: Pobierz pakiet globalnie bez użycia sudo.

    npm install -g jshint

Nabeel Ahmed
źródło
3

W przypadku, gdy sudo chown -R $(whoami) ~/.npmnie działało to dla Ciebie lub potrzebujesz nieterminowego rozwiązania do komend.

Problem polega na tym, że Twoje konto użytkownika nie ma uprawnień do zapisu w folderze node_modules, więc możesz wykonać następujące czynności

  1. Otwórz wyszukiwarkę i naciśnij cmd+ shift+, gaby otworzyć przejdź do folderu z adresem URL

  2. Wpisz następującą ścieżkę /usr/local/lib/node_modulesi naciśnij klawisz Go

  3. Kliknij node_modulesfolder prawym przyciskiem myszy i wybierzGet Info

  4. Przewiń w dół do sharing & permissionssekcji

  5. Odblokuj, aby móc wprowadzać zmiany.

  6. Naciśnij +i dodaj swoje konto użytkownika

  7. Upewnij się, że wybierasz Read & Writez listy rozwijanej w uprawnieniu

Teraz powinieneś być w stanie zainstalować pakiety bez, sudoa problemy z pozwoleniami powinny zostać rozwiązane

Amr Labib
źródło
3

Problem: Nie masz uprawnień do zapisu w katalogach używanych przez npm do przechowywania globalnych pakietów i poleceń.

Rozwiązanie: Zezwól na uprawnienia dla npm.

Otwórz terminal:

polecenie + spacja, a następnie wpisz „terminal”

Wpisz to polecenie:

sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share}
  • Uwaga: będzie to wymagało twojego hasła.

To rozwiązanie pozwala TYLKO na posiadanie potrzebnych katalogów, dzięki czemu inne katalogi są ładne i bezpieczne.

Matt
źródło
Głosowanie w dół, ponieważ ustawianie własności folderów systemowych przez użytkownika jest anty-wzorcem, co nie stanowi tego. W specjalnym przypadku, który npm config get prefixzwraca coś w folderze domowym, to rozwiązanie naprawi uprawnienia, ale nie rozwiąże problemu leżącego u podstaw instalacji globalnych pakietów w bezpieczny sposób dla współdzielonego środowiska.
rich remer
Spowoduje to przepisanie uprawnień ogromnej części systemu operacyjnego. Uruchomienie tego na przykład w Ubuntu spowoduje, że samo polecenie „sudo” stanie się bezużyteczne.
Sahand Seifi
2

Kolejna świetna poprawka do prawidłowego skonfigurowania NPM, uruchom następujące polecenia:

npm config set prefix '~/.npm_packages'
PATH=$PATH:$HOME/.npm_packages/bin; export PATH
Guillaume Le Mière
źródło
2

możesz spróbować, działa na Ubuntu i Mac

sudo chown -R $(whoami) /usr/local/lib/node_modules
Adeojo Emmanuel IMM
źródło
1
Uruchomiłem to i pracowałem dla mnie w 100% na komputerze Mac: sudo chown -R $ (whoami) / usr / local / lib / node_modules
leeroya
1

Wydaje mi się, że najlepszą opcją jest ta sugerowana w dokumentacji npm , która polega na pierwszym sprawdzeniu, gdzie globalne moduły węzłów są domyślnie instalowane przez uruchomienie npm config get prefix. Jeśli tak, jak ja w Trusty,/usr możesz chcieć zmienić go na folder, który możesz bezpiecznie posiadać, nie psując rzeczy tak jak ja.

Aby to zrobić, wybierz lub utwórz nowy folder w systemie. Możesz chcieć mieć to w swoim katalogu domowym lub, podobnie jak ja, /usr/localdla zachowania spójności, ponieważ jestem także użytkownikiem komputera Mac (wolę nie patrzeć w różne miejsca w zależności od komputera, przed którym się znajduję). Innym dobrym powodem do tego jest fakt, że /usr/localfolder jest już prawdopodobnie w twojej ŚCIEŻCE (chyba że lubisz się bawić z ŚCIEŻKĄ), ale są szanse, że twój nowo utworzony folder nie jest i trzeba go dodać do ŚCIEŻ SIĘ w swoim pliku .bash-profile lub .bashrc .

Krótko mówiąc, zmieniłem domyślną lokalizację globalnych modułów npm config set prefix '/usr/local', utworzyłem folder /usr/local/lib/node_modules(będzie używany przez npm) i zmieniłem uprawnienia do folderów używanych przez npm za pomocą polecenia:

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

Teraz możesz bezpiecznie zainstalować globalnie dowolny moduł. Mam nadzieję że to pomoże!

yago
źródło
1

W ten sposób rozwiązałem problem w systemie Windows 8.1:

  • Przejdź do instalacji nodejs (zwykle C: \ Program Files \ nodejs)
  • Kliknij prawym przyciskiem myszy folder node_modules i przejdź do właściwości
  • Kliknij kartę Zabezpieczenia i zaawansowane
  • U góry zobaczysz „Właściciel: SYSTEM”, kliknij zmień
  • Wprowadź użytkownika, dla którego chcesz uzyskać uprawnienia, i kliknij OK
  • Zaznacz pole u dołu ustawień zaawansowanych „Zastąp wszystkie wpisy uprawnień do obiektów potomnych wpisami uprawnień dziedziczonych z tego obiektu” i kliknij OK
  • Wykonaj dowolną instalację / aktualizację npm, czego potrzebujesz
K Caradonna
źródło
1

Najlepszym rozwiązaniem byłoby to, które zapewnia dokumentacja npm.


W przypadku Ubuntu sugerowanym rozwiązaniem jest Opcja # 2

Krótkie kroki:
Utwórz katalog dla instalacji globalnych:
mkdir ~/.npm-global

Skonfiguruj npm, aby używał nowej ścieżki do katalogu: może pomóc ci sprawdzić, czy prefiks został zaktualizowany, czy nie. Wynik byłby <Twój katalog domowy> /. Npm-global
npm config set prefix '~/.npm-global'
npm config get prefix

Otwórz lub utwórz plik ~ / .profile i dodaj ten wiersz:
export PATH=~/.npm-global/bin:$PATH

Wróć do wiersza poleceń i zaktualizuj zmienne systemowe:
source ~/.profile

Zamiast kroków 2-4 możesz także użyć odpowiedniej zmiennej ENV (np. Jeśli nie chcesz modyfikować ~ / .profile):

NPM_CONFIG_PREFIX=~/.npm-global


W przypadku komputerów Mac sugerowane rozwiązanie to opcja nr 3

W systemie Mac OS można całkowicie uniknąć tego problemu, używając menedżera pakietów Homebrew

brew install node

Himanshu
źródło
Ten NPM_CONFIG_PREFIX nie będzie działać. Jest to błąd w opisie npm. Zobacz mój post powyżej, jak to zrobić we właściwy sposób: stackoverflow.com/a/41395398/1256697
suther
1

Rozwiązuję go, zmieniając właściciela z roota na moją nazwę użytkownika

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

zmień mnie swoją nazwą użytkownika i grupą.

Salem
źródło
1

Lubię używać grup ubuntu, aby to osiągnąć, zamiast zmieniać właściciela. To dość proste.

  1. Najpierw zainstaluj nodejs i npm za pomocą apt-get

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

  2. Dowiedz się, kto jest zalogowany, tj. Nazwa użytkownika, uruchom następującą komendę, aby zobaczyć ją w terminalu

    whoami

  3. Możesz zobaczyć listę grup, które zostały ci przypisane za pomocą bardzo prostej komendy, zwykle pierwszą grupą jest sama nazwa użytkownika

    groups

  4. Uruchom następujące, aby umożliwić dostęp zalogowanemu użytkownikowi

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

  5. Zaktualizuj npm i nodejs

    npm install -g npm

Masz wszystko, użytkownik może uruchamiać polecenia npm bez sudo

Możesz również skorzystać z tego linku https://askubuntu.com/a/1115373/687804

Gitesh Dalal
źródło
0

W systemie Mac OS X podczas instalacji za pomocą Homebrew's brew install npm ścieżka instalacji obejmuje /usr/local/share/npm/zarówno podfoldery, jak bin/i lib/node_modules/podfoldery.

Uruchomienie tego polecenia, aby zmienić właściciela na aktualnie zalogowanego użytkownika, powinno to wszystko naprawić i umożliwić instalację globalnych pakietów NPM bez sudo.

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

Joel Purra
źródło
1
Dziś polecam inną moją odpowiedź na to pytanie , który używa npm configzamiast.
Joel Purra
0

Właściwie miałem ten sam problem. Uruchomiłem Ubuntu. Mój problem powstaje, ponieważ straciłem swój klucz publiczny Ubuntu. Nawet aktualizacja mojego systemu nie miała miejsca. Dał błąd GPG. W takim przypadku możesz odzyskać klucz, używając tego polecenia:

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

Po tym npm działa dobrze!

sam100rav
źródło
0

John Papa wskazuje na historię i uzasadnienie tego problemu i daje solidną poprawkę :

Kroki Johna Papy to:

  1. Użyj napar, aby zainstalować węzeł bez npm
  2. Zaktualizuj plik .bash_profile / .bashrc, aby poinformować npm i węzeł, gdzie należy zainstalować i znaleźć pakiety
  3. Użyj brew, aby zaktualizować węzeł, a npm, aby się zaktualizować

Mam nadzieję, że to pomaga ciekawskim!

statek
źródło
0

To rozwiązanie wykorzystałem i pracowałem. Próbowałem wykorzystać whoaminigdy nie działało.

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

następnie

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

następnie

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

Casey Robinson
źródło
0

Odpowiedź @Yves M. była bardzo podobna do mojego rozwiązania. Oto polecenia, których użyłem, które nieco różniły się od jego.

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

Następnie zapytaj o najnowszą wersję:

nvm ls-remote

Następnie zainstaluj najnowszą wersję:

nvm install YOUR_VERSION_HERE

przykład

nvm install v5.8.0
Ryan Loggerythm
źródło