Workspaces
Since version 0.12, buffrs supports workspaces for managing multiple related packages in a single repository.
What is a Workspace?
A workspace is a collection of buffrs packages that share a common root directory. This is useful when maintaining multiple API versions, splitting functionality across packages, or managing shared libraries alongside consuming packages.
Creating a Workspace
To create a workspace, add a [workspace] section to your root Proto.toml:
edition = "0.12"
[workspace]
members = [
"packages/common",
"packages/api-one",
"packages/api-two",
]
Each member is a separate buffrs package with its own Proto.toml manifest. The workspace root Proto.toml should not contain a [package] section - it only defines the workspace structure.
Directory Structure
A typical workspace structure:
my-workspace/
├── Proto.toml # Workspace root manifest
└── packages/
├── common/
│ ├── Proto.toml # Package manifest
│ └── proto/
│ └── common.proto
├── api-one/
│ ├── Proto.toml
│ └── proto/
│ └── api.proto
└── api-two/
├── Proto.toml
└── proto/
└── api.proto
Workspace Commands
Installing Dependencies
From the workspace root:
buffrs install
This installs dependencies for all workspace members, handling inter-workspace dependencies automatically.
Publishing
From the workspace root:
buffrs publish --registry http://... --repository my-repo
Buffrs automatically:
- Resolves dependencies across all workspace members
- Publishes packages in topological order (dependencies first)
- Handles local dependencies within the workspace
- Ensures each package is published only once, even if multiple members depend on it
Uninstalling
From the workspace root:
buffrs uninstall
Clears vendor directories for all workspace members.
Inter-workspace Dependencies
Workspace members can depend on each other using local path references:
# packages/api-two/Proto.toml
edition = "0.12"
[package]
type = "api"
name = "my-api-two"
version = "2.0.0"
[dependencies]
"my-common" = { path = "../common" }
When publishing the workspace, buffrs automatically publishes my-common first, then publishes my-api-two with the dependency reference updated to point to the registry.
Package-only Commands
Some commands are designed for package-level operations and cannot run from a workspace root:
buffrs addbuffrs removebuffrs packagebuffrs lintbuffrs list
These commands will provide a clear error message directing you to run them from a package directory within the workspace.
Benefits
Workspaces provide:
- Single-command publishing: No need to manually navigate directories or worry about dependency order
- Automatic deduplication: Shared dependencies are published once
- Development efficiency: Develop and test changes across multiple packages simultaneously
- Monorepo support: Natural fit for monorepo setups with multiple API packages