들어가며
개발 환경 구성을 위해 ubuntu 에 node.js 를 설치할 때 apt 로 설치해줄 수도 있지만, 비교적 최신 버전이 느리게 올라오기 때문에 nodesource 를 통해서 설치하는 방법에 대해서 정리해둔다. 특히 npm 으로 global module을 설치할 때 나는 EACCES 오류에 대해서 정리해둔다.
nodesource 를 통해 node.js와 npm 설치하기
nodesource 에 접속하면 친절하게 데비안 계열과 레드햇 계열에서 어떻게 설치해야하는지 자세하게 설명이 나와있다.
node.js v6.x를 설치하는 방법은 아래와 같다.
# 데비안 계열(우분투)에서 일반 사용자 계정인 경우, $ sudo apt-get install curl $ curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash - $ sudo apt-get install -y nodejs # 데비안 계열(우분투)에서 루트인 경우, $ apt-get install curl $ curl -sL https://deb.nodesource.com/setup_6.x | bash - $ apt-get install -y nodejs
일반 사용자인 경우와 루트인 경우는 사실 sudo 로 실행하느냐 차이 정도만 있다.
이와 유사하게 node.js v0.10을 설치할 때는 6.x 를 0.10으로 바꾸어주면 된다. 4.x 버전은 이 부분을 4.x 라고 쓰면 4 버전대 중에서 최신으로 설치된다.
위와 같이 실행해주고 나면, node.js 와 npm이 모두 설치된다.
npm에서 global 로 module을 설치할 때 발생하는 권한 오류
단 세 줄로 node.js와 npm이 모두 설치되었지만, npm 에서 모듈을 global 로 설치할 때 아래와 같은 권한 오류가 발생한다.
npm ERR! tar.unpack untar error /home/andrew/.npm/gulp/3.9.0/package.tgz npm ERR! Linux 3.19.0-25-generic npm ERR! argv "/usr/bin/node" "/usr/bin/npm" "install" "gulp" "-g" npm ERR! node v0.12.7 npm ERR! npm v2.11.3 npm ERR! path /usr/lib/node_modules/gulp npm ERR! code EACCES npm ERR! errno -13 npm ERR! Error: EACCES, mkdir '/usr/lib/node_modules/gulp' npm ERR! at Error (native) npm ERR! { [Error: EACCES, mkdir '/usr/lib/node_modules/gulp'] npm ERR! errno: -13, npm ERR! code: 'EACCES', npm ERR! path: '/usr/lib/node_modules/gulp', npm ERR! fstream_type: 'Directory', npm ERR! fstream_path: '/usr/lib/node_modules/gulp', npm ERR! fstream_class: 'DirWriter', npm ERR! fstream_stack: npm ERR! [ '/usr/lib/node_modules/npm/node_modules/fstream/lib/dir-writer.js:35:25', npm ERR! '/usr/lib/node_modules/npm/node_modules/mkdirp/index.js:47:53', npm ERR! 'FSReqWrap.oncomplete (fs.js:95:15)' ] } npm ERR! npm ERR! Please try running this command again as root/Administrator.
npm 의 기본 디렉토리에 모듈을 설치할 때, 현재 사용자가 기본 디렉토리에 대한 권한이 없어서 발생하는 문제이다.
npm 의 documentation 에는 이러한 오류에 대해 두 가지 해결 방안을 제시하고 있다.
① npm 디렉토리에 현재 사용자의 권한을 추가하는 방법
먼저 터미널에서 아래와 같이 입력해서 npm 디렉토리가 어디에 위치해있는지 확인한다.
$ npm config get prefix
/usr/local 로 대부분 나오겠지만 /usr 로 나온다면 방법1은 사용할 수 없으며, 방법 2로 해결해야 한다.
/usr/local 로 나온경우, 아래와 같이 입력해서 owner 에 현재 사용자를 추가해준다. whoami 에 자신(현재 사용자)의 username이 들어가야 하고, 디렉토리에는 위에서 확인한 npm 디렉토리를 넣어주면 된다.
$ sudo chown -R $USER /usr/local
만약 모든 디렉토리의 퍼미션을 바꾸는걸 원치 않는다면, lib/node_modules 와 bin 그리고 share 디렉토리의 권한만 변경해주어도 된다.
② npm 의 기본 디렉토리를 다른 디렉토리로 변경하는 방법
먼저 global 로 설치하기 위한 디렉토리를 생성한다. (npm-global-modules 라는 디렉토리명 대신 다른 디렉토리명으로 생성해도 된다)
$ mkdir ~/npm-global-modules
그 다음 npm 이 새로운 디렉토리를 사용하도록 설정한다.
$ npm config set prefix '~/npm-global-modules'
그 다음, ~/.profile 파일을 열거나 없으면 만들어서 아래의 라인을 추가해준다.
$ export PATH=~/npm-global-modules/bin:$PATH
그리고 이 수정이 반영될 수 있도록 시스템 변수를 업데이트해준다.
$ source ~/.profile
개인적으로는 다소 귀찮지만 퍼미션 변경이 없는 두 번째 방법을 더 선호한다. 아래의 명령을 실행하면 위의 과정을 한번에 처리할 수 있다.
mkdir ~/npm-global-modules && npm config set prefix '~/npm-global-modules' && echo "export PATH=~/npm-global-modules/bin:\$PATH" >> ~/.profile && source ~/.profile