TypeScript로 개발한 라이브러리를 npm으로 배포하기

node 설치가 필요합니다. 그리고 라이브러리를 위한 개발 폴더를 위해 다음과 같은 명령 수행이 필요합니다.

mkdir -p ~/dev/my-libary
cd ~/dev/my-libary
npm init -y
npm install -D typescript tsup
mkdir src

src/index.ts에 다음 코드를 입력합니다.

export function add(left: number, right: number): number {
  return left + right;
}

index.ts는 진입점이 되므로 사용자에게 공개할 것들을 export하는 것이 주목적입니다. 실제 API에 대한 코드는 별도의 코드 파일을 통해 제공하는 것이 일반적입니다.

tsconfig.json 파일을 생성해 다음처럼 입력합니다.

{
  "compilerOptions": {
    "target": "ES2022",
    "module": "NodeNext",
    "moduleResolution": "NodeNext",
    "strict": true,
    "noEmit": true,
    "verbatimModuleSyntax": true
  },
  "include": ["src"]
}

package.json 파일의 내용을 아래처럼 구성합니다.

{
  "name": "@YOUR_NPM_ID/my-libary",
  "version": "1.0.1",
  "description": "타입스크립트로 만든 테스트 라이브러리",
  "type": "module",
  "main": "./dist/index.cjs",
  "module": "./dist/index.js",
  "types": "./dist/index.d.ts",
  "exports": {
    ".": {
      "types": "./dist/index.d.ts",
      "import": "./dist/index.js",
      "require": "./dist/index.cjs",
      "default": "./dist/index.js"
    }
  },
  "files": [
    "dist"
  ],
  "scripts": {
    "build:js": "tsup src/index.ts --format esm,cjs --clean",
    "build:types": "tsc -p tsconfig.build.json",
    "build": "npm run build:js && npm run build:types",
    "check": "tsc --noEmit",
    "prepack": "npm run check && npm run build"
  },
  "keywords": [
    "typescript",
    "library"
  ],
  "license": "MIT",
  "devDependencies": {
    "tsup": "^8.5.1",
    "typescript": "^7.0.2"
  }
}

타입스크립트 코드의 타입 오류를 검사하고 빌드 하기 위해 다음 명령을 수행합니다.

npm run check
npm run build

dist 폴더가 생성되고 이 폴더 안에 index.js, index.cjs, index.d.ts 가 생성되어야 합니다.

실제 npm에 배포하기 위한 파일 생성을 시험해 보기 위해 다음 명령을 수행합니다.

npm pack --dry-run

출력되는 내용에서 dist/index.js, dist/index.cjs, dist/index.d.ts, package.json이 tar로 묶이는지 확인하면 됩니다. 만약 README.MD와 LICENSE 파일을 package.json 파일이 위치한 같은 폴더에 생성해 놨다면 이 2개의 파일들도 tar로 묶여야 합니다. tar로 묶인 결과를 tarball이라고 합니다.

실제 tarbal를 생성하기 위해 다음 명령을 수행합니다.

npm pack

그럼 your-npm-id-my-libary-1.0.0.tgz 파일이 생성됩니다.

your-npm-id-my-libary-1.0.0.tgz 파일을 npm에 배포하기에 앞서 이 파일로 라이브러리가 제대로 설치 되는지 확인하기 위해 새로운 프로젝트 풀더를 다음 절차를 참고하여 생성합니다.

mkdir -p ~/dev/my-libary-consumer
cd ~/dev/my-libary-consumer
npm init -y
npm install ../your-npm-id-my-libary-1.0.0.tgz

index.js 파일을 생성하고 다음 코드를 입력합니다.

const { add } = require("@YOUR_NPM_ID/my-libary");

console.log(add(10, 20));

다음 명령으로 코드가 정상적으로 실행되는지 확인합니다.

node index.js

이제 npm 사이트에 배포하기 위해 npm에 로그인합니다. 라이브러리 프로젝트에서 다음 명령을 실행합니다.

cd ~/dev/my-libary
npm login
npm whoami

자신의 npm ID가 출력되어야 합니다. 배포하기에 앞서 my-libary가 등록된적이 있는지 확인하기 위해 다음 명령을 실행합니다.

npm view @YOUR_NPM_ID/my-libary version

등록한 적이 없으므로 404 오류가 나와야 합니다.

실제 배포하기에 앞서 다시 한번 더 검증하고 배포합니다.

npm run check
npm pack --dry-run
npm publish --access public

이제 라이브러리를 테스트하기 위한 폴더에서 다음처럼 npm 사이트로부터 라이브러리를 설치해 테스트해 봅니다.

cd ~/dev/my-math-kit-consumer
npm uninstall @YOUR_NPM_ID/my-libary
npm install @YOUR_NPM_ID/my-libary
node index.js

라이브러리가 변경되면 버전업을 하고 다시 npm에 재배포해야 합니다. 다음 절차를 따릅니다.

cd ~/dev/my-math-kit
npm version patch
npm publish

위의 경우 버전업 레벨이 patch입니다. 다음을 참고하여 버전업 합니다.

  • patch: 버그 수정 (1.0.0 → 1.0.1)
  • minor: 하위 호환되는 기능 추가 (1.0.0 → 1.1.0)
  • major: 호환성을 깨는 변경 (1.0.0 → 2.0.0)

이제 라이브러리를 테스트하기 위한 폴더에서 다음처럼 npm 사이트로부터 라이브러리를 업데이트해 테스트해 봅니다.

cd ~/dev/my-libary
npm update @YOUR_NPM_ID/my-libary
npm list @YOUR_NPM_ID/my-libary

라이브러리가 변경되면 이를 tarball로 묶고 테스트하는 프로젝트에서 tarball을 설치(npm을 통해서든, 파일을 통해서든)하는 것은 매우 번거롭습니다. 이 경우 npm link를 통해 쉽게 해결할 수 있습니다.

라이브러리 폴더에서 다음 명령을 수행합니다.

cd ~/dev/my-libary
npm run build
npm link

그리고 테스트 폴더에서는 다음 명령을 입력합니다.

cd ~/dev/my-libary
npm link @YOUR_NPM_ID/my-libary

라이브러리를 link 방식이 아닌 tarball로 설치하고 싶다면 링크를 해제해야 합니다. 방법은 아래와 같습니다.

cd ~/dev/my-libary
npm unlink @YOUR_NPM_ID/my-libary

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다