회사 내부에서만 사용하거나 개인적으로 사용하는 기능을 모듈화하여 private 하게 패키지로 배포해서 쓰려면 어떻게 해야할까?
크게 3가지 방법이 있다.
1. npm 에서 제공해주는 유료 플랜 사용
- https://www.npmjs.com/products
2. github package 사용
- https://github.com/features/packages
github 에서 제공해주는 패키지 레지스트리.
- npm
- gem
- mvn
- gradle
- dotnet CLI
- docker
저장 용량: 500MB, 매달 데이터 전송 트래픽: 1GB 를 무료로 제공해준다.
3. 직접 레지스트리 구축
sinopia 또는 verdaccio 를 활용해서 직접 레지스트리를 구축할수도 있다고 한다.
이 글에선 2번 방법인 github package의 무료 플랜을 통해 private npm packge 를 배포해보고자 한다.
우선 프로젝트 정보와 node 패키지 의존성을 관리하는 package.json 에 배포 할 패키지에 대한 정보를 명시해주어야 한다.
(패키지 배포에 이용할 githuib repository 가 생성되어 있어야 한다.)
- githuib repository 가 public 이면 github package 는 public 으로 private 이면 private 으로 배포된다.
패키지 정의
{
"name": "@junholee14/npm-private-lib",
// "private": false // 비공개 레포의 경우 private 을 true 로 설정하면 배포시 오류가 발생.(단 공개모듈일 경우 false 로 설정하는 것은 문제가 되지 않는다.)
"version": "1.0.0",
"description": "",
"main": "dist/src/index.js",
"repository": "https://github.com/junholee14/npm-private-lib",
"publishConfig": {
"registry": "https://npm.pkg.github.com"
},
"author": "junholee14",
"license": "ISC"
}
참고 - https://docs.npmjs.com/cli/v10/configuring-npm/package-json
name: 패키지명
version: 패키지 버전 (버저닝을 위해 해당 값을 변경하여 배포하면 된다.)
main: 패키지 require 또는 import 시 export 될 파일
repository: 패키지 레포지토리 url
publishConfig.registry: 패키지가 저장될 registry 정보 (디폴트: https://registry.npmjs.org)
패키지 배포
패키지 배포에는 Local 배포, 깃헙 액션 배포 2가지 방법이 있다.
Local 배포
1. 레지스트리 접근 인증
깃헙 패키지 레지스트리에 접근하여 패키지를 배포하기 위해선 write 권한이 있는 토큰을 발급 받아야한다.
토큰을 발급 받은후 터미널에서 다음 명령어를 통해 레지스트리 접근에 대한 인증이 가능하다.
npm login --scope=@junholee14 --registry=https://npm.pkg.github.com
> Username: USERNAME
> Password: TOKEN
> Email: Email
--scope: 소유자
--registry: 레지스트리 url
위와 같이 번거로운 인증 과정없이 npm 설정 파일인 .npmrc 를 프로젝트 최상단(root)에 위치시켜 설정할수도 있다.
@junholee14:registry=https://npm.pkg.github.com/
//npm.pkg.github.com/:_authToken=xxxxxxxxxxx
2. 배포
npm publish
깃헙 액션 배포
1. 깃헙 액션 워크플로우 생성
.github/workflows/release-package.yml
name: Node.js Package
on:
release:
types: [created]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v3
with:
node-version: 16
- run: npm ci
- run: npm test
publish-gpr:
needs: build
runs-on: ubuntu-latest
permissions:
packages: write
contents: read
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v3
with:
node-version: 16
registry-url: https://npm.pkg.github.com/
- run: npm ci
- run: npm publish
env:
NODE_AUTH_TOKEN: ${{secrets.GITHUB_TOKEN}}
release 시 github package npm 레지스트리에 배포가 된다.
2. npm 설정
배포시 어떤 scope 와 registry 를 이용할지 npm 에 명시하기 위해선 아래 2가지 방법중 하나를 사용하면 된다
.npmrc
@junholee14:registry=https://npm.pkg.github.com/
//npm.pkg.github.com/:_authToken=xxxxxxxxxxx
package.json
"publishConfig": {
"@junholee14:registry": "https://npm.pkg.github.com"
}
배포한 패키지 설치
기본적으로 npm 은 패키지 설치시 디폴트로 레지스트리 https://registry.npmjs.org 를 바라보게 되어있다.
위에서 배포한 패키지의 경우 https://npm.pkg.github.com/ 에 저장되어 있기 때문에 npm 에게 이에 대해서 알려주어야 한다.
.npmrc
@junholee14:registry=https://npm.pkg.github.com/
//npm.pkg.github.com/:_authToken=xxxxxxxxxxx
- @junholee14 스코프에 정의된 모듈들은 모두 https://npm.pkg.github.com 를 바라보게 된다.
- 토큰 read:packages 권한 필수
npm i @junholee14/npm-private-lib
만약 @junholee14/a-module 은 github package 에 @junholee14/b-module 은 npm 디폴트 레지스트리에 등록되어 있는 경우 둘을 각각 따로 지정해서 가져오는 방법은 아직 지원하지 않는다고 한다. 이런 경우 github package, npm 레지스트리 둘 모두에 패키지를 등록하여 해결할수 있다.
참고자료
- https://heropy.blog/2019/01/31/node-js-npm-module-publish/
- https://velog.io/@hyeonq/%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%ED%95%98%EC%9C%84%EC%9D%98-%ED%8A%B9%EC%A0%95-%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC%EB%A5%BC-%EB%A3%A8%ED%8A%B8%EB%A1%9C-npm-%EB%B0%B0%ED%8F%AC%ED%95%98%EA%B8%B0
- https://min9nim.vercel.app/2021-05-17-github-packages/
'IT > Javascript' 카테고리의 다른 글
[javascript] pdf-lib 라이브러리 Error: WinAnsi cannot encode 한글 사용시 오류 (0) | 2023.11.08 |
---|---|
[javascript] axios 는 GET params 에 null, undefined, 빈 배열 값은 담지 않는다. (0) | 2022.12.15 |
[javascript] moment 라이브러리 deprecated (0) | 2021.09.27 |