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
또 다른 중요한 보안 문제 는 노드 패키지 npmgithub.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_modulesnode
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


치명적인. binshare대괄호를 추가하지 마십시오 . 무시하면이 폴더의 소유권이 현재 사용자 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.