Lerna - 의존성 설치 및 Hoist (2)

2 minute read

이번에는 Lerna 의 의존성 설치 및 Hoist 에 대해서 알아보도록 하겠습니다.

Lerna는 bootstrap 명령을 통해서 로컬 패키지의 모든 종속성 (all dependencies)을 설치하고 상호 종속성 (cross dependencies)을 연결할 수 있습니다.

Lerna Bootstrap

lerna bootstrap 이 실행되면 다음을 수행합니다.

  1. 각 패키지의 모든 외부 종속성을 npm install 로 설치
  2. 서로 의존하는 Lerna 패키지를 Symlink (심볼릭 링크) 처리
  3. 모든 bootstrapped 패키지에서 npm run prepublish 실행 (–ignore-prepublish 가 전달 되지 않는 한)
  4. 모든 bootstrapped 패키지에서 npm run prepare 실행

bootstrap 명령 중에 npm install 에 직접 인수로 전달 될 문자열을 터미널 실행 명령어 뒤에 {옵션} 으로 설정하여 npm 클라이언트에 전달하거나 lerna.json 파일에서 npmClientArgs 속성에 glob 배열형태로 설정할 수 있습니다.

lerna bootstrap -- --production --no-optional

또는

{
  ...
  "npmClient": "npm",
  "npmClientArgs": ["--production", "--no-optional"]
}

작동 원리

babel을 예로 작동원리를 설명하겠습니다.

babel-generator와 source-map은 babel-core의 종속성입니다. babel-core의 package.json은 아래 표시된 것처럼 두 패키지를 모두 종속성의 속성으로 나열합니다.

// babel-core package.json
{
  "name": "babel-core",
  ...
  "dependencies": {
    ...
    "babel-generator": "^6.9.0",
    ...
    "source-map": "^0.5.0"
  }
}

Lerna는 각 종속성이 Lerna 저장소의 일부인지 확인합니다.
위 예에서 babel-generator는 내부 종속성일 수 있지만 source-map은 항상 외부 종속성입니다.

babel-core의 package.json에 있는 babel-generator 버전은 package/babel-generator에 의해 충족되는 내부 종속성을 전달합니다. source-map은 정상적으로 npm install 되어 있습니다.

packages/babel-core/node-modules/babel-generator (패키지에서 Symlink 됨) / babel-generator 이것은 충첩 디렉토리 Import를 허용합니다.


STEP1: Bootstrap 의존성 설치하기

bootstrap option

Lerna bootstrap 기본 설치 또는 {options} 를 사용하여 설치할 수 있습니다.

기본 사용
$ lerna bootstrap

이 옵션은 기본적인 npm install 및 종속성을 설정합니다.

–hoist [glob]
$ lerna bootstrap --hoist

ROOT 에 glob 배열로 설정한 요소와 일치하는 외부 종속성들을 설치하여 모든 패키지에서 사용할 수 있다록 해줍니다.

이러한 종속성의 모든 바이너리는 종속 패키지 node_modules / .bin / 디렉토리 에 연결되므로 npm 스크립트에서 사용할 수 있습니다. 옵션에서 glob 을 설정하지 않은 경우 기본값으로 모든 것을 hoisting 합니다.

만약 패키지가 다른 버전의 외부 종속성에 종속되는 경우 가장 일반적으로 사용되는 버전이 hoisting 되고 경고가 표시됩니다.

–strict
$ lerna bootstrap --hoist --strict

호이스트와 함께 사용하면 버전 경고가 표시된 후 오류가 발생하고 bootstrap 이 중지된다. hoisting 않거나 버전 경고가 없으면 효과가 없습니다.

–nohoist [glob]
$ lerna bootstrap --hoist --nohoist=babel-* 
# babel-* 과 일치하는 종속성 hoisting 을 거부할 수 있다.

ROOT 에 glob 배열로 설정한 요소와 일치하는 외부 종속성을 설치하지 마십시오. 이는 특정 종속성에 대한 hoisting 을 거부하는데 사용할 수 있습니다.

–ignore
$ lerna bootstrap --ignore component-* 
# component-* 과 일치하는 요소의 설치를 거부할 수 있다.

leran.json 옵션에서 command.bootstrap.ignore 속성의 값으로 설정할 수도 있습니다. 단 터미널에서 직접 명령 실행할 경우 옵션보다 우선합니다.

// lerna.json
{
  "version": "0.0.0",
  "command": {
    "bootstrap": {
      "ignore": "component-*"
    }
  }
}
–nohoist [glob]
$ lerna bootstrap --force-local

bootstrap 명령이 일치하는 버전 범위에 관계없이 항상 로컬 종속성을 Symlink(심볼릭 링크) 처리합니다.



STEP2: Lerna DevDependencies 관리

Lerna 는 하위 패키지들의 종속성 (devDependencies) 모듈들은 ROOT 의 package.json 으로 끌어 올려 (hoisting) 정의할 수 있습니다.

$ lerna link convert

위의 명령을 실행하면 자동으로 packages/* 의 패키지들을 hoisting 되고, file: 지정자를 사용하여 연결됩니다.

hoisting 의 장점

  1. 모든 패키지는 동일한 버전의 devDependencies 모듈을 사용한다
  2. GreenKeeper 와 같은 자동화 도구를 통해 devDependencies 를 최신 상태로 유지할 수 있다
  3. devDependencies 모듈의 설치 시간이 단축된다
  4. 적은 스토리지를 사용할 수 있다

단, devDependencies npm 스크립트에서 사용되는 ‘binary’ 실행 파일들을 제공할때는 각 패키지에 직접 설치해야합니다.

lerna link convert 실행후 ROOT package.json 의 dependencies 및 devDependencies 는 아래처럼 정의됩니다.

{
  "name": "root",
  "private": true,
  "devDependencies": {
    "lerna": "^3.22.0",
    "jest": "^0.0.0" // 패키지내에서 공통으로 사용되는 개발종속성 모듈
  },
  "dependencies": {
    "package1": "file:packages/package1", // 패키지 모듈 1
    "package2": "file:packages/package2" // 패키지 모듈 2
  }
}



지금까지

  1. 1편 - Lerna 를 설치하고 새로운 프로젝트를 생성, 사용자의 신규 패키지 생성
  2. 2편 - 패키지의 의존성관리 및 hoisting

을 통해 기본적인 Lerna를 사용하는 방법에 대해 알아보았습니다. 다음편에는 본격적으로 버전관리 및 발행에 대해 소개하겠습니다.

Tags:

Categories:

Updated:

 

 

Leave a comment