Build/Build

Migration Lerna into Nx

iam102 2023. 11. 18. 00:00

Lerna의 Gibhub 이슈에 따르면 더 이상 유지보수가 안될 것으로 판단이 되어 팀 내에서 Monorepo 구축을 위해 다른 라이브러리를 도입하기로 결정했습니다. 현재 운영 중인 application들에 공유하여 사용되는 모듈이 많이 있어 Lerna로 Monorepo가 구축된 상황이었는데 Lerna의 해당 이슈를 통해 Nx를 도입하기로 결정되었습니다.

 

Migration

22년 5월부터는 Lerna가 Nx의 개발사인 Nrwl에서 관리를 하다 보니 Nx의 공식문서에서 Lerna에서 Nx로 통합하는 부분에 대한 설명이 잘되어있습니다. Lerna와 Nx를 같이 쓸 수도 있지만 Lerna를 걷어내고 Nx를 사용하기로 결정했습니다. 기존에 yarn workspaces가 적용된 package라서 lerna.json을 nx.json으로만 migration을 적용했습니다.

 

Lerna로 구성한 경우 lerna.json

// lerna.json
{
  "version": "1.0.0",
  "npmClient": "yarn",
  "useWorkspaces": true,
  "packages": ["packages/*"]
}

 

따로 Nx로 구축된 package가 아닌 이미 구축된 Monorepo 환경에서 도입이기 때문에 따로 nx.json을 만들어 줍니다.

// nx.json
{
  "extends": "nx/presets/npm.json",
  "$schema": "./node_modules/nx/schemas/nx-schema.json",
  "tasksRunnerOptions": {
    "default": {
      "runner": "nx/tasks-runners/default"
    }
  }
}

 

lerna command로 구성된 스크립트 command도 migration을 적용시키겠습니다.

  ...
  "scripts": {
    "build": "lerna run build",
    // => nx run <target package> [options]
    "build": "nx run mypackage:build"
    // 여러개의 패키지를 run 하는 경우
    // => nx run-many --projects=<target package1>,<target package2> --target=<task>
    "build": "nx run-many --projects=mypackage1,mypackage2 --target=build",
    
    "bootstrap": "lerna bootstrap",
    // => Nx에서는 종속성 관리를 처리 하지 않기 때문에 해당 command는 없습니다.
    
    "clean": "lerna clean",
    // => Nx에서 clean command는 따로 없습니다. rimraf 대체 하였습니다.
    "clean": "npx --location=project rimraf ./**/node_modules",
  },
  ...

추가로 Nx command는 Nx 공식 문서에 확인할 수 있습니다.

 

후기

Lerna에서 Nx로 migration 하는 건 크게 어려운 점은 없었지만 Lerna에서 제공하는 다양한 기능의 command를 대체하는 방법을 찾아야 했습니다. 추가로 Lerna와 Nx의 빌드 성능 차이, Nx Cloud 도입을 통한 빌드 성능 상승 여부를 체크할 계획입니다. 현재는 migration을 위해 Nx로 대체하는 수준이지만 좀 더 Nx의 활용 방안에 대해 찾아봐야 되겠습니다.

 


참고 자료

https://nx.dev/getting-started/intro

https://blog.nrwl.io/lerna-is-dead-long-live-lerna-61259f97dbd9