일반적인 방법으로 배포하기가 어려운 모노레포 프로젝트를 Now를 이용해서 배포를 하는 방법을 알아보자.

문제점

사이드 프로젝트를 모노레포로 구성해서 진행하고 있다. 전반적으로 만족스러운데, CI/CD 환경을 구성하는 것이 생각보다 까다로운 것 같다. 배포 또한 마찬가지인데, CRA를 사용하여 패키지를 추가했다 하더라도 다른 로컬 패키지와의 의존이 있는 경우 CI/CD 환경에서 이를 해결할 수 있어야 한다.

나의 경우 pnpm을 패키지 매니저로 선택했는데, ZEIT Now로 배포하려고 하니 Now 자체적으로 pnpm을 지원하지 않는 문제가 있다. 모노레포의 편의성을 그대로 유지한 채로 어떻게 하면 Now로 배포할 수 있을까?

Now 설정

기본적으로 Now 내에서 빌드 후 결과물을 사용하는 방식이기 때문에, 로컬에서 빌드한 결과물을 사용하여 배포하면 패키지 매니저와 상관 없이, 프로젝트 구조와 상관 없이 배포를 할 수 있다.

프로젝트 루트 폴더에 now.json 파일을 만들고 아래와 같이 내용을 작성한다. 아래 내용은 현재 내 프로젝트를 기준으로 작성되었기 때문에 적절히 참고하길 바란다.

{
  "version": 2,
  "builds": [
    {
      "src": "packages/app/build/**",
      "use": "@now/static"
    }
  ],
  "routes": [
    {
      "src": "/(.*)",
      "dest": "/packages/app/build/$1"
    }
  ]
}

배포

이제 프로젝트 위치에서 now를 입력하면 배포가 된다.

now
Now CLI 17.1.1
🔍  Inspect: https://zeit.co/iamchanii/canifish/6bl0socw5 [2s]
✅  Preview: https://canifish.iamchanii.now.sh [copied to clipboard] [4s]
📝  To deploy to production (canifish.now.sh), run `now --prod`
📝  Project settings are not applied because `builds` are used.

문제를 해결하기 위해 다른 패키지를 npm에 배포하는 방식으로 접근했는데, 더욱 간단하고 모노레포의 방식을 해치지 않는 배포 방법을 찾게 되어 너무 만족스럽다!