NPM không thể cài đặt phụ thuộc - Cố gắng mở khóa thứ gì đó chưa bị khóa


192

Tôi đã cố chạy cài đặt npm trên tệp pack.json của mình, nhưng tôi gặp nhiều rắc rối. Nó liên tục nói "Lỗi: Cố gắng mở khóa XXX, đã không bị khóa" trên tất cả các phụ thuộc của tôi. Đây là một trong số họ:

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)

Nếu tôi cố chạy nó dưới dạng sudo, nó dường như tiến xa hơn và bắt đầu cài đặt một số gói, nhưng một số lỗi mới bật lên thay thế:

> 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'

Gần đây tôi đã cập nhật cài đặt nút và npm của tôi. Vì vậy, có lẽ điều đó có liên quan đến nó. Ngoài ra, hầu hết sự phát triển của tôi là tại văn phòng và hôm nay tôi đang làm việc qua VPN, vì vậy có lẽ điều đó cũng có liên quan.

Có ý kiến ​​gì không?


Đây là tệp pack.json, nếu điều đó giúp ... (thở dài), nvm, tôi dường như không thể dán nó vào .. quá nhiều ký tự.
TJ Kirchner

Bạn đang chạy cái gì vậy
wayne

Câu trả lời:


421

Theo photusenigma tại: https://github.com/npm/npm/issues/4815

Chạy các lệnh này trong cửa sổ đầu cuối (lưu ý - KHÔNG thay thế phần $ USER ... đó là lệnh linux để có được người dùng của bạn!):

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

... và ... nếu bạn đang sử dụng máy mac (như tôi) và vẫn thấy lỗi sau khi chạy các lệnh này, thì hãy chạy lệnh cuối cùng này và bạn sẽ ổn. (Đề nghị bạn thử kiểm tra trước khi thực hiện việc này. Tôi không muốn thay đổi quyền trên thư mục ENTIRE / usr / local trừ khi thực sự cần thiết!)

sudo chown -R $USER /usr/local

7
Làm việc cho tôi cảm ơn! Mặc dù vậy, thư mục node_modules của tôi đã ở một vị trí khác, có lẽ điều này sẽ giúp người khácsudo chown -R `whoami` /usr/lib/node_modules/
Justen

4
Kỳ lạ thay, đệ quy chownđã không thay đổi quyền ~/.npm/_lockscho tôi. Tôi đã khai thác được công việc của mình bằng cách chạysudo chown -R myname ~/.npm/_locks
Sitati

7
Xin lưu ý rằng giải pháp này không tốt cho các nền tảng đa người dùng. Lệnh đầu tiên là ok, lệnh thứ hai tạo chủ sở hữu người dùng chuẩn của các tệp hệ thống. / usr / local / lib / node_modules chỉ được sử dụng bởi npm với tùy chọn --global, có nghĩa là cũng sử dụng sudo. Thật không may, một số tập lệnh cài đặt sử dụng npm trộn cả hai lệnh npm toàn cầu và không toàn cầu ... Tạo mớ hỗn độn này.
Fafaman

5
Đồng ý, tất cả những gì bạn cần là lệnh đầu tiên. Tránh những người khác vì những người thực sự không nên thuộc sở hữu của người dùng của bạn.
pyrospade 2/2/2015

2
Có cách nào để đảo ngược "hiệu ứng" của dòng thứ hai sudo chown -R $USER /usr/local/lib/node_moduleskhông? Tôi đã chạy nó trước khi đọc rằng đó không phải là một ý tưởng tốt ..
shaneparsons

153

Tôi đã làm việc với một đồng nghiệp chiều nay và tìm ra vấn đề là gì. Thư mục ".npm" trong thư mục nhà của tôi được sở hữu bởi người dùng root thay vì chính tôi. Tôi không chắc điều gì đã xảy ra để gây ra điều đó. Có thể tôi đã cài đặt nút hoặc npm làm quản trị viên gốc tại một thời điểm. Trong mọi trường hợp tôi chỉ chạy sudo chown -R [username] .npmvà cuối cùng tôi đã có thể chạy npm installcác lệnh từ các dự án của tôi một lần nữa!


11
Nó cũng hữu ích nếu bạn cũng thực hiện cùng một lệnh ~/tmp/hoặc bất kỳ vị trí nào Node sử dụng làm vị trí tạm thời
Jason

1
Cảm ơn bạn vì câu trả lời! Cứu tôi một số đau đầu vì thông báo lỗi là xấu. Nhưng tôi sẽ nói rằng, npm phải làm điều này theo mặc định bởi vì tôi khá chắc chắn rằng tôi đã không tự cài đặt nó dưới quyền root. Và, để hoàn chỉnh, bạn phải truy cập -R <tên người dùng> .npm
crowmagnumb

Vui mừng tôi có thể giúp :) Và, bắt tốt! Tôi sẽ sửa đổi phản ứng của tôi để nói rằng.
TJ Kirchner

Cứu người! Cảm ơn bạn
Matthew Cullum

21

Trong trường hợp của tôi, sự cố đã gọi npm với người dùng không có thư mục HOME, vì vậy, ví dụ lệnh sau sẽ thất bại:

sudo -u someUser npm install

Giải pháp là cung cấp một thư mục HOME, nơi someUsercó quyền truy cập ghi:

sudo -u someUser HOME=/some/directory npm install

Được khuyến khích bởi vì điều này thực sự đã làm việc cho tôi, vì vậy, và lời cảm ơn. Tôi đang triển khai để sản xuất và người dùng thậm chí không có thư mục .npm (dù sao tôi cũng có thể tìm thấy)
Stuart Watt

Hoạt động trên ChromeOS với người dùng "chronos".
Kyle Coberly 14/03/2015

Tôi đã có thể giải quyết vấn đề này bằng cách chỉ định sudo -u someUser -i, bắt đầu một vỏ đăng nhập mới. Tôi đã xem xét thêm một số điều này và mã bộ đệm trong npm sử dụng biến npm.cache, mà tôi đoán là mặc định $HOME/.npm/. sudo cũng có thể có hành vi khác nhau với những gì biến HOME được đặt thành tùy thuộc vào cấu hình và sự hiện diện hay vắng mặt của các tùy chọn dòng lệnh.
jgibson 18/03/2015

11

Có cùng một vấn đề và đã khắc phục nó bằng cách thay đổi các xác nhận theo câu trả lời được chấp nhận:

sudo chown -R $USER ~/.npm

Tuy nhiên, nên tránh lệnh thứ hai vì nó hạ cấp các quyền của tài nguyên hệ thống ( sudo chown -R $USER /usr/local/lib/node_modules). Không phải là một ý tưởng tốt.

Đối với bản ghi: "usr" /usr/locallà viết tắt của Tài nguyên hệ thống Unix .


1
Đây có lẽ nên là một nhận xét về câu trả lời được chấp nhận hơn là đăng dưới dạng một câu trả lời mới.
Kmeixner

Tác giả của câu trả lời đó biết điều này nhưng chưa cập nhật câu trả lời của anh ấy, vì vậy tôi nói một câu trả lời riêng biệt được bảo hành nhiều.
Gui Prá

4

Không ai trong số này làm việc cho tôi. Tôi đã phải chạy theo nghĩa đen là root bằng cách làm như sau:

sudo su -
sudo npm install forever -g

Sau đó gói được cài đặt trên Linux Ubuntu 14.04.


Bạn thực sự không nên chạy npm như root!
Antoine 'hashar' Musso


1

Giải pháp của tôi:

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

trong trường hợp của tôi là:

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

Nhưng tôi đã gặp vấn đề tương tự, cuối cùng sau đó

npm cache clean

nó đã làm việc !


0

Tôi gặp vấn đề tương tự và đã cố gắng sửa quyền / quyền sở hữu các tệp và thư mục liên quan đến npm trong nhiều giờ nhưng không gặp may với điều đó.

Đột nhiên tôi thấy rằng tôi có ~/.npmrctập tin với cachemục nhập trỏ đến một thư mục không tồn tại. Đã xóa thuộc tính đó cacheđể sử dụng vị trí bộ đệm mặc định và bây giờ nó đã được giải quyết.


0

Khước từ

Tôi là người dùng Windows . Tuy nhiên, nhóm của tôi và tôi đã gặp một số vấn đề liên quan đến lỗi cài đặt npm.

Các vấn đề

Sau đây là danh sách các bài học kinh nghiệm và giải pháp căn cơ có thể luôn giải cứu chúng tôi:

  1. node_modules , các NPM thư mục cài đặt cục bộ bị bảo vệ từ sửa đổi bởi một thiếu sót của hệ điều hành như không có khả năng xử lý đường dẫn dài hơn 255 ký tự.
  2. Nếu thư mục bị xóa bằng công cụ dòng lệnh, nó vẫn có thể xuất hiện như thể thư mục tồn tại trong trình thám hiểm mà khi cố gắng truy cập, nó sẽ đưa ra một số lỗi về quyền.
  3. Tùy thuộc vào trình chống vi-rút và / hoặc trình quản lý chính sách cục bộ của bạn, bạn có thể tạo thư mục node_modules và sau đó đã từ bỏ quyền truy cập hoặc quyền truy cập vào nó dẫn đến một số lỗi cài đặt.
  4. Cho phép nhật ký npm để hiểu rõ hơn về các vấn đề có thể xảy ra với:

    npm install --loglevel verbose

Căn bản

Cài đặt rimraf trên toàn cầu

 npm install rimraf -g

Chạy rimraf trên node_modules :

rimraf yourDir/node_modules

Sau đó thử chạy:

npm install

Cảnh báo!

Hoạc thiếu điều đó. Hãy cực kỳ cẩn thận về những gì tuân theo lệnh rimraf. Không có cảnh báo, không có lời nhắc, không có gì. Nó chỉ đơn giản là xóa thư mục khỏi pha trái đất sạch, như thể nó không bao giờ ở đó. Thử nó với nguy cơ của mình bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.