NPM tidak dapat menginstal dependensi - Mencoba membuka kunci sesuatu yang belum dikunci

192

Saya sudah mencoba menjalankan instalasi npm pada file package.json saya, tetapi saya mengalami banyak masalah. Ia terus mengatakan "Kesalahan: Mencoba membuka kunci XXX, yang belum dikunci" pada semua ketergantungan saya. Ini salah satunya:

Error: Attempt to unlock tbd@~0.6.4, which hasn't been locked
        at unlock (/usr/local/lib/node_modules/npm/lib/cache.js:1304:11)
        at cb (/usr/local/lib/node_modules/npm/lib/cache.js:646:5)
        at /usr/local/lib/node_modules/npm/lib/cache.js:655:20
        at /usr/local/lib/node_modules/npm/lib/cache.js:1290:7
        at /usr/local/lib/node_modules/npm/node_modules/lockfile/lockfile.js:167:38
        at OpenReq.Req.done (/usr/local/lib/node_modules/npm/node_modules/graceful-fs/graceful-fs.js:144:5)
        at OpenReq.done (/usr/local/lib/node_modules/npm/node_modules/graceful-fs/graceful-fs.js:64:22)
        at Object.oncomplete (fs.js:107:15)

Jika saya mencoba menjalankannya sebagai sudo, sepertinya semakin jauh dan mulai menginstal beberapa paket, tetapi beberapa kesalahan baru muncul sebagai gantinya:

> chokidar@0.8.1 postinstall /Users/tkirchner/Documents/Projects/mm-datatable/node_modules/karma/node_modules/chokidar
> node setup-deps.js

shell-init: error retrieving current directory: getcwd: cannot access parent directories: Permission denied

node.js:811
    var cwd = process.cwd();
                      ^
Error: EACCES, permission denied
    at Function.startup.resolveArgv0 (node.js:811:23)
    at startup (node.js:58:13)
    at node.js:902:3
npm ERR! error rolling back Error: ENOTEMPTY, rmdir '/Users/tkirchner/Documents/Projects/mm-datatable/node_modules/karma/node_modules/q'
npm ERR! error rolling back  karma@0.10.9 { [Error: ENOTEMPTY, rmdir '/Users/tkirchner/Documents/Projects/mm-datatable/node_modules/karma/node_modules/q']
npm ERR! error rolling back   errno: 53,
npm ERR! error rolling back   code: 'ENOTEMPTY',
npm ERR! error rolling back   path: '/Users/tkirchner/Documents/Projects/mm-datatable/node_modules/karma/node_modules/q' }
npm ERR! Error: ENOENT, chown '/Users/tkirchner/Documents/Projects/mm-datatable/node_modules/karma/node_modules/socket.io/lib/socket.io.js'

Saya baru-baru ini memperbarui instalasi node dan npm saya. Jadi mungkin itu ada hubungannya dengan itu. Juga, sebagian besar pengembangan saya telah di kantor dan hari ini saya sedang mengerjakan VPN, jadi mungkin itu ada hubungannya dengan itu juga.

Ada ide?

TJ Kirchner
sumber
Ini file package.json, jika itu membantu ... (huh), nvm, sepertinya saya tidak bisa menempelkannya di ... terlalu banyak karakter.
TJ Kirchner
os apa yang kamu jalankan
wayne

Jawaban:

421

Sesuai photusenigma di: https://github.com/npm/npm/issues/4815

Jalankan perintah ini di jendela terminal (catatan - JANGAN ganti bagian $ USER ... itu perintah linux untuk mendapatkan pengguna Anda!):

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

... dan ... jika Anda menggunakan mac (seperti saya), dan masih melihat kesalahan setelah menjalankan perintah ini, maka jalankan yang terakhir ini dan Anda akan menjadi baik. (Rekomendasikan Anda mencoba pengujian sebelum melakukannya. Saya tidak suka mengubah izin pada direktori SELURUH / usr / lokal kecuali jika itu benar-benar diperlukan!)

sudo chown -R $USER /usr/local
alexoviedo999
sumber
7
Bekerja untuk saya, terima kasih! Folder node_modules saya berada di tempat yang berbeda, mungkin ini akan membantu orang lainsudo chown -R `whoami` /usr/lib/node_modules/
Justen
4
Anehnya, rekursif chowntidak mengubah izin ~/.npm/_locksbagi saya. Saya mendapatkan milik saya dengan menjalankansudo chown -R myname ~/.npm/_locks
Sitati
7
Ketahuilah bahwa solusi ini tidak baik untuk platform multi-pengguna. Perintah pertama ok, yang kedua membuat pemilik standar pengguna file sistem. / usr / local / lib / node_modules hanya digunakan oleh npm dengan opsi --global, itu berarti menggunakan sudo juga. Sayangnya, beberapa skrip instal menggunakan npm mencampur perintah npm global dan non global ... Membuat kekacauan ini.
Fafaman
5
Setuju, yang Anda butuhkan adalah perintah pertama. Hindari yang lain karena itu seharusnya tidak dimiliki oleh pengguna Anda.
pyrospade
2
apakah ada cara untuk membalikkan "efek" dari baris kedua sudo chown -R $USER /usr/local/lib/node_modules? Saya menjalankannya sebelum membaca bahwa itu bukan ide yang baik ..
shaneparsons
153

Saya bekerja dengan rekan kerja sore ini dan mencari tahu apa masalahnya. Folder ".npm" saya di direktori home saya dimiliki oleh pengguna root dan bukan saya. Saya tidak yakin apa yang menyebabkan itu. Mungkin saya menginstal node atau npm sebagai admin root pada satu titik. Bagaimanapun saya hanya berlari sudo chown -R [username] .npmdan akhirnya saya bisa menjalankan npm installperintah dari proyek saya lagi!

TJ Kirchner
sumber
11
Ini juga membantu jika Anda menjalankan perintah yang ~/tmp/sama juga, atau lokasi apa pun yang digunakan Node sebagai lokasi temp
Jason
1
Terima kasih atas jawaban Anda! Menyelamatkan saya sakit kepala karena pesan kesalahannya buruk. Tapi saya akan mengatakan, bahwa npm harus melakukan ini secara default karena saya cukup yakin saya tidak menginstalnya di root sendiri. Dan, untuk kelengkapan, Anda harus chown -R <username> .npm
crowmagnumb
Senang saya bisa membantu :) Dan, tangkapan yang bagus! Saya akan mengubah respons saya untuk mengatakan itu.
TJ Kirchner
Penolong! Terima kasih
Matthew Cullum
21

Dalam kasus saya masalahnya adalah meminta npm dengan pengguna yang tidak memiliki direktori HOME, jadi misalnya perintah berikut akan gagal:

sudo -u someUser npm install

Solusinya adalah menyediakan direktori HOME, di mana someUsermemiliki akses tulis:

sudo -u someUser HOME=/some/directory npm install
Bjarke Walling
sumber
Terpilih karena ini benar-benar bekerja untuk saya, jadi pujian dan terima kasih. Saya menggunakan untuk produksi dan pengguna bahkan tidak memiliki direktori .npm (yang dapat saya temukan, bagaimanapun juga)
Stuart Watt
Bekerja di ChromeOS dengan pengguna "chronos".
Kyle Coberly
Saya dapat mengatasi ini dengan menentukan sudo -u someUser -i, yang memulai shell login baru. Saya melihat ini lagi dan kode caching di npm menggunakan variabel npm.cache, yang saya tebak secara default $HOME/.npm/. sudo juga dapat memiliki perilaku berbeda dengan variabel HOME yang akan diatur tergantung pada konfigurasi dan ada atau tidak adanya opsi baris perintah.
jgibson
11

Punya masalah yang sama dan memperbaikinya dengan mengubah pengajuan sesuai jawaban yang diterima:

sudo chown -R $USER ~/.npm

Namun, perintah kedua harus dihindari karena menurunkan izin sumber daya sistem ( sudo chown -R $USER /usr/local/lib/node_modules). Bukan ide yang bagus.

Sebagai catatan: "usr" /usr/localadalah kependekan dari Unix System Resources .

chris
sumber
1
Ini mungkin harus berupa komentar pada jawaban yang diterima daripada diposting sebagai jawaban baru.
Kmeixner
Penulis jawaban itu mengetahui hal ini tetapi belum memperbarui jawabannya, jadi saya katakan yang terpisah jauh lebih terjamin.
Gui Prá
4

Tak satu pun dari ini bekerja untuk saya. Saya harus menjalankannya sebagai root dengan melakukan hal berikut:

sudo su -
sudo npm install forever -g

Kemudian paket diinstal di Linux Ubuntu 14.04.

occasl
sumber
Anda seharusnya tidak menjalankan npm sebagai root!
Antoine 'hashar' Musso
2

Perintah berikut harus memperbaiki masalah izin:

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

Anda dapat membaca tentang solusi lain yang direkomendasikan secara resmi di sini:

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

Tim White
sumber
1

Solusi saya:

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

dalam kasus saya adalah:

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

Tapi saya mendapatkan masalah yang sama, akhirnya setelah itu

npm cache clean

itu berhasil!

mayo
sumber
0

Saya memiliki masalah yang sama dan mencoba untuk memperbaiki izin / kepemilikan file dan direktori terkait npm selama berjam-jam tetapi tidak beruntung dengan itu.

Tiba-tiba saya menemukan bahwa saya memiliki ~/.npmrcfile dengan cacheentri yang menunjuk ke direktori yang tidak ada. Dihapus cacheproperti itu untuk menggunakan lokasi cache default dan sekarang sudah dipecahkan.

Cheolgook
sumber
0

Penolakan

Saya adalah pengguna Windows . Namun, tim saya dan saya telah menemukan sejumlah masalah tentang kesalahan instalasi npm.

Masalah

Berikut ini adalah daftar pelajaran yang bisa diambil dan kemungkinan solusi radikal yang selalu menyelamatkan kami:

  1. node_modules , direktori instalasi lokal npm menjadi terlindungi dari modifikasi oleh kekurangan OS seperti ketidakmampuan untuk memproses jalur lebih lama dari 255 karakter.
  2. Jika folder dihapus dengan menggunakan alat baris perintah mungkin masih muncul seolah-olah folder itu ada di explorer bahwa ketika mencoba mengaksesnya memberikan sejumlah kesalahan izin.
  3. Bergantung pada antivirus dan / atau manajer kebijakan lokal Anda mungkin dapat membuat node_modules folder dan kemudian membuang akses atau izin ke sana sehingga menghasilkan sejumlah kesalahan instalasi.
  4. Aktifkan npm log untuk mendapatkan wawasan lebih lanjut tentang kemungkinan masalah dengan:

    npm install --loglevel verbose

Radikal

Instal rimraf secara global

 npm install rimraf -g

Jalankan rimraf di node_modules :

rimraf yourDir/node_modules

Kemudian coba jalankan:

npm install

Peringatan!

Atau kekurangan di sana. Berhati-hatilah dengan apa yang mengikuti perintah rimraf. Tidak ada peringatan, tidak ada permintaan, tidak ada apa-apa. Itu hanya menghapus direktori dari fase bumi bersih, seolah-olah itu tidak pernah ada. Cobalah dengan risiko Anda sendiri.

Wilmer Saint
sumber