Stay Hungry. Stay Foolish. Don't Be Satisfied.

Node.js 모듈을 npm 저장소에 배포하기

Node.js에서 npm은 필수적인 도구이면서 npm 중앙저장소에 등록된 만여개의 모듈은 Node.js의 빠른 개발을 돕는데 아주 중요한 역할을 하고 있습니다.(아직 역사가 짧아서 많은 모듈들의 퀄리티가 다소 떨어진다고 하더라도...) 그동안은 node.js 모듈들을 사용만 하다가 이번에 passport-me2day를 만들어서 npm 중앙저장소에 배포를 하게 되서 배포과정을 정리합니다. npm에 모듈을 배포하는 과정은 상당히 간단한데 npm 개발자 문서에 과정이 잘 나와 있습니다.


package.json
프로젝트 폴더의 루트위치에서 파일과 디렉토리 리스트를 보면 다음과 같습니다. (마지막에 / 를 붙힌 것은 폴더입니다.)

  • .npmignore
  • LICENSE
  • README.md
  • examples/
  • lib/
  • node_modules/
  • package.json
여기서 LICENSE, README.md, examples, lib는 모두 프로젝트와 관련된 파일들이므로 모듈마다 다른 파일과 구조를 가질 것입니다. 여기서 중요한 것은 packge.json 파일입니다. node.js를 사용해 봤다면 아주 익숙한 파일인데 배포할 프로젝트라면 다음 필드들이 필수로 있어야 합니다.

  • name : 문자열로 모듈의 이름을 명시합니다. 가이드에 따르면 node나 js를 의미하는 이름을 사용하지 않기를 권하고 있습니다.(하지만 실제로는 node가 붙은 모듈을 많이 볼 수 있습니다.)
  • description : 프로젝트의 설명을 입력합니다.
  • version : Semantic Versioning에 맞는 방식으로 버전을 명시합니다.
  • engines : 모듈이 호환되는 Node.js의 버전을 명시합니다.
  • author : 작성자를 적습니다.
  • scripts : 컴파일이나 설치 스크립트가 필요하다면 여기에 추가한다. 최소한 기본 테스트 명령어를 scripts.test에 추가한다.
  • main : 프로그램의 진입점이 되는 파일을 지정한다.
이러한 필드들을 사용해서 package.json을 만들면 됩니다. 여기에 필요한 정보를 추가하면 되는데 다음 파일은 이번에 배포한 passport-me2day의 package.json입니다. 사용자를 위해서 다음의 정보들은 포함되는 것이 좋아보입니다.
{
  "name": "passport-me2day",
  "version": "0.1.0",
  "description": "Me2day authentication strategy for Passport.",
  "author": { "name": "outsider", "email": "email@example.com", "url": "http://sideeffect.kr/" },
  "contributors": [
  ],
  "repository": {
    "type": "git",
    "url": "git://github.com/outsideris/passport-me2day.git"
  },
  "bugs": {
    "url": "http://github.com/outsideris/passport-me2day/issues"
  },
  "main": "./lib/passport-me2day",
  "dependencies": {
    "pkginfo": "0.2.x",
    "passport": "~0.1.3"
  },
  "devDependencies": {
    "vows": "0.6.x"
  },
  "scripts": {
    "test": "NODE_PATH=lib node_modules/.bin/vows test/*-test.js"
  },
  "engines": { "node": ">= 0.4.0" },
  "licenses": [ {
    "type": "MIT",
    "url": "http://www.opensource.org/licenses/MIT" 
  } ],
  "keywords": ["passport", "me2day", "auth", "authn", "authentication", "identity"]
}

제 모듈은 글로벌 설치를 하는 커맨드라인 도구는 아니었지만 커맨드라인 도구라면 preferGlobal 필드와 bin 필드를 추가해 주어야 합니다.


.npmignore
프로젝트에는 배포할 모듈외에도 테스트코드나 형상관리 코드등의 파일들도 포함되어 있습니다. 이런파일이 포함된다고 문제가 되지 않겠지만 필요도 없는 파일을 굳이 배포할 이유도 없습니다.
.DS_Store
.git*
.idea
Makefile
docs/
examples/
support/
test/

위처럼 배포에서 제외할 피일이나 디렉토리들을 지정합니다. 만약 .npmignore가 없는데 .gitignore가 있다면 .gitignore에 나온 규칙에 따라 배포파일을 제외합니다.


사용자 추가
npm registry에 모듈을 배포하려면 사용자 등록을 해야합니다. npm adduser 명령어를 사용해서 간단하게 추가할 수 있습니다.

npm adduser로 사용자를 추가하는


배포 전 테스트
혹 잘못된 파일을 배포하면 문제가 될테니 배포하기 전에 테스트를 해야합니다. 테스트는 간단하게 해볼 수 있습니다.
mkdir ../install-test
cd ../install-test
npm install ../my-npm-module/

위처럼 다른 폴더로 이동해서 npm install 명령어로 배포할 모듈의 루트경로를 지정해 주면 현 위치에 해당 모듈이 설치가 됩니다. 설치가 정상적으로 되면 node REPL에 진입해서 require('my-npm-module')로 문제가 없는지 확인해 볼 수 있습니다.

로컬설치가 아닌 글로벌 설치를 해야하는 모듈이라면 npm install . -g 명령어로 현재 프로젝트를 글로벌에 설치해 볼 수 있습니다. 수정할 때마다 재 설치를 하는 것이 싫다면 npm link 를 실행하면 현재 프로젝트를 심볼릭링크로 글로벌설치에 연결해서 수정되는 소스를 재설치할 필요없이 바로 적용할 수 있습니다.


배포
문제없이 사용가능 한 것을 확인했다면 이제 npm registry에 배포할 차례입니다.
$ npm publish

모듈의 루트위치에서 위의 명령어를 실행합니다.

npm publish로 모듈을 배포하는 화면

배포가 완료되면 npm registry에 가서 확인해 볼 수 있습니다. npm registry의 검색은 구글의 사이트검색을 이용하고 있기 때문에 배포하자마자 바로 검색해도 나오지 않습니다. 최신 업데이트된 리스트에서 확인하거나 https://npmjs.org/package/모듈명 으로 접속해서 확인하거나 npm info 명령어로 등록여부를 확인해 볼 수 있습니다. 추후에 모듈을 수정한다면 package.json의 version 부분을 변경하고 다시 npm publish를 실행하면 됩니다.
2012/08/31 00:26 2012/08/31 00:26