Lerna - 의존성 설치 및 Hoist (2)
이번에는 Lerna 의 의존성 설치 및 Hoist 에 대해서 알아보도록 하겠습니다.
Lerna는 bootstrap 명령을 통해서 로컬 패키지의 모든 종속성 (all dependencies)을 설치하고 상호 종속성 (cross dependencies)을 연결할 수 있습니다.
Lerna Bootstrap
lerna bootstrap 이 실행되면 다음을 수행합니다.
- 각 패키지의 모든 외부 종속성을 npm install 로 설치
- 서로 의존하는 Lerna 패키지를 Symlink (심볼릭 링크) 처리
- 모든 bootstrapped 패키지에서 npm run prepublish 실행 (–ignore-prepublish 가 전달 되지 않는 한)
- 모든 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 의 장점
- 모든 패키지는 동일한 버전의 devDependencies 모듈을 사용한다
- GreenKeeper 와 같은 자동화 도구를 통해 devDependencies 를 최신 상태로 유지할 수 있다
- devDependencies 모듈의 설치 시간이 단축된다
- 적은 스토리지를 사용할 수 있다
단, 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편 - Lerna 를 설치하고 새로운 프로젝트를 생성, 사용자의 신규 패키지 생성
- 2편 - 패키지의 의존성관리 및 hoisting
을 통해 기본적인 Lerna를 사용하는 방법에 대해 알아보았습니다. 다음편에는 본격적으로 버전관리 및 발행에 대해 소개하겠습니다.
Leave a comment