Các mô-đun NPM sẽ không cài đặt trên toàn cầu mà không có sudo


126

Tôi vừa cài đặt lại Ubuntu 12.04 LTS và trước khi có bất kỳ điều gì khác, tôi đã thực hiện các bước sau :

  1. Node được cài đặt thông qua trình quản lý gói với tập lệnh sau

    sudo apt-get update
    
    sudo apt-get install python-software-properties python g++ make
    
    sudo add-apt-repository ppa:chris-lea/node.js
    
    sudo apt-get update
    
    sudo apt-get install nodejs
  2. Đã thử cài đặt máy phát điện của yeoman, express, n, yeoman trên toàn cầu và tất cả chúng đều trả về cùng một lỗi

    npm ERR! Lỗi: EACCES, symlink '../lib/node_modules/n/bin/n'

    npm ERR! {[Lỗi: EACCES, symlink '../lib/node_modules/n/bin/n'] errno: 3, mã: 'EACCES', đường dẫn: '../lib/node_modules/n/bin/n'}

    npm ERR!

    npm ERR! Vui lòng thử chạy lại lệnh này với tư cách là root / Administrator.

    npm ERR! Hệ thống Linux 3.8.0-29-chung

    npm ERR! lệnh "/ usr / bin / nút" "/ usr / bin / npm" "cài đặt" "-g" "-d" "n"

    npm ERR! cwd / nhà / heberlz

    npm ERR! nút -v v0.10.20

    npm ERR! npm -v 1.3.11

    npm ERR! đường dẫn ../lib/node_modules/n/bin/n

    npm ERR! mã EACCES

    npm ERR! sai 3

    npm ERR! Lỗi ngăn xếp: EACCES, symlink '../lib/node_modules/n/bin/n'

    npm ERR!

    npm ERR! Chi tiết đăng nhập bổ sung có thể được tìm thấy trong:

    npm ERR! /home/heberlz/npm-debug.log

    npm ERR! không ổn mã 0

  3. Quyền sở hữu được thu hồi của các thư mục sau theo cách đệ quy ~ / .npm, / usr / lib / node, / usr / lib / node_modules và của các liên kết sau / usr / bin / nút, / usr / bin / nodejs hoàn toàn không thành công

Tôi cần cài đặt yeoman và các trình tạo của nó mà không gặp rắc rối về sau :(


Cảm ơn Phil, bây giờ nó có vẻ tốt hơn nhiều
HeberLZ

2
Nếu bạn muốn npm cài đặt các gói toàn cầu trong $ HOME thay vì / usr, hãy làm theo hướng dẫn github.com/sindresorhus/guides/blob/master/ phỏng
Đại tá Panic

đây là những gì làm việc cho tôi github.com/nodejs/node-v0.x-archive/issues/... :ln -s /usr/bin/nodejs /usr/bin/node
Loïc Michel

Bản sao có thể của lỗi npm ném mà không có sudo
Louis

Câu trả lời:


318

Ubuntu 12.04 và sử dụng PPA của Chris Lea để cài đặt các công việc sau đây cho tôi:

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

và thêm $ HOME / .npm-gói / bin vào $ PATH

nối vào .bashrc

export PATH="$PATH:$HOME/.npm-packages/bin"

xem https://stackoverflow.com/a/18277225 từ @passy


9
Đây trông giống như một giải pháp sạch hơn nhiều. Nếu bạn không thích các thư mục hệ thống trong thư mục chính của mình, bạn cũng có thể sử dụng một vị trí như ~ / .local / share / npm.
JeroenHoek

Cần lưu ý rằng sau khi bạn thay đổi tiền tố, bạn nên cài đặt lại tất cả các mô-đun toàn cầu mà bạn đã cài đặt trước đó, bao gồm cả npm.
Dziamid

Điều này có vẻ tốt, nhưng tôi thấy việc cho phép người dùng viết thư dễ dàng hơn nhiều /usr/lib/node_modules/. Hoặc thậm chí có thể thích hợp để tạo một nhóm unix nodejs và cho phép nhóm đó ghi vào thư mục đó.
mehulkar

Một chi tiết nhỏ cần thêm là bạn phải tự tạo thư mục ~ / npm. Khác, npm sẽ thoát với một lỗi ENOENT.
Jason Farnsworth

6
Tại sao điều này không phải là mặc định cho npm? Cám ơn vì đã chia sẻ.
Dorian

23

Nếu bạn đã có $HOME/bintrong đường dẫn của mình, một giải pháp đơn giản hơn chỉ là ...

npm config set prefix ~
  • Các lệnh nút mới bây giờ sẽ cài đặt vào $HOME/binthư mục của bạn .
  • Không cần phải thay đổi con đường của bạn!

Vì cuộc thảo luận này thực sự là về việc giảm rủi ro bảo mật khi chạy sudo, bạn cũng nên lưu ý rằng bất kỳ ứng dụng nút nào cũng có khả năng cài đặt tên ứng dụng không khớp với tên gói nút đã đăng ký mà bạn nghĩ là bạn đang cài đặt. Vì vậy, có một rủi ro bảo mật rằng npm installsẽ thay thế một lệnh hệ thống hiện có hoặc một lệnh bạn đã có $HOME/bin. Nếu bạn quan tâm, hãy kiểm tra binscriptscác thuộc tính trong package.jsontệp của ứng dụng bạn đang cài đặt trước.

Nói chung, an toàn nhất là:

  • (a) Đặt $HOME/bincuối cùng trong đường dẫn của bạn để các lệnh hệ thống không được thay thế.
  • (b) không bao gồm "." hoặc bất kỳ đường dẫn tương đối nào trong bạn $PATHđể bạn không vô tình chạy một lệnh xảy ra trong thư mục hiện tại.

Tài liệu tham khảo:


1
Một vấn đề bảo mật quan trọng khác npmlà mã nguồn bạn thấy trên github.comrepo cho gói nút có thể không giống với mã bạn đang cài đặt từ npm.orgmáy chủ đăng ký!
Tony O'Hagan

Mặc dù về lý thuyết, gói nút được chế tạo tốt sẽ vui vẻ cài đặt ~/bin, một số gói nút (hoặc gói phụ thuộc của chúng) chỉ được kiểm tra là cài đặt sudovì vậy hãy lưu ý rằng bạn có thể gặp phải sự cố "môi trường cài đặt" chưa được kiểm tra. Giống như bất kỳ vấn đề môi trường nào khác (như thay đổi hệ điều hành), nguyên tắc "viết một lần, kiểm tra mọi nơi" vẫn đúng.
Tony O'Hagan

Nhược điểm của phương pháp này là npm tạo ra một thư mục bổ sung, được gọi là ~ / lib. Tùy thuộc vào thực tiễn tổ chức của bạn, điều này có thể không được mong muốn.
Ông S

13

Vào tháng 10 năm 2014:

Node.js có sẵn từ kho lưu trữ phân phối nhị phân NodeSource Debian và Ubuntu .

curl -sL https://deb.nodesource.com/setup | sudo bash -
sudo apt-get install -y nodejs

Đó là nó.

Câu trả lời lỗi thời:

Cách nhanh nhất mà không sử dụng sudo giống như được mô tả ở đây bởi isaac

Tôi khuyến khích bạn không làm quản lý gói với sudo! Các gói có thể chạy các tập lệnh tùy ý, làm cho việc sudoing một lệnh của trình quản lý gói an toàn như cắt tóc. Chắc chắn, nó nhanh và chắc chắn sẽ vượt qua mọi chướng ngại vật, nhưng bạn thực sự có thể muốn chướng ngại vật đó ở lại đó.

Tôi khuyên bạn nên làm điều này một lần thay thế:

sudo chown -R $USER /usr/local

BIÊN TẬP:

Có một số lo ngại về bảo mật và giới hạn chức năng liên quan đến việc thay đổi quyền sở hữu / usr / local đối với người dùng hiện tại:

Phải nói rằng, nếu bạn muốn cài đặt mô-đun toàn cầu mà không sử dụng sudo, tôi không thấy bất kỳ giải pháp nào tốt hơn (từ quan điểm thực dụng) so với đề cập. Bảo mật và dễ sử dụng là chủ đề rất rộng, và không có câu trả lời dễ dàng cho điều đó - nó chỉ phụ thuộc vào yêu cầu của bạn.


23
Đây là một ý tưởng tồi vì nó làm cho tất cả / usr / local thuộc về một người dùng.
Sậy G. Luật

4
Như @ ReedG.Law đã chỉ ra, đây thực sự là một ý tưởng tồi. Không thay đổi quyền sở hữu hte của / usr / local cho bất kỳ người dùng cụ thể nào.
Christopher Will

3
Tôi phải đồng ý với Luật G của G - thay đổi / usr / local là ý tưởng BAD BAD BAD. Trong trường hợp của tôi, tôi đã xem xét các hướng dẫn và đã làm như vậy: sau đó nhớ lại rằng tôi phải CHIA SẺ điều này với một người khác đang phát triển. Tôi đã quay lại và (hy vọng) có tất cả các thay đổi. Đó không chỉ là bảo mật, mà còn là chức năng.
Lloyd Sargent

3
Có bất kỳ nhược điểm nào đối với giải pháp này nếu chỉ có một người dùng trên hệ thống không?
trỏ

2
Xin lỗi, có nghĩa là /usr/local/lib/node_modulesnode
Creynders

11

Vấn đề là tôi đã cài đặt nút bằng sudo , để tránh lỗi khi cài đặt các mô-đun npm trên toàn cầu, một PHẢI KHÔNG BAO GIỜ cài đặt nút với sudo.

Giải pháp của tôi là cài đặt lại nút 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 -R $ USER / usr / địa phương

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

Một điều cần lưu ý là chỉ có quyền sở hữu thư mục / usr / local sẽ không hoạt động trong trường hợp của tôi vì cài đặt nút được thực hiện với sudo

Bước cuối cùng để cài đặt yeoman:

npm cài đặt -g bower

npm cài đặt -g grunt

cài đặt npm -g yo

npm cài đặt -g máy phát điện góc


Tuyệt vời về mặt lý thuyết, nhưng có cách nào để đạt được hiệu quả tương tự mà không bị buộc phải xây dựng Node và cài đặt 4 mô-đun bổ sung chỉ để có quyền truy cập vào các mô-đun trên toàn cầu?
Dan Nissenbaum

Câu trả lời được chọn hoạt động như bạn cần. Đây là những gì tôi đã làm cách đây 2 năm khi chưa có giải pháp công khai nào khác, nhưng bây giờ nó vô dụng
HeberLZ

5

Tôi đã giải quyết vấn đề này với biến môi trường và bí danh shell:

export NPM_PREFIX=$HOME/node
alias npmg="npm -g --prefix $NPM_PREFIX"

Đối với tôi, npm không tôn trọng cài đặt cấu hình "tiền tố" trong .npmrc.


2

Theo bài SO tương tự này: npm ném lỗi mà không có sudo

Có vẻ như bạn có thể có một vấn đề sở hữu với ~/.npmthư mục.

Như với câu trả lời trong đó, hãy thử:

sudo chown -R `whoami` ~/.npm

Trên thực tế, điều này không hoạt động như tôi đã giải thích ở bước 3 về những gì tôi đã cố gắng khi tôi không thể làm cho nó hoạt động, vấn đề là tôi đã cài đặt nút bằng sudo, trong một số trường hợp có thể gây rắc rối. Khi tôi đã xóa nút và cài đặt lại từ nguồn của nó, mọi thứ bắt đầu hoạt động như mong đợi!
HeberLZ

@HeberLZ Tôi nghĩ bạn đúng, tôi vừa thử làm điều này trên một máy khác tối hôm qua và nó không hoạt động. Tôi đã có vấn đề cho phép khác để giải quyết quá. Vẫn không chắc chắn cách tốt nhất để không chạy vào cài đặt npm này từ nguồn.
prasanthv

Liên kết đến câu hỏi trong các bình luận hoặc đánh dấu câu hỏi hiện tại là trùng lặp. Nó không giúp sao chép-dán câu trả lời từ các câu hỏi khác.
givanse

@HeberLZ downvote của anwer này là vô căn cứ vì nó giải quyết tiêu đề của câu hỏi bạn đã thực hiện.
Sebastian Sastre

Tôi không nhớ khi tôi đánh giá thấp câu trả lời, nhưng trong trường hợp cụ thể của tôi, những gì bạn viết không khắc phục được vấn đề, lý do tại sao tôi nghĩ rằng tôi có thể đánh giá thấp câu trả lời. Như đã nêu trong câu hỏi: "Quyền sở hữu được thu hồi của các thư mục sau theo cách đệ quy ~ / .npm, / usr / lib / node, / usr / lib / node_modules và của các liên kết sau / usr / bin / nút, / usr / bin / nodejs hoàn toàn không thành công "Tôi đã cố gắng giành quyền sở hữu .npm và tất cả các thư mục khác mà không thành công
HeberLZ

2

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.

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, bin và share).

Đây là đường dẫn để biết chi tiết đầy đủ

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


Quan trọng. Cố gắng tránh thêm binsharevào ngoặc. Bỏ qua có thể dẫn đến thay đổi quyền sở hữu các thư mục này cho người dùng hiện tại và các vấn đề với việc cài đặt các gói mới vào hệ thống sudovì quyền sở hữu của nó cũng sẽ bị thay đổi
A.Ametov

phần thưởng này sẽ phá hủy tất cả hệ thống tệp của tôi: (
UA_


1

Trên thực tế, tôi vừa thay đổi quyền của thư mục người dùng được sở hữu bởi root:

sudo chown -R $USER ~/.config/configstore

Sau đó tôi có thể "npm install" và "bower install" mà không cần sudo! Làm việc tốt


0

bằng cách sử dụng Ubuntu Ubuntu 14.04.3, tôi đã thử thay đổi quyền sở hữu tiền tố .npm và npm, cập nhật đường dẫn của tôi, npm đã cài đặt các mô-đun vào thư mục nhà của tôi mà không có sudo nhưng đường dẫn không chính xác nên không tìm thấy mô-đun như ember, linuxbew đã giải quyết vấn đề nhanh chóng hướng dẫn thiết lập ở đây cho nút / npm


0

Vấn đề này và nguyên nhân khác gây ra bởi cùng một lý do có thể được giải quyết khi cài đặt Node trong không gian người dùng.

Bạn có thể làm điều đó chỉ cần sao chép và dán trong thiết bị đầu cuối của bạn

NODEJS_ROOT=${NODEJS_ROOT:-~/nodejs}
cd /tmp
wget -N http://nodejs.org/dist/node-latest.tar.gz && tar xzf node-latest.tar.gz
NODEJS_CURRENT=$(tar tf node-latest.tar.gz|head -1)
mkdir -p $NODEJS_ROOT/$NODEJS_CURRENT
cd $NODEJS_CURRENT
./configure --prefix=$NODEJS_ROOT/$NODEJS_CURRENT && make install
cd $NODEJS_ROOT
rm current 2> /dev/null # Removes current symbolic link, if any
ln -s $NODEJS_CURRENT current

Các lệnh tương tự cũng có thể được khởi chạy để cập nhật Node lên phiên bản mới nhất.

Đừng quên chỉnh sửa môi trường của bạn. Chỉ một lần, làm

echo "export NODEJS_ROOT=$NODEJS_ROOT"            >> $HOME/.bash_profile
echo 'export PATH=$NODEJS_ROOT/current/bin:$PATH' >> $HOME/.bash_profile
source $HOME/.bash_profile # reload your env, so you can use node right now

Hãy xem bài viết này dưới dạng hướng dẫn cách cài đặt Node.js mà không cần sudo .

Để biết giải pháp tổng quát hơn về chủ đề này (tức là cài đặt phần mềm cục bộ), hãy xem dotoftware .


0

chỉ cần sử dụng nvm bạn sẽ có thể tự động chuyển đổi giữa các phiên bản nút khác nhau và nó được cài đặt cục bộ cho người dùng của bạn. Không cần sudo. Chỉ cần chắc chắn rằng bạn đã làm sạch hoàn toàn nút cũ trước đó.

https://github.com/nvm-sh/nvm


-2

Giải pháp tốt nhất tôi tìm thấy là cài đặt Node.js từ gói tar vào thư mục gốc của người dùng và liên kết vị trí thư mục lib. Dưới đây là những gì bạn cần làm

Điều này sẽ cài đặt Nodejs dưới ~ / .local / thay vì mặc định / usr / local /

Add this to your ~/.npmrc (create the file if it doesn't exist already):

root =    /home/YOUR-USERNAME/.local/lib/node_modules
binroot = /home/YOUR-USERNAME/.local/bin
manroot = /home/YOUR-USERNAME/.local/share/man
Download the Nodejs source code from nodejs.org and install it under your ~/.local tree:

tar xf node......
cd node........
./configure --prefix=~/.local
make
make install

Create ~/.node_modules symlink. (This directory will be automatically searched when you load modules using require "module" in scripts. I'm not sure why Node doesn't search ~/.local/lib/node_modules by default.)

cd
ln -s .local/lib/node_modules .node_modules
Is ~/.local/bin in your path? Type

which npm
If it says ~/.local/bin/npm, you're done.

Otherwise, do this...

export PATH=$HOME/.local/bin:$PATH
...and add that line to your ~/.profile file, so it'll run every time you log in.

Nếu bạn vẫn gặp phải quyền sở hữu hoặc lỗi cấp phép trong khi cài đặt gói, thì hãy thay đổi quyền sở hữu ~ / .local / dir bằng cách chạy

chown -R user:user ~/.local/

Bây giờ bạn nên cài đặt các gói qua 'npm'

Lưu ý: TẤT CẢ CÁC QUY TẮC TRÊN NÀY ĐƯỢC CHẠY NHƯ NGƯỜI DÙNG. KHÔNG SỬ DỤNG SUDO HOẶC ROOT ĐĂNG NHẬP

KHÔNG BAO GIỜ ĐƯỢC THAY ĐỔI GIẤY PHÉP CỦA CÁC FILE THEO '/ USR / LIB /'. S LE LÃNH ĐẠO ĐẾN HĐH UNSTABLE


1
Sao chép từ tnovelli.net/blog/blog.2011-08-27.node-npm-user-install.html mà không có sự ghi nhận.
Tobu

-2

Tôi thấy những lời giải thích của Pawel Grzybek rất thuyết phục: Họ thực hiện tới 3 lệnh sudo đơn giản, không bao giờ phải sử dụng sudo nữa cho các cài đặt npm toàn cầu:

sudo chown -R $(whoami) /usr/local/lib/node_modules
sudo chown -R $(whoami) /usr/local/bin
sudo chown -R $(whoami) /usr/local/share
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.