npm ném lỗi mà không có sudo


1287

Tôi chỉ cài đặt nút và npm thông qua gói trên nodejs.org và bất cứ khi nào tôi cố gắng tìm kiếm hoặc cài đặt một cái gì đó với npm, nó sẽ đưa ra lỗi sau, trừ khi tôi sudo lệnh. Tôi có cảm giác đây là một vấn đề quyền? Tôi đã là quản trị viên.

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

35
Vui lòng xem xét giải pháp bằng cách sử dụng NVM : stackoverflow.com/a/24404451/1480391 (thay vì hack với quyền)
Yves M.

2
@janaspage Bạn không thể cài đặt nút hoặc NVM (Trình quản lý phiên bản nút) thông qua NPM (Trình quản lý gói nút), điều đó là vô nghĩa. NPM đến trong nút (nó được cài đặt cùng một lúc). Hãy xem trang Wikipedia: en.wikipedia.org/wiki/Npm_(software)
Yves M.

5
Cuối cùng, một giải pháp tốt hơn sudo chown: github.com/sindresorhus/guides/blob/master/iêu
Dmitri Zaitsev

Trong OSX và cài đặt nút với intaller 0kg chính thức, giải pháp này không hoạt động. Tôi đã sử dụng cái này thay thế: stackoverflow.com/a/34968008/675565
fmquaglia

2
Nó giải thích vấn đề và cách khắc phục: docs.npmjs.com/getting-started/fixing-npm-permissions
n00b

Câu trả lời:


2269

Điều này trông giống như một vấn đề quyền trong thư mục nhà của bạn. Để lấy lại quyền sở hữu của thư mục .npm thực thi:

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

102
Tôi nghĩ rằng đó whoamilà một trình giữ chỗ, nhưng nó hoạt động được gõ theo đúng nghĩa đen, vì vậy nó phải là một biến tôi không hiểu.
SimplGy

127
whoami là một lệnh shell thực tế en.wikipedia.org/wiki/Whoami . Các backticks xung quanh whoamiđảm bảo rằng nó được thực thi chính xác và sau đó được đặt vào lệnh chown

13
bạn cũng có thể tự xác định tên người dùng của mình. Nếu tên người dùng của bạn là "Simpleascouldbe", lệnh sẽ làsudo chown -R simpleascouldbe ~/.npm

13
NPM KHÔNG yêu cầu và cũng không nên được sử dụng sudo - xem câu trả lời dưới đây @HeberLZ đặc biệt lựa chọn thứ 2 của ông liên quan đến: ./configure --prefix = xxxxxx
Scott Stensland

9
@ChristopherWill: Điều này không thay đổi quyền sở hữu của một thư mục hệ thống. Này đang thay đổi quyền sở hữu của các thư mục trong thư mục chính của người dùng, mà nên được sở hữu bởi người sử dụng.
dùng4815162342

620

Quyền bạn sử dụng khi cài đặt Node sẽ được yêu cầu khi làm những việc như viết trong của bạn thư mục NPM ( npm link, npm install -g, vv).

Bạn có thể đã chạy cài đặt nút với quyền root, đó là lý do tại sao cài đặt gói toàn cầu yêu cầu bạn phải root.


Giải pháp 1: NVM

Đừng hack với quyền, cài đặt nút đúng cách.

Trên máy phát triển, bạn không nên cài đặt và chạy nút có quyền root, nếu không, những thứ như npm link, npm install -gsẽ cần các quyền tương tự.

NVM (Trình quản lý phiên bản nút) cho phép bạn cài đặt Node mà không cần quyền root và cũng cho phép bạn cài đặt nhiều phiên bản của Node để chơi dễ dàng với chúng .. Hoàn hảo để phát triển.

  1. Gỡ cài đặt Node (quyền root có thể sẽ được yêu cầu). Điều này có thể giúp bạn.
  2. Sau đó cài đặt NVM theo hướng dẫn trên trang này .
  3. Cài đặt Node qua NVM: nvm install node

Bây giờ npm link, npm install -gsẽ không còn yêu cầu bạn phải root.

Chỉnh sửa: Xem thêm https://docs.npmjs.com/getting-started/fixing-npm-permissions


Giải pháp 2: Cài đặt các gói trên toàn cầu cho một người dùng nhất định

Đừng hack với quyền, cài đặt các gói npm trên toàn cầu đúng cách.

Nếu bạn đang dùng OSX hoặc Linux, bạn có thể tạo một thư mục dành riêng cho người dùng cho gói và thiết lập toàn cầu của bạnnpmnodeđể biết cách tìm các gói được cài đặt toàn cầu.

Kiểm tra bài viết tuyệt vời này để biết hướng dẫn từng bước về việc cài đặt các mô-đun npm trên toàn cầu mà không cần sudo.

Xem thêm: tài liệu của npm về Sửa quyền npm .


32
Trong tất cả các giải pháp được đăng, giải pháp NVM ở đây cung cấp kết quả tốt nhất cho tôi. Rất khuyến khích sử dụng NVM thay vì chơi với quyền.
wenincode

9
Các hướng dẫn này đã làm việc rất tốt. Tuy nhiên, bạn có thể muốn xóa các mô-đun bạn đã cài đặt với sudo trước khi gỡ cài đặt nodejs : npm ls -gp | awk -F/ '/node_modules/ && !/node_modules.*node_modules/ {print $NF}' | xargs npm -g rm- Tôi đã phải cài đặt lại nodejs và trong shell root và gỡ cài đặt chúng, nếu không, bạn sẽ tiếp tục có các liên kết tượng trưng cho yo, grunt, v.v.
Bruno Flávio

4
Đây là giải pháp tốt nhất, tôi đã loại bỏ tất cả các mô-đun đầu tiên thực hiện sudo npm list -g --depth=0. | awk -F ' ' '{print $2}' | awk -F '@' '{print $1}' | sudo xargs npm remove -g stackoverflow.com/a/22290968/1449157 và sau đó gỡ bỏ npmvà cài đặt nó thông quanvm
Fabio Antunes

3
Để biết hướng dẫn gỡ cài đặt cho nút, hãy sử dụng câu trả lời SO stackoverflow.com/a/11178106/480031
seangates

3
Tại sao sử dụng root để cài đặt nút trên máy sản xuất?
Bruno Peres

401

Ngoài ra, bạn sẽ cần sự cho phép ghi trong node_modulesthư mục:

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

7
Cũng như ~/tmpthư mục cho tôi.
biết đến

123
Tôi không biết tại sao điều này vẫn được nâng cấp. Đó là một thực tế rất xấu để thay đổi quyền sở hữu các thư mục hệ thống thành một người dùng cụ thể! Vui lòng xem câu trả lời bên dưới để biết các giải pháp khác (như tạo một nhóm riêng cho người dùng nút).
Christopher Will

1
tôi không có node_modules/usr/local/lib/. wtf?
Connor Leech

27
Dù bạn làm gì - TUYỆT ĐỐI không chạy 'sudo chmod -R whoami' trên / usr / local / lib hoặc / usr / lib / bạn sẽ làm hỏng tệp sudoers của bạn và bạn sẽ ghét chính mình.
qodeninja 10/03/2015

7
mọi người, xin hãy tải xuống cái này ... Then I ran sudo chown -R $USER /* and everything was fine- KHÔNG - bạn đang làm hỏng máy của bạn.
phổ biến

75

Thay đổi chủ sở hữu trên các thư mục "toàn cầu hệ thống" là một hack. Khi cài đặt mới, tôi sẽ định cấu hình NPM để sử dụng vị trí có thể ghi cho các chương trình "toàn cầu người dùng":

npm config set prefix ~/npm

Sau đó, đảm bảo bạn thêm thư mục đó vào đường dẫn của mình:

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

Xem câu trả lời của @ErikAndreas cho các mô-đun NPM sẽ không cài đặt trên toàn cầu mà không có hướng dẫn từng bướcdài hơn bởi @sindresorhus với các bộ .$MANPATH


Tôi hoàn toàn đồng ý, ngoại trừ tôi đề nghị rằng nếu bạn chỉ đặt tiền tố thành $HOMEthì thông thường, .profiletập lệnh của bạn sẽ xử lý $PATHvào lần tiếp theo bạn lấy nó (ví dụ: lần sau bạn đăng nhập).
Jess Austin

@JessAustin: Có lẽ, nhưng nó cũng sẽ mang lại sự lộn xộn hơn cho bạn $HOMEvà có thể can thiệp vào các tệp / thư mục NPM (tương lai?) Khác. $PATHThay vào đó, muốn giữ các tệp nhị phân từ các trình quản lý gói / ngôn ngữ / hệ thống xây dựng khác nhau và đặt rõ ràng (trong tập lệnh thời gian đăng nhập).
Joel Purra

Ơ, bừa bộn? Chúng ta chỉ nói về các mô-đun được cài đặt toàn cầu ~/lib/node_modules, với CLI được liên kết của chúng, nếu có tồn tại, trong ~/bin. Đối với nhiều người dùng, đặc biệt là nếu họ không có root, cả hai ~/bin~/libđã tồn tại.
Jess Austin

@JessAustin: đó cũng là vấn đề va chạm tên cho thư viện và nhị phân. Giả sử bạn chỉ NPM để đặt nhị phân vào ~/binvà sau đó thực hiện tương tự cho một hoặc hai trình quản lý gói bổ sung. Nó có thể không xảy ra hôm nay hoặc ngày mai, nhưng có một rủi ro rõ ràng là hai gói từ các nhà quản lý khác nhau có xung đột tên và ghi đè lên các tệp của nhau. Đó là một trường hợp đủ tốt để tôi có các tiền tố riêng biệt. (Ví dụ cụ thể sẽ được đánh giá cao.)
Joel Purra

1
Điều này nên được chấp nhận là câu trả lời tốt nhất. Thay đổi thư mục toàn cầu có thể nguy hiểm.
Vladimir Marton

58

Tôi đã gặp phải điều này khi cài đặt Recess ( https://github.com/twitter/rESE ) để biên dịch CSS của tôi cho Bootstrap 3.

Khi cài đặt hốc:

-npm install recess -g
  1. Bạn cần mở khóa các quyền trong homethư mục của mình , như Noah nói:

    sudo chown -R `whoami` ~/.npm
  2. Bạn cũng cần quyền ghi vào node_modulesthư mục, như Xilo nói, vì vậy nếu nó vẫn không hoạt động, hãy thử:

    sudo chown -R `whoami` /usr/local/lib/node_modules
  3. Nếu bạn vẫn thấy lỗi, bạn cũng có thể cần phải sửa /usr/localquyền :

    sudo chown -R `whoami` /usr/local

Xin lưu ý rằng như được chỉ ra trong bài đăng /usr/local/ này không thực sự là một thư mục hệ thống nếu bạn đang sử dụng máy Mac, vì vậy, câu trả lời này thực sự hoàn toàn "an toàn" cho người dùng Mac. Tuy nhiên, nếu bạn đang dùng Linux, hãy xem câu trả lời của Christopher Will bên dưới để biết giải pháp an toàn cho người dùng, hệ thống an toàn (nhưng phức tạp hơn).


35
Đây là một ý tưởng tồi. Bạn có thể không muốn các thư mục hệ thống được sở hữu bởi một người dùng cụ thể. Bên cạnh những lo ngại bảo mật nghiêm trọng, điều này cũng không tương thích với nhiều người dùng.
Christopher Will

2
Có nhưng đó là một giải pháp tuyệt vời cho môi trường phát triển +2, đặc biệt là nếu bạn đã cài đặt node.js và chỉ cần tiếp tục rung chuyển!
elliotrock

Bạn thực sự không nên sở hữu các gói bên ngoài thư mục nhà của bạn
Ben

1
Nếu nó không có trong thư mục nhà của bạn, thì đó là một thư mục hệ thống, mặc dù có bất kỳ khiếu nại nào ngược lại. Chỉ vì nó không được OS X sử dụng không có nghĩa là nó không phải là một thư mục hệ thống.
người làm giàu giàu có

53

Coi chừng!!! Coi chừng!!! Coi chừng!!!

chown hoặc chmod KHÔNG phải là giải pháp, vì rủi ro bảo mật.

Thay vì làm điều này, hãy làm:

Kiểm tra đầu tiên, nơi npm trỏ đến, nếu bạn gọi:

npm config get prefix

Nếu / usr được trả về, bạn có thể làm như sau:

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

Điều này tạo ra một npm-Directory trong Home-Directory của bạn và trỏ npmđến nó.

Để có được những thay đổi này vĩnh viễn, bạn phải thêm lệnh export vào .bashrc:

echo -e "export NPM_CONFIG_PREFIX=~/.npm-global\nexport PATH=\$PATH:~/.npm-global/bin" >> ~/.bashrc

Tôi chỉ nên chuyển sang tùy chọn 2 nếu tôi có / usr?
Albert Laure

3
Lưu ý rằng lệnh cuối cùng thực sự xuất nội dung của $PATH, chứ không phải chính chuỗi. Bạn nên thay đổi điều đó.
Vel niệu 11/12/18

1
Cái này đã sửa rồi! Cảm ơn bạn. Tôi đã nhận được 'quyền bị từ chối, hủy liên kết' / usr / bin / <pkg> '
valbaca

1
Đây là câu trả lời tốt nhất. Đó là cách được đề xuất để giải quyết vấn đề.
Paulo Coghi - Tái lập Monica

Tại sao chowning một rủi ro bảo mật?
Frank

40

Các câu trả lời khác đang đề xuất thay đổi quyền sở hữu hoặc quyền của các thư mục hệ thống cho một người dùng cụ thể. Tôi rất không thích làm như vậy, điều này có thể trở nên rất khó xử và có thể làm rối tung toàn bộ hệ thống!

Đây là một cách tiếp cận chung hơn và an toàn hơn, cũng hỗ trợ nhiều người dùng.

Tạo một nhóm mới cho người dùng nút và thêm người dùng cần thiết vào nhóm này. Sau đó đặt quyền sở hữu các tệp / thư mục phụ thuộc nút vào nhóm này.

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

Bây giờ bạn có thể dễ dàng cài đặt các mô-đun của mình như người dùng

npm install -g generator-angular

Một số mô-đun (grunt, bower, yo, v.v.) vẫn sẽ cần được cài đặt làm root. Điều này là do họ tạo symlink trong / user / bin /.

Biên tập

3 năm sau tôi khuyên bạn nên sử dụng Trình quản lý phiên bản nút . Nó bảo vệ bạn rất nhiều thời gian và rắc rối.


2
Nếu nút được cài đặt bởi các nguồn, mặc dù nhiều người dùng sẽ gặp sự cố, tất cả các mô-đun sẽ hoạt động hoàn hảo mà không cần sử dụng sudo. Điều này cũng rất quan trọng vì trong trường hợp mô-đun yeoman, mọi người không thể cập nhật trình tạo thông qua việc sudo ứng dụng yeoman vì nó không cho phép thực thi sudo :(
HeberLZ

1
Trên Linux, tôi thường sử dụng staffnhóm tích hợp để cấp quyền cho các thư mục dev của mình. Ngoài ra, nên chạy chmod g+ws node_modulesđể đảm bảo rằng nhóm của bạn có quyền đọc / ghi.
jackvswworld 20/07/2015

@jackvsworld Tôi không biết về nhóm nhân viên. Tôi đoán đây sẽ là một giải pháp trơn tru hơn, vì người ta không phải tạo ra một nhóm hư cấu mới .. mặc dù nó sẽ ít rõ ràng hơn. Nhưng cảm ơn cho đầu vào này.
Christopher Will

Nói chung, /usr/libdưới sự kiểm soát của người quản lý gói hệ thống của bạn và bạn không nên thực hiện bất kỳ thay đổi nào ở đó.
người làm giàu giàu có

23

Các tài liệu chính thức về làm thế nào để sửa chữa npm installcho phép với một EACCESlỗi nằm ở https://docs.npmjs.com/getting-started/fixing-npm-permissions .

Tôi đã gặp vấn đề này sau khi cài đặt nút mới bằng trình .pkgcài đặt trên OSX. Có một số câu trả lời tuyệt vời ở đây, nhưng tôi chưa thấy một liên kết đến npmjs.com.

Tùy chọn 1: Thay đổi quyền vào thư mục mặc định của npm

  1. Tìm đường dẫn đến thư mục của npm:

    npm config get prefix

Đối với nhiều hệ thống, đây sẽ là / usr / local .

CẢNH BÁO : Nếu đường dẫn được hiển thị chỉ là / usr , hãy chuyển sang Tùy chọn 2 .

  1. Thay đổi chủ sở hữu các thư mục của npm thành tên của người dùng hiện tại (tên người dùng của bạn!):

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

    Điều này thay đổi quyền của các thư mục con được sử dụng bởi npm và một số công cụ khác ( lib / node_modules , binshare ).

Tùy chọn 2: Thay đổi thư mục mặc định của npm sang thư mục khác

Đôi khi bạn không muốn thay đổi quyền sở hữu thư mục mặc định mà npm sử dụng (ví dụ / usr ) vì điều này có thể gây ra một số vấn đề, ví dụ nếu bạn đang chia sẻ hệ thống với người dùng khác.

Thay vào đó, bạn có thể cấu hình npm để sử dụng hoàn toàn một thư mục khác. Trong trường hợp của chúng tôi, đây sẽ là một thư mục ẩn trong thư mục nhà của chúng tôi.

  1. Tạo một thư mục để cài đặt toàn cầu:

    mkdir ~/.npm-global
  2. Cấu hình npm để sử dụng đường dẫn thư mục mới:

    npm config set prefix '~/.npm-global'
  3. Mở hoặc tạo tệp ~ / .profile và thêm dòng này:

    export PATH=~/.npm-global/bin:$PATH
  4. Quay lại dòng lệnh, cập nhật các biến hệ thống của bạn:

    source ~/.profile

1
Cảm ơn, điều này đã làm việc cho tôi vì sự cố gắng không được. Bạn đã cứu tôi.
fmquaglia

Tôi chỉ nên chuyển sang tùy chọn 2 nếu tôi có / usr?
Albert Laure

Tôi thích tùy chọn này của câu trả lời 2. (1) Nó không có lỗ hổng bảo mật khi sử dụng sudo, (2) nó bảo tồn kiến ​​trúc cho những người dùng khác, (3) nó tham chiếu tài liệu, VÀ (4) nó có dòng lệnh cần thiết bao gồm các mục. Cảm ơn bạn đã thêm!
Tom Rose

Vì vậy, điều gì xảy ra khi bạn cài đặt một cái gì đó được liên kết với nhau /usr/bin/? Bây giờ chỉ có người dùng của bạn có thể truy cập nó. Bạn đăng nhập với tư cách người khác, vẫn không có quyền truy cập, vì các tệp thực sự nằm trong thư mục chính của người dùng khác!
Frans

Đẹp, cái này làm việc cho tôi. Cảm ơn đã giải thích ngoài các lệnh.
FrankByte.com

12

Như thể chúng ta cần nhiều câu trả lời hơn ở đây, nhưng dù sao thì ..

Sindre Sorus có một hướng dẫn Cài đặt các gói npm trên toàn cầu mà không cần sudo trên OS X và Linux phác thảo cách cài đặt sạch mà không làm rối các quyền:

Đây là một cách để cài đặt các gói trên toàn cầu cho một người dùng nhất định.

  1. Tạo một thư mục cho các gói toàn cầu của bạn

    mkdir "${HOME}/.npm-packages"
  2. Tham khảo thư mục này để sử dụng trong tương lai trong .bashrc / .zshrc:

    NPM_PACKAGES="${HOME}/.npm-packages"
  3. Chỉ ra npm nơi lưu trữ gói cài đặt toàn cầu của bạn. Trong $HOME/.npmrctệp của bạn thêm:

    prefix=${HOME}/.npm-packages
  4. Đảm bảo nút sẽ tìm thấy chúng. Thêm phần sau vào .bashrc / .zshrc:

    NODE_PATH="$NPM_PACKAGES/lib/node_modules:$NODE_PATH"
  5. Đảm bảo bạn sẽ tìm thấy các tệp nhị phân và trang man được cài đặt. Thêm phần sau vào .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)"

Kiểm tra npm-g_nosudo để thực hiện các bước trên một cách tự động

Kiểm tra nguồn của hướng dẫn này để cập nhật mới nhất.


2
tx cho chỉnh sửa @AndyHayden :) Phương pháp ưa thích của tôi được đề xuất trong các nhận xét ở trên: sử dụng NVM! stackoverflow.com/a/24404451/1480391
ptim

Giải pháp duy nhất hiệu quả với tôi mà không liên quan đến việc mucking về quyền. Tôi ghét NPM và sự ngu ngốc của nó. Cảm ơn giải pháp!
RyanNerd

8

TL; DR

luôn luôn sử dụng sudo -ihoặc sudo -Hkhi chạy npm installđể cài đặt các gói toàn cầu.

-

Khi bạn sử dụng npmnó tải các gói vào thư mục nhà người dùng của bạn. Khi bạn chạy như sudo, npmcài đặt các tệp vào cùng một thư mục, nhưng bây giờ chúng được sở hữu bởi root.

Vì vậy, đây là những gì xảy ra với tất cả mọi người đã từng sử dụng npm:

  • cài đặt một số gói cục bộ mà không gặp sự cố khi sử dụng npm install foo
  • cài đặt gói toàn cầu sử dụng sudo install -g foo-climà không có vấn đề
  • cố gắng cài đặt gói cục bộ với npm install bar
  • nản lòng với các npmnhà thiết kế bây giờ bạn phải đi chmodmột thư mục một lần nữa

Khi bạn sử dụng tùy chọn -ihoặc -Hvới sudo, thư mục chính của bạn sẽ là rootthư mục chính của bạn. Bất kỳ cài đặt toàn cầu nào cũng sẽ lưu các gói vào bộ đệm /root/.npmthay vì roottập tin tại /home/me/.npm.

Chỉ cần luôn luôn sử dụng sudo -ihoặc sudo -Hkhi chạy npm installđể cài đặt các gói toàn cầu và các npmvấn đề về quyền của bạn sẽ tan biến.

Cho tốt.

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

- qv câu trả lời được chấp nhận để sửa chữa một fucked npm.


cách khắc phục tốt nhất và đơn giản
Manjeet Singh

6

Tôi gặp vấn đề tương tự ở các mô-đun NPM sẽ không cài đặt trên toàn cầu mà không có sudo , vấn đề là khi tôi cài đặt nút, tôi đã làm điều đó với sudo thông qua chris / lea ppa repo .

Giải pháp của tôi là gỡ cài đặt nút và sau đó cài đặt nó theo cách này:

Tải xuống các nguồn nút ổn định mới nhất từ ​​nodejs.org #in trường hợp của tôi nút-v0.10.20.tar.gz

tar -zxf nút-v0.10.20.tar.gz #uncompress nguồn

cd node-v0.10.20 #enter thư mục không nén

sudo chown $ USER -R / usr / local

./mình --prefix = / usr / local && make && thực hiện cài đặt

PD: Nếu bạn không muốn thay đổi quyền sở hữu thư mục / usr / local, bạn có thể cài đặt nó ở nơi nào đó bạn đã sở hữu. Vấn đề của phương pháp này là bạn sẽ phải liên kết thư mục cài đặt với dòng lệnh bash để chúng ta có thể sử dụng lệnh nút sau này

mkdir ~ / opt

./mình --prefix = ~ / opt && make && thực hiện cài đặt

echo 'export PATH = ~ / opt / bin: $ {PATH}' >> ~ / .bashrc #or ~ / .profile hoặc ~ / .bash_profile hoặc ~ / .zshenv tùy thuộc vào Hệ điều hành hiện tại

Với một trong những cách tiếp cận đó, bạn sẽ có thể thực hiện những điều sau mà không cần sử dụng sudo

cài đặt npm -g module_to_install


1
Tôi đã kết thúc bằng cách sử dụng phương pháp này. Đã sử dụng sudo chown $USER /use/localtrước khi xây dựng. Có vẻ tốt cho đến nay, thời gian để cố gắng xây dựng nguyên tử! Cảm ơn!
prasanthv

6

Khi bạn chạy npm install -g somepackage, bạn có thể gặp lỗi EACCES yêu cầu bạn chạy lại lệnh với tư cách là root / Administrator. Đó là một vấn đề quyền.

Thật dễ dàng để sửa chữa , mở thiết bị đầu cuối của bạn (Ứng dụng> Tiện ích> Thiết bị đầu cuối)

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

** Tôi thực sự khuyên bạn không nên sử dụng quản lý gói với sudo (sudo npm -g cài đặt một cái gì đó), vì bạn có thể gặp một số vấn đề sau **

Tham khảo: http://foohack.com/2010/08/intro-to-npm/


Yay! Điều này đã làm điều đó với tôi! sau khi làm những người khác khác trên: sudo chown -R `whoami` ~/.npm, sudo chown -R `whoami` /usr/local/lib
Regis Zaleman

8
Điều này có thể gây ra sự cố về quyền với nhiều ứng dụng khác, vì vậy tôi khuyên bạn không nên làm điều này. Tại sao đổi một lon giun cho người khác?
Brad

1
Hoặc ít nhất là tinh chỉnh nó thành / usr / local / lib / node_modules.
Ken

Cái này, cái này và hơn thế nữa. Sau khi đập đầu tôi vào tường, điều này đã tạo nên mánh khóe. 1
dashard

Đây là vấn đề của tôi. Trên macbook mới (os x 10.10.3), quyền trên / usr / local / lib / node_modules là: $ ll / usr / local / lib / node_modules tổng cộng 0 drwxr-xr-x 3 24561 wheel 102B Mar 31 18:19 . drwxrwxr-x 4 24.561 quản trị 136B ngày 31 tháng 3 18:19 .. drwxr-xr-x 26 65534 nhân viên 884B ngày 13 tháng 4 10:53 NPM
tkane2000

5

Dành cho Mac (được thông qua từ câu trả lời của Christoper Will)

Mac OS X 10.9.4

  1. Tùy chọn hệ thống> Người dùng & Nhóm> (mở khóa)> nhấn +:

    Tài khoản mới> "Nhóm"
    Tên tài khoản: gật đầu

    Sau khi tạo nhóm, đánh dấu người dùng được bao gồm trong nhóm này

  2. sudo chgrp -R nodegrp / usr / local / lib / node_modules /
    sudo chgrp nodegrp / usr / bin / nút
    sudo chgrp nodegrp / usr / bin / NPM
    sudo chown -R $ (whoami): nodegrp ~ / .npm


1
Tôi đã phải thay đổi một vài đường dẫn thành / usr / local / bin nhưng ngoài ra, giải pháp này hoạt động rất tốt trên máy OX X 10.9 của tôi - cảm ơn!
splig

Thực tiễn xấu để thay đổi quyền sở hữu các thư mục hệ thống.
người làm giàu giàu 17/12/18

@richremer Tôi nghĩ nó phụ thuộc vào những gì bạn đang cố gắng đạt được. nếu thư mục ban đầu chỉ có thể được truy cập bởi sudoer thì nó chỉ có thể được thay đổi theo cách này. chúng tôi giới hạn sự thay đổi trong thư mục liên quan đến npm. Sẽ an toàn hơn nếu tiếp tục làm sudohoặc thay đổi quyền sở hữu nhóm thư mục đó để người dùng bình thường có thể sửa đổi nó? Nếu người dùng bình thường không được phép thực hiện bất kỳ hành động nào trên thư mục này thì tất nhiên không nên thay đổi quyền sở hữu nhóm của thư mục.
ken

Điều thích hợp để làm là cài đặt các gói toàn cầu với sudo, nhưng làm điều đó với -Hcờ. Cụ thể sudo -H npm install -g <pkg>,. Điều này đảm bảo phân định đúng các quyền cho các thư mục hệ thống và người dùng. Những gì bạn không muốn làm là sử dụng sudo npm install -g, bởi vì điều này cài đặt các tệp thuộc sở hữu gốc vào thư mục người dùng của bạn. Sẽ thật tuyệt nếu npm đủ thông minh để làm điều này đúng cách, nhưng không phải vậy, vì vậy bạn phải sử dụng -Hcờ sudo để cài đặt đúng cách trên toàn cầu.
người làm giàu giàu có

4

Trong trường hợp của tôi, đó là vì sự cho phép của ~ / tmp. Vì vậy, tôi làm:

sudo chown -R $USER ~/tmp

Và nó ổn thôi!


4

Đối với tôi, chỉ thực hiện

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

không hoạt động. Sau đó, tôi cũng thi hành

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

Và tất cả đều hoạt động tốt!


Bạn rất tuyệt vời thưa ông :)
user805981 11/03/2015

Các tệp trong /usr/liblà các tệp hệ thống và không được sở hữu bởi tài khoản người dùng cá nhân của bạn.
người làm giàu giàu có

4

VẤN ĐỀ : Bạn (người dùng) không có bộ quyền cho thư mục.

Cách nhanh chóng là chạy cài đặt npm bằng sudo, nhưng điều này có thể gây ra lỗi tương tự hoặc cài đặt không đúng.

VÀ thay đổi quyền sở hữu thư mục không phải là một lựa chọn tốt, một bản vá tạm thời.


Giải pháp / Gợi ý : Thay đổi Thư mục mặc định của npm (từ tài liệu chính thức )

Sao lưu máy tính của bạn trước khi di chuyển về phía trước.

(tùy chọn) Trong trường hợp bạn có cài đặt bị lỗi, trước tiên hãy gỡ cài đặt nó:

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. Tạo một thư mục để cài đặt toàn cầu:

    mkdir ~/.npm-global

  2. Cấu hình npm để sử dụng đường dẫn thư mục mới:

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

  3. Mở hoặc tạo một tập tin ~/.profilehoặc ~/.bash_profilethêm dòng này:

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

  4. Quay lại dòng lệnh, cập nhật các biến hệ thống của bạn hoặc khởi động lại thiết bị đầu cuối:

    source ~/.profile

  5. (tùy chọn) Kiểm tra: Tải xuống gói trên toàn cầu mà không cần sử dụng sudo.

    npm install -g jshint


3

Trong trường hợp sudo chown -R $(whoami) ~/.npmkhông làm việc cho bạn, hoặc bạn cần một giải pháp lệnh không đầu cuối.

Vấn đề là tài khoản người dùng của bạn không có quyền ghi vào thư mục node_modules, vì vậy bạn có thể làm như sau

  1. Mở công cụ tìm và nhấn cmd+ shift+ gcái này sẽ mở vào thư mục có url

  2. Viết đường dẫn sau /usr/local/lib/node_modulesvà nhấn go

  3. Nhấp chuột phải vào node_modulesthư mục và chọnGet Info

  4. Cuộn xuống sharing & permissionsphần

  5. Mở khóa để có thể thay đổi.

  6. Nhấn +và thêm tài khoản người dùng của bạn

  7. Hãy chắc chắn rằng bạn chọn Read & Writetrong đặc quyền thả xuống

Bây giờ bạn sẽ có thể cài đặt các gói mà không sudocần giải quyết vấn đề cấp phép


3

Vấn đề: Bạn không có quyền ghi vào các thư mục mà npm sử dụng để lưu trữ các gói và lệnh toàn cầu.

Giải pháp: Cho phép cho npm.

Mở một thiết bị đầu cuối:

lệnh + phím cách sau đó nhập 'terminal'

Nhập lệnh này:

sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share}
  • Lưu ý: điều này sẽ yêu cầu mật khẩu của bạn.

Giải pháp này cho phép CHỈ các thư mục cần thiết, giữ cho các thư mục khác đẹp và an toàn.


Tải xuống vì thiết lập quyền sở hữu của người dùng đối với các thư mục hệ thống là một kiểu chống và điều này không tính đến điều đó. Trong trường hợp đặc biệt npm config get prefixtrả về một cái gì đó trong thư mục nhà, giải pháp này sẽ khắc phục các quyền, nhưng không giải quyết được vấn đề cơ bản của việc cài đặt các gói toàn cầu theo cách an toàn cho môi trường dùng chung.
người làm giàu giàu có

Điều này sẽ viết lại các quyền của một phần rất lớn của hệ điều hành. Chạy cái này trong Ubuntu chẳng hạn sẽ dẫn đến lệnh "sudo" trở nên không sử dụng được.
Sahand Seifi

2

Một cách khắc phục tuyệt vời khác ở đây để định cấu hình NPM đúng cách, chạy các lệnh sau:

npm config set prefix '~/.npm_packages'
PATH=$PATH:$HOME/.npm_packages/bin; export PATH

2

bạn có thể thử cái này, hoạt động trên Ubuntu và mac

sudo chown -R $(whoami) /usr/local/lib/node_modules

1
Tôi đã chạy nó và làm việc 100% cho tôi trên mac: sudo chown -R $ (whoami) / usr / local / lib / node_modules
leeroya

1

Đối với tôi có vẻ như tùy chọn tốt nhất là tùy chọn được đề xuất trong tài liệu npm , trước tiên là kiểm tra xem nút_modules toàn cầu được cài đặt theo mặc định bằng cách chạy npm config get prefix. Nếu bạn nhận được, giống như tôi làm trên Trusty, /usrbạn có thể muốn thay đổi nó thành một thư mục mà bạn có thể sở hữu một cách an toàn mà không làm hỏng mọi thứ theo cách tôi đã làm.

Để làm điều đó, chọn hoặc tạo một thư mục mới trong hệ thống của bạn. Bạn có thể muốn có nó trong thư mục nhà của bạn hoặc, giống như tôi, /usr/localvì tính nhất quán vì tôi cũng là người dùng Mac (tôi không cần phải nhìn vào những nơi khác nhau tùy thuộc vào máy tôi đang ở trước mặt). Một lý do chính đáng khác để làm điều đó là thực tế là /usr/localthư mục có thể đã có trong PATH của bạn (trừ khi bạn muốn làm phiền với PATH của mình) nhưng rất có thể thư mục mới được tạo của bạn không và bạn cần thêm nó vào Tự chăm sóc bản thân trên tệp .bash-profile hoặc .bashrc .

Tóm lại, tôi đã thay đổi vị trí mặc định của các mô-đun toàn cầu bằng npm config set prefix '/usr/local', tạo thư mục /usr/local/lib/node_modules(nó sẽ được sử dụng bởi npm) và thay đổi quyền cho các thư mục được sử dụng bởi npm bằng lệnh:

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

Bây giờ bạn có thể cài đặt toàn bộ mô-đun một cách an toàn. Hi vọng điêu nay co ich!


1

Đây là cách tôi giải quyết vấn đề trên Windows 8.1:

  • Chuyển đến cài đặt nodejs của bạn (thường là C: \ Program Files \ nodejs)
  • Nhấp chuột phải vào thư mục node_modules và đi đến thuộc tính
  • Nhấp vào tab Bảo mật và nâng cao
  • Ở đầu bạn sẽ thấy "Chủ sở hữu: HỆ THỐNG", nhấp vào thay đổi
  • Nhập người dùng bạn muốn quyền và nhấp vào Ok
  • Chọn hộp ở dưới cùng của cài đặt nâng cao "Thay thế tất cả các mục nhập quyền đối tượng con bằng các mục nhập quyền kế thừa từ đối tượng này" và nhấp vào ok
  • Làm bất cứ điều gì npm cài đặt / cập nhật bạn cần

1

Giải pháp tốt nhất sẽ là điều này được cung cấp bởi tài liệu npm.


Đối với giải pháp đề xuất cho Ubuntu là Tùy chọn # 2

Các bước ngắn gọn:
Tạo một thư mục để cài đặt toàn cầu:
mkdir ~/.npm-global

Định cấu hình npm để sử dụng đường dẫn thư mục mới: có thể giúp bạn xác minh xem tiền tố có được cập nhật hay không. Kết quả sẽ là <Thư mục chính của bạn> /. Npm-global
npm config set prefix '~/.npm-global'
npm config get prefix

Mở hoặc tạo tệp ~ / .profile và thêm dòng này:
export PATH=~/.npm-global/bin:$PATH

Quay lại dòng lệnh, cập nhật các biến hệ thống của bạn:
source ~/.profile

Thay vì các bước 2-4, bạn cũng có thể sử dụng biến ENV tương ứng (ví dụ: nếu bạn không muốn sửa đổi ~ / .profile):

NPM_CONFIG_PREFIX=~/.npm-global


Đối với Mac, giải pháp được đề xuất là Tùy chọn # 3

Trên Mac OS, bạn có thể tránh vấn đề này hoàn toàn bằng cách sử dụng trình quản lý gói Homebrew

brew install node


NPM_CONFIG_PREFIX này sẽ không hoạt động. Đây là một lỗi trong npm-descriptiton. Xem bài đăng của tôi ở trên, làm thế nào để làm điều đó đúng cách: stackoverflow.com/a/41395398/1256697
suther

1

Tôi giải quyết nó bằng cách thay đổi chủ sở hữu từ root sang tên người dùng của tôi

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

thay đổi tôi với tên người dùng và nhóm của bạn.


1

Tôi thích sử dụng các nhóm ubfox để đạt được điều này thay vì thay đổi chủ sở hữu. Nó khá đơn giản.

  1. Đầu tiên cài đặt nodejs và npm bằng apt-get

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

  2. Chỉ ra ai đã đăng nhập tức là tên người dùng, chạy lệnh sau để xem nó trong terminal

    whoami

  3. Bạn có thể xem danh sách các nhóm bạn được chỉ định bằng cách sử dụng một lệnh rất đơn giản, thông thường nhóm đầu tiên là tên người dùng của bạn

    groups

  4. Chạy theo sau để cho phép truy cập vào người dùng đã đăng nhập

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

  5. Cập nhật npm và nodejs

    npm install -g npm

Bạn đang lo lắng, người dùng của bạn có thể chạy các lệnh npm mà không cần sudo

Bạn cũng có thể tham khảo liên kết này https://askubfox.com/a/1115373/687804


0

Trên Mac OS X, khi cài đặt với Homebrew brew install npm , đường dẫn cài đặt /usr/local/share/npm/có cả hai bin/và các lib/node_modules/thư mục con.

Chạy lệnh này để thay đổi thành chủ sở hữu thành người dùng hiện đang đăng nhập của bạn sẽ khắc phục tất cả và cho phép bạn cài đặt các gói NPM toàn cầu mà không cần sudo.

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


1
Ngày nay sẽ đề nghị câu trả lời khác của tôi cho câu hỏi này sử dụng npm configthay thế.
Joel Purra

0

Thật ra, tôi cũng gặp vấn đề tương tự. Tôi đang chạy Ubuntu. Vấn đề của tôi phát sinh vì tôi đã mất khóa công khai của Ubuntu. Ngay cả việc cập nhật hệ thống của tôi cũng không xảy ra. Đó là lỗi GPG. Trong trường hợp đó, bạn có thể lấy lại khóa của mình bằng cách sử dụng lệnh này:

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

Sau đó npm hoạt động tốt!


0

John Papa chỉ ra lịch sử và lý do đằng sau vấn đề này và đưa ra cách khắc phục :

Các bước của John Papa là:

  1. Sử dụng brew để cài đặt nút mà không cần npm
  2. Cập nhật .bash_profile / .bashrc của bạn để cho npm và nút biết nơi cài đặt và tìm gói
  3. Sử dụng brew để cập nhật nút và npm để tự cập nhật

Hy vọng điều này sẽ giúp những người tò mò!


0

Đây là giải pháp tôi sử dụng và làm việc. Tôi đã cố gắng sử dụng whoamikhông bao giờ làm việc.

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

sau đó

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

sau đó

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


0

Câu trả lời của @ M. rất giống với giải pháp của tôi. Dưới đây là các lệnh tôi đã sử dụng, hơi khác so với của anh ta.

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

Sau đó truy vấn cho phiên bản mới nhất:

nvm ls-remote

Sau đó cài đặt phiên bản mới nhất:

nvm install YOUR_VERSION_HERE

thí dụ

nvm install v5.8.0
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.