NPM 모듈은 sudo 없이는 전역 적으로 설치되지 않습니다.


126

방금 Ubuntu 12.04 LTS를 다시 설치했으며 다른 작업보다 먼저 다음 단계를 수행했습니다 .

  1. 다음 스크립트를 사용하여 패키지 관리자를 통해 노드를 설치했습니다.

    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. yeoman, express, n, yeoman의 발전기를 전 세계에 설치하려고했는데 모두 동일한 오류를 반환했습니다.

    npm 오류! 오류 : EACCES, symlink '../lib/node_modules/n/bin/n'

    npm 오류! {[오류 : EACCES, symlink '../lib/node_modules/n/bin/n'] 오류 번호 : 3, 코드 : 'EACCES', 경로 : '../lib/node_modules/n/bin/n'}

    npm 오류!

    npm 오류! 루트 / 관리자로이 명령을 다시 실행하십시오.

    npm 오류! System Linux 3.8.0-29- 일반

    npm 오류! 명령 "/ usr / bin / node" "/ usr / bin / npm" "install" "-g" "-d" "n"

    npm 오류! cwd / home / heberlz

    npm 오류! 노드 -v v0.10.20

    npm 오류! npm -v 1.3.11

    npm 오류! 경로 ../lib/node_modules/n/bin/n

    npm 오류! 코드 EACCES

    npm 오류! errno 3

    npm 오류! 스택 오류 : EACCES, symlink '../lib/node_modules/n/bin/n'

    npm 오류!

    npm 오류! 추가 로깅 세부 정보는 다음에서 찾을 수 있습니다.

    npm 오류! /home/heberlz/npm-debug.log

    npm 오류! 괜찮지 않은 코드 0

  3. 다음 폴더의 소유권을 재귀 적으로 ~ / .npm, / usr / lib / node, / usr / lib / node_modules 및 다음 심볼릭 링크 / usr / bin / node, / usr / bin / nodejs 에 대해 절대로 성공하지 못했습니다.

나중에 문제가 발생하지 않도록 sudo없이 여만과 발전기를 설치해야합니다 :(


감사합니다 필, 지금은 더 잘 보이
— HeberLZ

2
당신이 $ HOME보다는는 / usr 글로벌 패키지를 설치하는 NPM을 원하는 경우, 가이드에 따라 github.com/sindresorhus/guides/blob/master/...을
— 대령 패닉

이것은 나를 위해 일한 것입니다 github.com/nodejs/node-v0.x-archive/issues/... :ln -s /usr/bin/nodejs /usr/bin/node
— 루이 MICHEL

답변:


318

Ubuntu 12.04 및 Chris Lea의 PPA를 사용하여 설치하면 다음이 작동합니다.

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

$ HOME / .npm-packages / bin을 $ PATH에 추가

추가하다 .bashrc

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

@passy의 https://stackoverflow.com/a/18277225 참조


9
이것은 훨씬 더 깨끗한 솔루션처럼 보입니다. 홈 디렉토리의 시스템 폴더가 마음에 들지 않으면 ~ / .local / share / npm과 같은 위치를 사용할 수도 있습니다.
— JeroenHoek

접두사를 변경 한 후에는 npm 자체를 포함하여 이전에 설치 한 모든 전역 모듈을 다시 설치해야합니다.
— Dziamid

이것은 괜찮아 보이지만 사용자에게 쓰기 권한을 부여하는 것이 훨씬 쉽다는 것을 알았습니다 /usr/lib/node_modules/. 또는 nodejs 유닉스 그룹을 만들고 해당 그룹에 해당 디렉토리에 대한 쓰기 권한을 부여하는 것이 적절할 수도 있습니다.
— mehulkar

추가해야 할 작은 세부 사항 중 하나 는 ~ / npm 디렉토리를 직접 만들어야 한다는 것입니다. 그렇지 않으면 npm이 ENOENT 오류와 함께 종료됩니다.
— Jason Farnsworth

6
이것이 npm의 기본값이 아닌 이유는 무엇입니까? 공유해 주셔서 감사합니다.
— Dorian 2015 년

23

이미 $HOME/bin경로에 있다면 더 간단한 해결책은 ...

npm config set prefix ~
  • 이제 새 노드 명령이 $HOME/bin디렉토리에 설치됩니다 .
  • 경로를 변경할 필요가 없습니다!

이 논의는 실제로를 실행할 때의 보안 위험을 줄이는 것에 관한 것이므로 sudo모든 노드 앱이 설치 중이라고 생각하는 등록 된 노드 패키지 이름과 일치하지 않는 앱 이름을 잠재적으로 설치할 수 있음을 알아야합니다. 따라서이 (가) npm install기존 시스템 명령이나 .NET에 이미있는 명령을 대체 할 보안 위험이 있습니다 $HOME/bin. 우려되는 경우 먼저 설치하려는 앱 의 파일 에서 bin, 및 scripts속성을 확인하십시오 package.json.

일반적으로 다음이 가장 안전합니다.

  • (a) $HOME/bin시스템 명령이 대체되지 않도록 경로의 마지막에 배치하십시오.
  • (b) "."를 포함하지 마십시오. 또는 상대 경로를 통해 $PATH현재 디렉토리에있는 명령을 실수로 실행하지 않도록합니다.

참고:


1
또 다른 중요한 보안 문제 는 노드 패키지 npm의 github.com저장소 에 표시되는 소스 코드 가 npm.org레지스트리 서버 에서 설치하는 코드와 다를 수 있다는 것입니다 !
— 토니 O'Hagan

이론적으로는 잘 만들어진 노드 패키지가에서 행복하게 설치되지만 ~/bin일부 노드 패키지 (또는 종속 패키지)는 설치로만 테스트되었으므로 테스트 sudo되지 않은 "설치 환경"문제가 발생할 수 있습니다. 다른 환경 문제 (예 : OS 변경)와 마찬가지로 "한 번만 작성하면 어디에서나 테스트"라는 원칙이 여전히 유효합니다.
— 토니 O'Hagan

이 방법의 단점은 npm이 ~ / lib라는 추가 디렉토리를 생성한다는 것입니다. 조직 관행에 따라 바람직하지 않을 수 있습니다.
— Mr. S

12

2014 년 10 월 기준 :

Node.js는 NodeSource Debian 및 Ubuntu 바이너리 배포 저장소 에서 사용할 수 있습니다 .

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

그게 다야.

오래된 답변 :

sudo를 사용하지 않는 가장 빠른 방법은 isaac이 설명한 것과 같습니다.

sudo로 패키지 관리를하지 않는 것이 좋습니다! 패키지는 임의의 스크립트를 실행할 수 있으므로 패키지 관리자 명령을 전기 톱 헤어컷만큼 안전하게 sudoing 할 수 있습니다. 물론, 빠르고 확실히 장애물을 통과 할 것이지만 실제로 그 장애물이 거기에 머물기를 원할 수도 있습니다.

대신 한 번 수행하는 것이 좋습니다.

sudo chown -R $USER /usr/local

편집하다:

/ usr / local의 소유권을 현재 사용자로 변경하는 것과 관련된 특정 보안 문제 및 기능 제한이 있습니다.

그러나 sudo를 사용하지 않고 전역 모듈을 설치하려는 경우 언급 한 것보다 더 나은 솔루션 (실용적인 관점에서)을 볼 수 없습니다. 보안과 사용의 용이성은 매우 광범위한 주제이며 이에 대한 쉬운 답은 없습니다. 요구 사항에 따라 다릅니다.


23
이것은 모든 / usr / local이 단일 사용자에게 속하도록 만들기 때문에 나쁜 생각입니다.
— 리드 G. 법률

4
@ ReedG.Law가 지적했듯이 이것은 정말 나쁜 생각입니다. / usr / local의 소유권을 특정 사용자로 변경하지 마십시오.
— 크리스토퍼 윌

3
Reed G Law에 동의해야합니다. / usr / local을 변경하는 것은 BAD BAD BAD 아이디어입니다. 제 경우에는 방향을보고 그렇게했습니다. 그리고 나서 개발을하는 다른 사람과 이것을 공유해야한다는 것을 회상했습니다. 나는 돌아가서 모든 변화를 얻었습니다. 보안뿐만 아니라 기능도 마찬가지입니다.
— Lloyd Sargent 2014 년

3
시스템에 한 명의 사용자 만있는 경우이 솔루션에 단점이 있습니까?
— connorbode 2014 년

2
죄송합니다, 의미 /usr/local/lib/node_modules와node
— Creynders

11

문제는 sudo를 사용하여 노드를 설치했습니다. 전역 적으로 npm 모듈을 설치할 때 오류를 방지하기 위해 설치했습니다.

내 해결책은 노드 를 다시 설치하는 것이 었습니다. 하는 것입니다.

내 경우 node-v0.10.20.tar.gz에서 nodejs.org에서 최신 안정 노드 소스를 다운로드하십시오.

tar -zxf node-v0.10.20.tar.gz #uncompress sources

cd node-v0.10.20 # 압축되지 않은 폴더 입력

sudo chown -R $ USER / usr / local

./configure --prefix = / usr / local && make && make install

한 가지 주목할 점은 노드 설치 자체가 sudo로 이루어 졌기 때문에 / usr / local 폴더의 소유권 만 제 경우에는 작동하지 않는다는 것입니다.

yeoman을 설치하는 마지막 단계 : # yeoman.io에서 "npm install -g yo"를 수행하면 이미 bower와 grunt가 설치된다고되어 있지만 실패한 grunt 하위 모듈이 있으므로 자체적으로 설치하여 수정했습니다.

npm install -g bower

npm install -g grunt

npm 설치 -g yo

npm install -g 생성기 각도


이론 상으로는 훌륭하지만 전 세계적으로 모듈에 액세스하기 위해 Node를 빌드하고 4 개의 추가 모듈을 설치하지 않고도 동일한 효과를 얻을 수있는 방법이 있습니까?
— Dan Nissenbaum 2015 년

선택한 답변은 필요한대로 작동합니다. 이것은 다른 공공 솔루션은 아직 없을 때 내가 2 년 전 무슨 짓을했는지,하지만 지금은 쓸모가 없다
— HeberLZ

5

환경 변수와 셸 별칭으로이 문제를 해결했습니다.

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

나를 위해 npm은 .npmrc의 "접두사"구성 설정을 따르지 않았습니다.


2

이 유사한 SO 게시물에 따르면 : npm은 sudo없이 오류를 발생시킵니다.

소유권 문제가있는 것 같습니다. ~/.npm디렉토리에 .

그 답과 마찬가지로 다음을 시도하십시오.

sudo chown -R `whoami` ~/.npm

실제로 이것이 작동하지 않을 때 시도한 것의 3 단계에서 설명한대로 작동하지 않았습니다. 문제는 sudo를 사용하여 노드를 설치했기 때문에 어떤 상황에서는 문제가 발생할 수 있습니다. 노드를 삭제하고 소스에서 다시 설치하면 모든 것이 예상대로 작동하기 시작했습니다!
— HeberLZ 2014

@HeberLZ 나는 당신이 옳다고 생각합니다. 어제 밤 다른 컴퓨터에서 이것을 시도했지만 작동하지 않았습니다. 다른 권한 문제도 처리해야했습니다. 소스에서 npm을 설치하지 않는 가장 좋은 방법이 무엇인지 아직 확실하지 않습니다.
— prasanthv 2014

댓글의 질문에 링크하거나 현재 질문을 중복으로 표시합니다. 다른 질문의 답변을 복사하여 붙여 넣는 것은 도움이되지 않습니다.
— givanse 2014-06-25

@HeberLZ이 답변의 반대표는 귀하가 만든 질문의 제목을 다루기 때문에 부적절합니다.
— Sebastian Sastre 2015 년

제가 언제 답변에 반대표를 던졌는지는 기억이 나지 않지만, 제 경우에는 당신이 쓴 내용이 문제를 해결하지 못했고, 제가 아마도 대답을 반대표를 던졌다 고 생각하는 이유입니다. 질문에 명시된대로 : "다음 폴더의 소유권을 재귀 적으로 ~ / .npm, / usr / lib / node, / usr / lib / node_modules 및 / usr / bin / node, / usr / bin / 절대 성공하지 못한 nodejs "나는 .npm과 성공하지 못한 다른 모든 폴더의 소유권을 얻으려고 시도했습니다
— HeberLZ

2

npm의 디렉토리 경로를 찾으십시오.

npm config get prefix

많은 시스템에서 이것은 / usr / local입니다.

npm 디렉토리의 소유자를 현재 사용자의 이름 (사용자 이름!)으로 변경합니다.

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

이는 npm 및 기타 도구 (lib / node_modules, bin 및 share)에서 사용하는 하위 폴더의 권한을 변경합니다.

자세한 내용은 다음 링크를 참조하세요.

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


치명적인. bin및 share대괄호를 추가하지 마십시오 . 무시하면이 폴더의 소유권이 현재 사용자 sudo로 변경 될 수 있으며 소유권도 변경되기 때문에 시스템에 새 패키지를 설치하는 데 문제가 발생할 수 있습니다.
— A.Ametov

이 명령은 내 모든 파일 시스템을 파괴합니다. (
— UA_


1

실제로 루트가 소유 한 사용자 폴더의 권한을 변경했습니다.

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

그런 다음 sudo없이 "npm install"및 "bower install"을 수행 할 수 있습니다! 잘 했어요!


0

lubuntu 14.04.3을 사용하여 .npm 및 npm 접두사의 소유권을 변경하고 경로를 업데이트하고 npm이 sudo없이 내 홈 디렉토리에 모듈을 설치했지만 경로가 잘못되어 ember와 같은 모듈을 찾을 수 없었습니다. linuxbew 가 문제를 해결했습니다. 여기 에 node / npm 설정 가이드


0

이 문제와 같은 이유로 인한 기타 문제는 사용자 공간에 Node를 설치하여 해결할 수 있습니다.

터미널에 복사하여 붙여 넣기 만하면됩니다.

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

동일한 명령을 실행하여 Node를 최신 버전으로 업데이트 할 수도 있습니다.

환경을 편집하는 것을 잊지 마십시오. 한 번만

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

sudo없이 Node.js 를 설치 하는 방법에 대해이 기사를 확인하십시오 .

이 주제에 대한보다 일반적인 솔루션 (예 : 로컬로 소프트웨어 설치)은 dotsoftware를 참조하십시오 .


0

nvm을 사용하면 다른 노드 버전간에 동적으로 전환 할 수 있으며 사용자를 위해 로컬로 설치됩니다. sudo가 필요하지 않습니다. 사전에 이전 노드를 완전히 정리했는지 확인하십시오.

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


-2

내가 찾은 최고의 해결책은 tar 패키지의 Node.js를 사용자 홈 디렉토리에 설치하고 lib 폴더 위치를 연결하는 것입니다. 수행해야 할 작업은 다음과 같습니다.

그러면 기본 / usr / local / 대신 ~ / .local / 아래에 Nodejs가 설치됩니다.

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.

패키지를 설치하는 동안 소유권 또는 권한 오류가 계속 발생하면 다음을 실행하여 ~ / .local / dir의 소유권을 변경하십시오.

chown -R user:user ~/.local/

이제 'npm'을 통해 패키지를 설치하는 것이 좋습니다.

참고 : 위의 모든 명령은 사용자로 실행해야합니다. SUDO 또는 ROOT LOGIN을 사용하지 마십시오

'/ USR / LIB /'아래의 폴더 권한을 절대 변경하지 마십시오. 불안정한 OS로 이어질 것입니다


1
속성없이 tnovelli.net/blog/blog.2011-08-27.node-npm-user-install.html 에서 복사되었습니다 .
— Tobu

-2

내가 찾을 수 파블 Grzybek의 설명은 매우 설득력 : 그들은 결코 글로벌 NPM 설치 수에 대한 sudo를 다시 사용할 필요가없고, 3 개 간단한 sudo는 명령을 졸이다 :

sudo chown -R $(whoami) /usr/local/lib/node_modules
sudo chown -R $(whoami) /usr/local/bin
sudo chown -R $(whoami) /usr/local/share
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.