본문 바로가기

Backend/Node.js

Use Github private packages

어느새 나온지 좀 되긴 했지만 그동안 팀에서 관리하던 공통 모듈을 github private packages 로 옮기게되어 겸사겸사 포스팅을 남겨볼까 합니다. 

 

- What?

 

GitHub Packages is a software package hosting service
that allows you to host your softwarepackages privately or publicly
and use packages as dependencies in your projects.

 

공식 문서에선 github packages 에 대해 위와 같이 설명하고 있습니다. 직역하면 Github Pacakges 는 소프트웨어 패키지를 비공개
또는 공개적으로 호스팅하고 프로젝트에서 디펜던시로서 사용할 수 있는 소프트웨어 패키지 호스팅 서비스입니다.

 

사용하는 언어인 Node.JS 로 보자면 일반적으로 package 저장소는 npm 을 사용합니다만, npm 의 경우 public 에 대해선 무료이지만
private 으로 사용해야 할 경우 유료 플랜을 써야합니다. 뭐 이것 자체는 회사 측면에서 큰 문제가 아닐 수 있지만, 이미 github 과 npm 을
따로 운영해야한다는 측면에선 관리 포인트가 늘어나는 셈이죠.

 

github 에서 제공하는 private packages 를 사용하면 이젠 npm 을 사용하지 않아도 github 에서 해결이 됩니다.

저희 회사에선 원래도 npm 을 쓰진 않고 github 에 그냥 repository 를 뚫어서 모듈화 및 태깅하는 형태로 사용하긴 했지만, 관리하기
훨씬 용이해질 것으로 보이긴 하네요.
npm 뿐만 아니라 Ruby, Java, .NET, docker 에 대해서도 지원하니 다른 언어에서도 충분히 활용할 수 있을 것 같습니다.

 

- How to use?

 

우선 세팅에 필요한 github token 을 생성해야 합니다.

 

 

 

 

우측 상단의 본인 아이콘을 눌러서 Settings > Developer Settings > Personal access tokens > Tokens 로 이동합니다.

Find-grained tokens 라는 Beta 서비스가 새로 나온 듯 하지만 일단 패스하고, publish-test 라는 이름으로 (이름은 별로 중요치 않습니다) repo, write:packages, delete:packages scope 를 선택해 토큰을 생성합니다.

 

 

그리고 github private packages 에 publish 할 패키지가 될 레포를 하나 새로 생성합니다.

중간에 지워진것을 조직 이름이라 크게 신경 안쓰셔도 됩니다. 만드는 김에 TS 모듈로 생성해보겠습니다.

 

// src/index.ts
export const sum = (a: number, b: number) => {
  return a + b;
};

export const sub = (a: number, b: number) => {
  return a - b;
};

export const mul = (a: number, b: number) => {
  return a * b;
};

export const div = (a: number, b: number) => {
  return a / b;
};

 

모듈을 private packages 에 올리는게 주 목적이므로 코드는 그냥 간단한 사칙연산 모듈이라고 보시면 됩니다.

src -> dist 로 빌드할거고 관련 TS 설정은 생략하겠습니다. 여기서 이제 이것저것 설정할 것들이 있습니다.

 

//npm.pkg.github.com/:_authToken=xxx

 

먼저 레포의 root 위치에 .npmrc 파일을 생성하고, 위 라인을 추가 후 저장합니다. xxx 부분에 아까 github settings 에서 발급받았던
personal access token 을 넣으면 됩니다.

.npmrc 파일은 npm 관련된 설정을 저장하는 파일로 사설 registry 를 추가할 때 위와 같은 설정을 할 수 있는데, 이번 경우엔 npm.pkg.github.com 으로 github private packages 를 사설 registry 로 추가하고 거기에 접속할 수 있는 토큰 값을 세팅했다고
보시면 됩니다.

 

// .gitignore
node_modules
dist/*

// .npmignore
src/*

 

이건 그냥 TMI 같은 느낌인데.. .gitignore.npmignore 를 root 위치에 각각 위와 같이 생성합니다.

우리는 보통 git 에 추가되지 말아야 할 파일들을 gitignore 로 설정하고 거기엔 node_modules 나 dist 와 같은 빌드 결과물이 포함됩니다. 하지만 npmignore 를 설정하지 않으면 나중에 publish 과정에서 gitignore 설정을 따라가게 되고, publish 를 했는데 빌드 결과물이 들어가지 않는 상황이 생기게 됩니다. 따라서 저는 npmignore 를 별도로 설정해주겠습니다.

 

{
  "name": "@xxx/test-module",
  "version": "1.0.0",
  "description": "",
  "main": "./dist/index.js",
  "scripts": {
    "build": "tsc"
  },
  "publishConfig": {
    "registry": "https://npm.pkg.github.com"
  },
  "repository": {
    "type": "git",
    "url": "https://github.com/xxx/test-module.git"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "typescript": "^4.9.5"
  }
}

 

위는 여러 설정들이 추가된 package.json 파일입니다. 하나하나 살펴보겠습니다.

먼저 name 에는 보통 npm init 시 넣었던 package-name 이 들어가게 되는데 여기에 @xxx 와 같이 네임스페이스를 필요로 합니다.

조직 이름이나 본인 github id 를 넣으면 됩니다.

 

두번째로는 version 인데 뭘 따로 하지 않았다면 1.0.0 으로 들어가있을 거고 publish 를 처음 진행하는 과정이면 건드릴게 없지만,

이미 1.0.0 으로 publish 를 했다면 이 버전은 꼭 다른 버전으로 변경해줘야 합니다. 이미 있는 버전을 사용하면 버전 충돌로 인해 publish 과정이 실패하게 되니, 수동으로 변경하거나 npm version ~ 와 같은 CLI 를 활용합니다. (관련 링크)

 

설정 중 main 은 너무도 당연한거니 패스하고.. 그 다음은 publishConfig 입니다.

여기서 github private packages 를 registry 로 사용하겠다는 설정을 꼭 해줍니다.

 

마지막으로 repository 입니다. 생성했던 github repository 의 주소를 반드시 명시해주도록 합니다.

팀에서 이거 관련 세팅할 때 repository 를 명시하지 않았다가 엄한 곳에 배포가 되어 좀 귀찮았던 기억이 있습니다.. 이건 나중에 따로 올려보겠습니다.

 

> npm run build
> npm publish

 

 

여기까지 세팅했으면 이제 publish 를 할 차례입니다. TS 로 작성했기때문에 build 를 한 번 돌려주고, npm publish 를 하면
위와 같이 npm.pkg.github.com 에 publishing 되는 과정을 볼 수 있습니다. 한번 확인을 해보죠.

 

 

 

github 에 만들었던 레포를 가보면 우측 하단 Packages 부분에 새로 하나 생긴게 보일겁니다.

클릭을 해보면, 우리가 작성했던 1.0.0 버전의 모듈이 publish 된 것을 확인할 수 있습니다.

publish 는 잘 된 것 같지만 실제로 사용에도 문제가 없는지 임의의 프로젝트에서 설치 후 사용해보겠습니다.

 

registry=https://npm.pkg.github.com/xxx

 

여기서 한가지 넣어줘야하는건 .npmrc 파일을 생성해 위 라인을 추가해줘야 한다는 것입니다.

우리는 github private packages 에 패키지를 publish 하긴 했기 때문에 해당 패키지를 사용할 레포에서도 github private packages 에 대한 registry 를 추가해줘야 합니다. xxx 는 역시나 조직 이름 또는 github id 를 넣어주시면 되겠습니다.

 

import { sum, sub, mul, div } from '@xxx/test-module';

console.info(sum(3, 2)); // 5
console.info(sub(3, 2)); // 1
console.info(mul(3, 2)); // 6
console.info(div(3, 2)); // 1.5

 

packages 에서 안내하는대로 npm install @xxx/test-module 를 통해 설치 후 해당 패키지에서 제공하는 sum, sub, mul, div 함수를 사용해보면 잘 동작하는 것을 확인할 수 있습니다. alias 설치에 대해 하나만 더 적고 포스팅을 마무리하도록 하겠습니다.

 

> npm install test-module@npm:@xxx/test-module@1.0.0

 

npm 을 통해 패키지 설치시 위처럼 alias 를 걸 수 있습니다. 위 예시는 @xxx/test-module 을 test-module 로 alias 세팅해서 설치한 것인데, 이렇게 하면 이후 모듈 사용시 import 부분에서 import ... from 'test-module'; syntax 로 사용할 수 있습니다.

하지만 팀에선 그냥 처음의 방법으로 설치해서 @xxx 를 import 구문에 나타내어 내부 패키지임을 드러내는 것이 더 좋다는 의견이 많아 alias 로 사용하고 있진 않으니 참고하시면 되겠습니다.

'Backend > Node.js' 카테고리의 다른 글

Service Locator (서비스 로케이터)  (0) 2022.12.25
의존성 주입  (0) 2022.12.10
모듈과 의존성  (0) 2022.11.12
스트림 (Stream)  (0) 2022.09.03
제네레이터 (Generator)  (0) 2022.08.27