2016-07-15 12 views
6

Już miałem rozpocząć jakiś projekt node.js w domu, ale natknąłem się na dziwne zachowanie podczas instalowania pakietów npm na całym świecie.Zestawy npm dziwne zezwolenia dla pakietów zainstalowanych globalnie

Używam WebStorm jako mojego IDE i chcę korzystać z funkcji ECMAScript6, co oznacza, że ​​muszę transponować źródła, które WebStorm robi za pomocą Babel.

Więc próbowałem zainstalować Babel globalnie:

$ sudo npm install -g babel-cli 

Co się dzieje, że te pliki są dostępne w porządku od użytkownika root i katalog babel-cli i wszystkich plików i katalogów w nim wyglądać dobrze tak długo, jak Wyglądam jak root. Problem zaczyna się, kiedy próbuję spojrzeć na opakowaniu, lub wykorzystać go, jako inny użytkownik:

$ ls -l /usr/lib/node_modules/babel-cli/ 
ls: cannot access '/usr/lib/node_modules/babel-cli/lib': Permission denied 
ls: cannot access '/usr/lib/node_modules/babel-cli/index.js': Permission denied 
ls: cannot access '/usr/lib/node_modules/babel-cli/scripts': Permission denied 
ls: cannot access '/usr/lib/node_modules/babel-cli/node_modules': Permission denied 
ls: cannot access '/usr/lib/node_modules/babel-cli/package.json': Permission denied 
ls: cannot access '/usr/lib/node_modules/babel-cli/README.md': Permission denied 
ls: cannot access '/usr/lib/node_modules/babel-cli/bin': Permission denied 
total 0 
d????????? ? ? ? ?   ? bin/ 
d????????? ? ? ? ?   ? lib/ 
d????????? ? ? ? ?   ? node_modules/ 
d????????? ? ? ? ?   ? scripts/ 
-????????? ? ? ? ?   ? index.js 
-????????? ? ? ? ?   ? package.json 
-????????? ? ? ? ?   ? README.md 

To nie ma znaczenia, który pakiet zainstalować, wszyscy stają się w ten sposób.

Używam node.js v6.3.0 i npm 3.10.3, na Ubuntu 16.04.

Zainstalowałem plik node.js świeżo zgodnie z instrukcją here. Jeśli spróbuję zaktualizować npm, to samo dzieje się z globalnym katalogiem npm, a npm staje się niedostępny z wyjątkiem root.

Kiedy liście światowego node_modules jako użytkownik widzę

$ ll /usr/lib/node_modules/ 
total 8,0K 
drwxr--r-- 6 nobody root 4,0K jul 15 23:50 babel-cli/ 
drwxr-xr-x 10 root root 4,0K jul 15 23:21 npm/ 

Poza tym katalogu są własnością przez nobody widzę nic specjalnego.

Nie ma oczywiście żadnych błędów podczas instalacji pakietu.

Czy coś jest nie tak z npm i/lub węzłem? Czy jest coś nie tak z Ubuntu? Lub jak zainstalowałem węzeł? Jaki mógł być powód czegoś takiego?

Instalacja lokalna działa dobrze, a dla pakietu babel-cli jest to dopuszczalne rozwiązanie, aby zainstalować go jako pakiet rozwoju lokalnego. Nadal chciałbym wiedzieć, co dzieje się podczas instalowania pakietów na całym świecie i dlaczego.


Problem answered here. Problem nie był związany z npm i node.

+0

używam repozytorium źródłowego i węzła Nie widziałem tych problemów. Jednak używam węzła 4.4 ze starszym npm. Czy masz problem z Babel? A co z innymi narzędziami CLI, takimi jak grunt, łyk, altana itp.? – tsturzl

+0

@tsturzl To samo dotyczy wszystkich pakietów instalowanych globalnie. –

+0

Nigdy, przenigdy nie używaj 'sudo' z' npm'. Po prostu prosisz o kłopoty. Wyczyść węzeł, wszystkie moduły i katalogi i zainstaluj wszystko z normalnymi uprawnieniami użytkownika. – xdumaine

Odpowiedz

5

Jeśli chcesz zainstalować pakiet na całym świecie, wystarczy użyć polecenia bez sudo jak:

$ npm install -g <package> 

Jeśli otrzymujesz EACCES lub pozwolenia błędów, wykorzystanie sudo należy unikać jednak należy zamiast naprawić twoje uprawnienia, więc npm może działać bez sudo.

Te błędy są zgłaszane, jeśli nie masz uprawnień do zapisu w folderze, którego npm używa do przechowywania pakietów globalnych. Aby to naprawić, można zacząć od znalezienia jaka jest ścieżka do domyślnego katalogu KMP w:

$ npm config get prefix 

W większości systemów, to będzie /usr/local i będziesz w stanie ustalić uprawnienia do tego folderu.Jeśli folder jest /usr lub /usr/lib, nie powinieneś zmieniać uprawnień do tego katalogu, ponieważ spowoduje to pewne problemy iw tym przypadku, gdy nie chcesz zmieniać uprawnień domyślnego katalogu, możesz skonfigurować npm, aby użyć innego katalogu .

Jeżeli możesz i chcesz zmienić uprawnienia do folderu domyślnego, można użyć:

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

To będzie zmienić właściciela katalogów NPM do nazwy bieżącego użytkownika.

Jeśli chcesz zmienić domyślny katalog NPM, można rozpocząć od utworzenia nowego folderu:

$ mkdir ~/.npm-packages 

Następnie należy skonfigurować npm użyć tego nowego folderu:

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

You Będziesz także musiał dodać ten nowy folder do swojego PATH (na przykład używając ~/.profile):

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

W tym miejscu można zaktualizować zmienne systemowe za pomocą source ~/.profile i przetestować, aby zainstalować pakiet globalnie, bez korzystania z sudo.

Powinieneś być w stanie zainstalować pakiet bez żadnych błędów uprawnień, ponieważ npm użyje folderu ~/.npm-packages.

Możesz znaleźć więcej informacji na ten temat na temat npm documentation.

+0

Głosowałem za odrzuceniem, ponieważ przyznanie nieuprawnionego prawa własności do katalogów systemowych w '/ usr' jest zawsze złym pomysłem, co wydaje się zachęcać do tej odpowiedzi. Jeśli chcesz zainstalować moduły globalnie (tj. W systemie, aby inni użytkownicy mogli z nich korzystać), musisz to zrobić jako użytkownik 'root' lub przez' sudo'. Robienie czegokolwiek innego jest nieodpowiedzialne - na własnej maszynie jest to problem, ale uczenie programistów, że to jest poprawna metoda, a potem robią to na swoich serwerach, jest katastrofą. – Guss

+0

Modyfikacja uprawnień jest sugerowana tylko wtedy, gdy domyślnym domyślnym adresem jest '/ usr/local', a odpowiedź wyraźnie stwierdza, że ​​jeśli znajduje się w innym katalogu, uprawnienia nie powinny być modyfikowane. Z drugiej strony, jeśli uważasz, że modyfikowanie uprawnień w '/ usr/local' jest nadal złym pomysłem, może powinieneś [otworzyć problem natychmiast na npm] (https://github.com/npm/npm/issues) ponieważ jest to oficjalny, udokumentowany i zalecany sposób ustalania uprawnień: https://docs.npmjs.com/getting-started/fixing-npm-permissions – HiDeo

+0

Jestem zaznajomiony z tym idiotycznym dokumentem i już istnieje błąd dotyczący to: https://github.com/npm/docs/issues/745. wydaje się, że zgadza się właściciel dokumentacji NPM (przynajmniej). Mam nadzieję, że wkrótce to naprawi, jak obiecała. – Guss

0

Jeśli zmienisz użytkownika, musisz wykonać jedną z poniższych czynności, ponieważ po zainstalowaniu npm w tym czasie, jesteś instalowany jako użytkownik root, ale po tym, jak zmienisz użytkownika i to spowoduje błąd uprawnień, ponieważ oznacza to, że robisz nie mam uprawnień do zapisu do katalogów, które używa npm do przechowywania globalnych pakietów i poleceń. Możesz to naprawić przez: -

Użyj menedżera pakietów, który się tym zająć.

Jeśli robisz nową instalację węzła w systemie Mac OS, możesz całkowicie uniknąć tego problemu, używając menedżera pakietów Homebrew. Homebrew ustawia rzeczy po wyjęciu z pudełka z odpowiednimi uprawnieniami. Domyślnym katalogiem

brew install node 

LUB

Zmień NPM do innego katalogu

Są chwile, kiedy nie chcą zmienić prawo własności do domyślnego katalogu NPM zastosowania (czyli/usr) ponieważ może to spowodować pewne problemy, na przykład jeśli dzielisz system z innymi użytkownikami.

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.

Zrób katalog dla instalacji globalnych:

mkdir ~/.npm-global 

Konfiguruj KMP korzystać z nowej ścieżki katalogu:

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

Otwórz lub utwórz ~/.profile plik i dodać ten wiersz:

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

Powrót do linii poleceń, zaktualizuj zmienne systemowe:

source ~/.profile 

Test: pobierz pakiet globalnie bez użycia sudo.

npm install -g babel-cli 

Zamiast kroki 2-4 można także użyć odpowiedniej zmiennej ENV (np jeśli nie chcą zmodyfikować ~/.profile):

NPM_CONFIG_PREFIX=~/.npm-global 
Powiązane problemy