콘텐츠로 이동

Monorepo

pubm은 모노레포를 예외가 아니라 핵심 사용 사례로 다룹니다. 패키지를 발견하고, 의존 순서를 이해하며, 같은 저장소 안의 JavaScript, Rust, Deno 워크스페이스를 함께 릴리스할 수 있습니다.

  • pnpm-workspace.yaml
  • [workspace]가 있는 Cargo.toml
  • workspace 필드가 있는 deno.json, deno.jsonc
  • workspaces 필드가 있는 package.json
  • package.json workspaces와 함께 있는 bunfig.toml

감지 후에는 의존 그래프를 만들어 publish 순서를 계산합니다.

자동 탐지는 다음 경우에 잘 맞습니다.

  • 모든 워크스페이스 패키지가 publish 대상일 때
  • 생태계를 섞더라도 선택적 배포 규칙이 단순할 때

다음 경우에는 packages를 명시하세요.

  • 일부 패키지만 배포할 때
  • Rust와 JS가 섞여 있을 때
  • 추론된 레지스트리를 재정의하거나 프라이빗 레지스트리를 추가할 때
  • 문서와 릴리스 파이프라인을 더 명시적으로 유지하고 싶을 때

pubm은 의존성이 있는 패키지를 topological order로 배포합니다.

이 순서가 중요한 이유:

  • npm, jsr 소비자가 새 의존 버전을 바로 받을 수 있음
  • crates.io는 crate 의존 순서를 지켜야 함
  • 부분 실패 시 원인 추적과 롤백이 쉬움

순환 의존이 있으면 추측하지 않고 실패합니다.

export default defineConfig({
versioning: "independent",
});
  • 각 패키지가 서로 다른 버전을 가질 수 있음
  • 패키지별 태그 생성
  • changeset에 명시된 패키지만 직접 영향
export default defineConfig({
versioning: "fixed",
});
  • 함께 릴리스되는 패키지가 하나의 버전 공유
  • 저장소는 v1.8.0 같은 단일 태그 사용
export default defineConfig({
versioning: "independent",
fixed: [["@acme/core", "@acme/react", "@acme/vue"]],
linked: [["@acme/cli", "@acme/config"]],
});

모노레포의 전형적 릴리스 흐름

섹션 제목: “모노레포의 전형적 릴리스 흐름”
Terminal window
pubm init --changesets
pubm changesets add
pubm

모노레포에서 중요한 것은 명령 수보다도, pubm이 pending changeset과 패키지 그룹, 의존 순서를 합쳐 최종 릴리스 계획을 계산한다는 점입니다.

패키지 정보는 커밋 메시지나 PR 제목이 아니라 changeset 파일에 기록해야 합니다.

pubm changesets add는:

  • 사용 가능한 패키지 탐지
  • 하나 이상 선택
  • 각 패키지 bump 타입 지정
  • 릴리스 요약 기록

일반 pubm 릴리스 파이프라인은 이후 버전 단계에서 pending changeset을 소비합니다.

각 패키지의 레지스트리는 매니페스트 파일에서 추론됩니다. package.jsonjsr.json이 모두 있으면 npmjsr로 해석됩니다. deno.json 또는 deno.jsoncjsr로 해석됩니다. Cargo.tomlcrates로 해석됩니다. registries는 재정의 또는 확장이 필요할 때만 사용하세요.

태그 형식은 최종 버전 계획에 따라 달라집니다.

v1.4.0
@acme/core@1.4.0
@acme/react@1.2.0

independent 모드에서는 기본적으로 모든 패키지가 개별 git 태그와 GitHub Release 초안을 가집니다. excludeRelease를 사용하면 특정 패키지는 버전을 올리고 배포는 하되 태그와 릴리스 생성에서만 제외할 수 있습니다.

export default defineConfig({
versioning: "independent",
excludeRelease: ["packages/cli/platforms/*"],
packages: [
{ path: "packages/core" },
{ path: "packages/cli" },
{ path: "packages/cli/platforms/*" },
],
});

excludeRelease에 매칭된 패키지는 버전 범프와 레지스트리 배포는 정상 진행되며, git 태그 생성과 GitHub Release 초안 작성만 건너뜁니다.

  • Changesets에서 버전 의사결정 기록 방식을 확인하세요.
  • Configuration에서 패키지 단위 설정과 그룹 옵션을 확인하세요.