Skip to content

O Bun suporta workspaces no package.json. Workspaces facilitam o desenvolvimento de software complexo como um monorepo consistindo de vários pacotes independentes.

É comum um monorepo ter a seguinte estrutura:

txt
<root>
├── README.md
├── bun.lock
├── package.json
├── tsconfig.json
└── packages
    ├── pkg-a
    │   ├── index.ts
    │   ├── package.json
    │   └── tsconfig.json
    ├── pkg-b
    │   ├── index.ts
    │   ├── package.json
    │   └── tsconfig.json
    └── pkg-c
        ├── index.ts
        ├── package.json
        └── tsconfig.json

No package.json raiz, a chave "workspaces" é usada para indicar quais subdiretórios devem ser considerados pacotes/workspaces dentro do monorepo. É convencional colocar todos os workspaces em um diretório chamado packages.

json
{
  "name": "my-project",
  "version": "1.0.0",
  "workspaces": ["packages/*"],
  "devDependencies": {
    "example-package-in-monorepo": "workspace:*"
  }
}

NOTE

**Suporte a glob** — O Bun suporta sintaxe glob completa em `"workspaces"`, incluindo padrões negativos (por exemplo `!**/excluded/**`). Veja [aqui](/pt/runtime/glob#supported-glob-patterns) para uma lista abrangente de sintaxe suportada.
json
{
  "name": "my-project",
  "version": "1.0.0",
  "workspaces": ["packages/**", "!packages/**/test/**", "!packages/**/template/**"]
}

Cada workspace tem seu próprio package.json. Ao referenciar outros pacotes no monorepo, semver ou protocolos de workspace (por exemplo workspace:*) podem ser usados como o campo de versão no seu package.json.

json
{
  "name": "pkg-a",
  "version": "1.0.0",
  "dependencies": {
    "pkg-b": "workspace:*"
  }
}

bun install instalará dependências para todos os workspaces no monorepo, deduplicando pacotes se possível. Se você quiser instalar dependências apenas para workspaces específicos, pode usar a flag --filter.

bash
# Instalar dependências para todos os workspaces começando com `pkg-` exceto `pkg-c`
bun install --filter "pkg-*" --filter "!pkg-c"

# Caminhos também podem ser usados. Isso é equivalente ao comando acima.
bun install --filter "./packages/pkg-*" --filter "!pkg-c" # ou --filter "!./packages/pkg-c"

Ao publicar, versões workspace: são substituídas pela versão do package.json do pacote,

"workspace:*" -> "1.0.1"
"workspace:^" -> "^1.0.1"
"workspace:~" -> "~1.0.1"

Definir uma versão específica tem precedência sobre a versão do package.json do pacote,

"workspace:1.0.2" -> "1.0.2" // Mesmo que a versão atual seja 1.0.1

Workspaces têm alguns benefícios principais.

  • O código pode ser dividido em partes lógicas. Se um pacote depende de outro, você pode simplesmente adicioná-lo como uma dependência no package.json. Se o pacote b depende de a, bun install instalará seu diretório local packages/a em node_modules em vez de baixá-lo do registro npm.
  • As dependências podem ser deduplicadas. Se a e b compartilham uma dependência comum, ela será hoisted para o diretório node_modules raiz. Isso reduz o uso redundante de disco e minimiza problemas de "inferno de dependências" associados a ter múltiplas versões de um pacote instaladas simultaneamente.
  • Executar scripts em múltiplos pacotes. Você pode usar a flag --filter para executar facilmente scripts package.json em múltiplos pacotes no seu workspace, ou --workspaces para executar scripts em todos os workspaces.

Compartilhar versões com Catálogos ​

Quando muitos pacotes precisam das mesmas versões de dependência, os catálogos permitem que você defina essas versões uma vez no package.json raiz e as referencie de seus workspaces usando o protocolo catalog:. Atualizar o catálogo atualiza automaticamente cada pacote que o referencia. Veja Catálogos para detalhes.

NOTE

⚡️ **Velocidade** — Instalações são rápidas, mesmo para grandes monorepos. O Bun instala o monorepo [Remix](https://github.com/remix-run/remix) em cerca de `500ms` no Linux.
  • 28x mais rápido que npm install
  • 12x mais rápido que yarn install (v1)
  • 8x mais rápido que pnpm install

Bun by www.bunjs.com.cn edit