Instalacja NPM nie powiodła się i wyświetlany jest komunikat „nie można uruchomić w wd”

153

Próbuję ustawić środowisko węzłów na nowej instancji Ubuntu 12.04, z już zainstalowanym Node 0.8.14, ale napotkałem problemy podczas próby uruchomienia npm install. Więc kiedy próbuję npm install, mówi, że muszę go uruchomić jako root lub adminisrator:

Error: EACCES, mkdir '/usr/local/lib/node_modules/coffee-script'
npm ERR!  { [Error: EACCES, mkdir '/usr/local/lib/node_modules/coffee-script']
npm ERR!   errno: 3,
npm ERR!   code: 'EACCES',
npm ERR!   path: '/usr/local/lib/node_modules/coffee-script',
npm ERR!   fstream_type: 'Directory',
npm ERR!   fstream_path: '/usr/local/lib/node_modules/coffee-script',
npm ERR!   fstream_class: 'DirWriter',
npm ERR!   fstream_stack: 
npm ERR!    [ 'DirWriter._create                 (/usr/local/lib/node_modules/npm/node_modules/fstream/lib/dir-writer.js:36:23)',
npm ERR!      '/usr/local/lib/node_modules/npm/node_modules/mkdirp/index.js:37:53',
npm ERR!      'Object.oncomplete (fs.js:297:15)' ] }
npm ERR! 
npm ERR! Please try running this command again as root/Administrator.

Ale kiedy próbujesz uruchomić go jako sudo, wyświetla się następująco:

npm WARN cannot run in wd PackNodeDev@0.0.1-166 npm install -g coffee-script node-gyp (wd=/home/ubuntu/PackNode)

W moim pliku package.json zawiera następujące skrypty:

"scripts": {
    "preinstall": "npm install -g coffee-script node-gyp",
    "start": "node server.js",
    "test": "mocha --require should --compilers coffee:coffee-script --colors"
 },

Pozostałe zależności od deweloperów obowiązują, odkąd wszystko poprawnie zainstalowałem na własnym komputerze (Mac). Czy ktoś ma pojęcie, dlaczego tak się dzieje?

EH
źródło

Odpowiedzi:

231

Dokumentacja mówi (także tutaj ):

Jeśli npm został wywołany z uprawnieniami roota, to zmieni identyfikator UID na konto użytkownika lub UID określone przez userkonfigurację, która domyślnie nobody. Ustaw unsafe-permflagę, aby uruchamiać skrypty z uprawnieniami roota.

Twoje opcje to:

  1. Biegnij npm installz --unsafe-permflagą:

    [sudo] npm install --unsafe-perm
  2. Dodaj unsafe-permflagę do package.json:

    "config": {
        "unsafe-perm":true
    }
  3. Nie używaj preinstallskryptu do instalowania modułów globalnych, zainstaluj je osobno, a następnie uruchom zwykłynpm install bez uprawnień roota:

    sudo npm install -g coffee-script node-gyp
    npm install

Powiązane :

Dmitrij Paszkiewicz
źródło
2
Przepraszam, że do tej pory tego nie widziałem. Próbowałem wcześniej "niebezpiecznej trwałej", ale to też nie działało. Problem nadal istnieje
EH
10
To działa dla mnie: sudo npm install --unsafe-permjednak sudo npm installnie, chociaż dodałem "unsafe-perm":truedo package.json ... Nie wiem dlaczego
Dmitry Pashkevich
8
Dodanie go do właściwości „config” w package.json powoduje ustawienie „npm_package_config_unsafe_perm”, więc opcja 2 nie działa. Zobacz: stackoverflow.com/questions/28763958/…
justmoon
„unsafe-perm”: prawda też zawiodła dla mnie. Szkoda, że ​​nie podał błędu i kontekstu (w tym zmiany uid) w komunikacie o błędzie, zamiast ogłupiać przyczynę nieistnienia i podać coś tajemniczego, zaskakującego i wrogiego.
android.weasel
Chociaż npm install --unsafe-permdziała dla mnie, próbowałem podążać za implikacjami dotyczącymi zmiany domyślnej userkonfiguracji. Tak zrobiłem npm set user my_useri npm set group my_group, które dodaje odpowiednie wpisy w .npmrcpliku użytkownika root . Problem polega jednak na tym, że node_modulessam folder i jego podfoldery są nadal własnością roota, więc to nie pomaga. Nie mogłem znaleźć żadnego sposobu, aby nie należały do ​​roota.
fulv
53

Jedyną rzeczą, która zadziałała, było dodanie .npmrcpliku zawierającego:

unsafe-perm = true

Dodanie tej samej konfiguracji do package.jsonnie przyniosło żadnego efektu.

Nieuwaga
źródło
36
w dockerze:RUN npm set unsafe-perm true
Alexander Mills,
jeśli używasz WSL, po prostu wpisz set unsafe-perm true. To ci pomoże
Stas Panyukov
26

Doświadczyłem tego samego problemu podczas próby opublikowania mojej aplikacji nodejs na prywatnym serwerze z systemem CentOs przy użyciu użytkownika root. Ten sam błąd jest wywoływany przez „postinstall”: „./node_modules/bower/bin/bower install” w moim pliku package.json, więc jedynym rozwiązaniem, które działało, było użycie obu opcji, aby uniknąć błędu:

1: użyj opcji --allow-root dla polecenia instalacji bower

"postinstall": "./node_modules/bower/bin/bower --allow-root install"

2: użyj opcji --unsafe-perm dla polecenia instalacji npm

npm install --unsafe-perm
Yassine Khachlek
źródło
12

OP tutaj, dowiedziałem się dużo więcej o node, odkąd po raz pierwszy zadałem to pytanie. Chociaż odpowiedź Dmitrija była bardzo pomocna, ostatecznie zrobiłem to dla mnie, aby zainstalować węzeł z odpowiednimi uprawnieniami.

Zdecydowanie nie polecam instalowania węzła przy użyciu jakichkolwiek menedżerów pakietów, ale raczej skompilowanie go samodzielnie, aby znajdował się w katalogu lokalnym z normalnymi uprawnieniami.

Ten artykuł zawiera bardzo jasne instrukcje krok po kroku, jak to zrobić:

https://www.digitalocean.com/community/tutorials/how-to-install-an-upstream-version-of-node-js-on-ubuntu-12-04

EH
źródło
2

Naprawiłem to, zmieniając właściciela /usr/locali ~/Users/user-nametak:

sudo chown -R my_name /usr/local

To pozwoliło mi zrobić wszystko bez sudo

Daniel O'Leary
źródło