Lerna - 설치 및 패키지 생성 (1)

4 minute read

이전 포스트에서 Mono Repo 개념에 대해서 이전에 간략하게 정리를 하였습니다. 이제 본격적으로 Mono Repo를 경험할 수 있는 Lerna에 대해 알아보겠습니다.

보통 큰 코드베이스를 각각의 독립된 버전의 Package로 분할하면 코드 공유에 매우 유용합니다. 그러나 여러 Repository 에서 코드 변경을 수행하는 것은 프로젝트가 지저분해지고 변경사항을 추적 하기가 어렵고 결국 Repository 내의 전체 테스트가 매우 복잡해질 수 있습니다.

이러한 문제를 해결하기 위해 일부 프로젝트는 코드베이스를 다중 패키지 저장소로 구성합니다. Babel , React , Angular , Ember , Meteor , Jest 등과 같은 프로젝트는 단일 저장소 내에서 모든 패키지를 개발합니다.


Lerna 는 git 및 npm 을 사용하여 다중 패키지 저장소 관리와 관련된 워크플로우를 최적화하는 도구입니다. 또한 개발 및 빌드 환경에서 수많은 패키지 사본에 대한 시간 및 공간 요구 사항을 줄일 수 있습니다.

STEP1: Lerna 설치

간단하게 Lerna 설치를 통해 프로젝트의 생성과 버전 관리, 그리고 빌드에대해 알아보겠습니다.

먼저 npm 을 이용하여 글로벌에 Lerna 설 설치합니다.

$ npm install -g lerna


Lerna 설치에 성공했다면 Lerna로 관리되는 테스트 프로젝트를 하나 만들어 봅니다.

$ mkdir my-lerna-repo
$ cd my-lerna-repo
$ lerna init (or lerna init --independent)

lerna init 으로 프로젝트 생성시 고정모드, 독립모드 중 하나를 사용하여 프로젝트를 관리할 수 있다.

고정 모드 (기본값)

  • Lerna 프로젝트의 Package들이 모두 단일 버전 라인으로 작동합니다.
  • 버전은 프로젝트 루트의 lerna.json 에 version 으로 관리됩니다.
  • 최종 lerna publish 발행할 경우, 하위 Package의 모듈이 변경사항이 있을경우 전체 새 버전으로 업데이트 됩니다.

독립 모드 (independent)

  • Lerna 프로젝트의 각각의 Package들의 버전을 서로 독립적으로 관리할 수 있습니다.
  • 최종 lerna publish 발행할 경우, 각각 변경된 Package의 버전을 지정할 수 있습니다.

Lerna 프로젝트를 생성했다면 다음과 같은 파일과 폴더가 생성됩니다.

my-lerna-repo/
  - packages/
  - package.json
  - lerna.json

기본적인 npm package.json과 Lerna 설정을 할 수 있는 lerna.json, 그리고 여러 패키지를 관리할 수 있는 packages 폴더가 생성됩니다.

Lerna 프로젝트 설정 - lerna.json

lerna.json 파일의 기본적인 설정 정보를 아래와 같습니다.(처음 생성시의 설정 내용은 다를 수 있습니다.)

{
  "version": "0.0.1", (or independent)
  "npmClient": "npm",
  "command": {
    "publish": {
      "ignoreChanges": ["ignored-file", "*.md"],
      "message": "chore(release): publish",
      "registry": "https://npm.pkg.github.com"
    },
    "bootstrap": {
      "ignore": "component-*",
      "npmClientArgs": ["--no-package-lock"]
    }
  },
  "packages": ["packages/*"]
}

version

  • 고정모드 : 저장소의 현재 버전
  • 독립모드 : independent 로 표시됨

npmClient

  • 명령을 실행할 특정 클라이언트를 지정하는 옵션
  • 기본 : npm (yarn 으로 변경이 가능함)

command.publish (발행 옵션)

  • ignoreChanges
    • publish(발행) 버전의 변경에 영향을 주는 불필요한 파일들 (README.md 등) 을 설정하여 새 버전을 게시하지 못하게 처리하는 옵션
    • glob 배열 ( [“ignored-file”, “*.md”] )
  • message
  • registry
    • 발행된 프로젝트를 npmjs.org 또는 다른곳에서 게시 시에 URL 설정하는 옵션
    • 게시장소에 대한 인증이 필요할 수 있음 (https://npm.pkg.github.com or etc.. )

command.bootstrap (설치 옵션)

  • ignore
    • learn bootsrap 명령 실행할 때 실행되지 않을 항목을 설정하는 옵션
    • glob 배열 (component-* or [“component-*”] )
  • npmClientArgs
    • bootstrap 명령 중에 npm install 에 직접 인수로 전달 될 문자열(배열) 설정 옵션
    • glob 배열 ( [”–no-package-lock”] )
  • scope
    • lerna bootstrap 명령을 실행할 때 설치할 패키지를 제한하는 옵션

packages

  • 사용자 패키지들을 정의할 폴더 위치 설정 옵션
  • glob 배열 ( [“packages/*”] )
packages 설정은 lerna.init 시점에서 packaegs/* 로 설정됩니다.
하지만 다른 디렉토리를 사용할 수 있습니다.

보통 packages/* 는 모범 사례로 간주되지만 꼭 필요한 요구 사항은 아닙니다.
ex) ["module/*"] 또는 ["package1", "package2"]



설치 및 초기화가 성공적으로 완료되었다면 본격적으로 생성한 Lerna 프로젝트내에서 테스트 패키지를 생성하고 패키지를 관리하는 방법에 대해 알아보겠습니다.

STEP2: 패키지 생성 - Create package

$ lerna create <name>

Lerna create 명령어를 통해 손쉽게 lerna 에서 관리되는 package를 생성할 수 있습니다. 물론 create 명령어를 사용하지 않고 사용자가 직접 packages 폴더 내부에 자신의 프로젝트 package를 생성하여 시작할 수 있습니다.

그럼 my-package 란 이름의 패키지를 하나 생성해 봅시다.

$ lerna create my-package


명령어를 실행하면 Lerna 는 사용자가 생성한 신규 패키지의 package.json 을 생성하는 단계를 진행합니다.

lerna notice cli v3.22.0
lerna WARN ENOREMOTE No git remote found, skipping repository property

package name: (my-package)
version: (0.0.0)
description:
keywords:
homepage:
license: (ISC)
entry point: (lib/my-package.js)
git repository:
About to write to /my-lerna/packages/my-package/package.json:

{
  "name": "my-package",
  "version": "0.0.0",
  "description": "> TODO: description",
  "author": "user <user@email.com>",
  "homepage": "",
  "license": "ISC",
  "main": "lib/my-package.js",
  "directories": {
    "lib": "lib",
    "test": "__tests__"
  },
  "files": [
    "lib"
  ],
  "scripts": {
    "test": "echo \"Error: run tests from root\" && exit 1"
  }
}

Is this OK? (yes)


package.json 생성을 완료하면 packages 폴더내부에 사용자가 생성한 my-package 패키지가 생성됩니다.

├─ my-package/
│  ├─ __test__/
│  │  ├─ my-package.test.js
│  ├─ lib/
│  │  ├─ my-package.js
│  ├─ package.json
│  ├─ README.md

사용자는 lib > my-package.js 에서 패키지의 기능을 정의하거나 사용자 정의 폴더 및 파일로 패키지를 구성할 수 있습니다.

그럼 my-package.js 에 간단한 합계를 계산하는 함수를 정의해 봅시다.

// my-package.js
'use strict';

module.exports = sum;

function sum = (a, b) => a + b;

간단한 계산함수를 만들어 봤습니다. 이 함수는 나중에 npm 패키지가 설치된후 require/import 등을 통해 바로 사용이 가능하도록 packages.json에는 현재 생성함 패키지의 main이 lib/my-package.js 로 설정되어 있습니다.

사용자는 lerna create 를 이용한 패키지 생성하거나, 기존에 개발했던 또는 개발중이던 패키지를 packages 폴더 내부에서 다시 정의하고 각각의 패키지를 Lerna를 통해 관리할 수 있습니다.

패키지 생성이 완료되었다면 다음편에는 Lerna를 통한 devDependencies 관리를 할 수 있는 link convert와 로컬 패키지의 모든 종속성을 설치 및 상호 종속성을 연결하는 bootstrap에 대해서 알아보겠습니다.

Tags:

Categories:

Updated:

 

 

Leave a comment