| Crates.io | apicurio-cli |
| lib.rs | apicurio-cli |
| version | 0.1.5 |
| created_at | 2025-06-28 09:15:46.874805+00 |
| updated_at | 2025-06-29 04:15:40.0925+00 |
| description | A powerful CLI tool for managing schema artifacts from Apicurio Registry with lockfile-based dependency management |
| homepage | https://github.com/YassineElbouchaibi/apicurio-cli |
| repository | https://github.com/YassineElbouchaibi/apicurio-cli |
| max_upload_size | |
| id | 1729679 |
| size | 339,428 |
A powerful Rust-based command-line tool for managing schema artifacts from Apicurio Registry. The apicurio CLI provides dependency management for Protobuf, Avro, JSON Schema, and other schema artifacts with lockfile-based reproducible builds.
git clone https://github.com/YassineElbouchaibi/apicurio-cli.git
cd apicurio-cli
cargo build --release
cp target/release/apicurio /usr/local/bin/
cargo install apicurio-cli
git clone https://github.com/your-org/apicurio-cli.git
cd apicurio-cli
cargo build --release
cp target/release/apicurio /usr/local/bin/
cargo install apicurio-cli
Initialize a new project:
apicurio init
Add a dependency:
apicurio add my-registry/com.example/user-service@^1.0.0
Pull dependencies:
apicurio pull
Check status:
apicurio status
apicurioconfig.yaml)The main configuration file that defines registries, dependencies, and publishing configuration:
# Optional: path to external registries file
externalRegistriesFile: ${APICURIO_REGISTRIES_PATH:-}
# Registry definitions
registries:
- name: production
url: https://registry.example.com
auth:
type: bearer
tokenEnv: APICURIO_TOKEN
- name: staging
url: https://staging-registry.example.com
auth:
type: basic
username: admin
passwordEnv: STAGING_PASSWORD
# Dependencies to fetch
dependencies:
- name: user-service-protos
groupId: com.example.services
artifactId: user-service
version: ^1.2.0
registry: production
outputPath: protos/user-service.proto
- name: payment-schemas
groupId: com.example.schemas
artifactId: payment-events
version: ~2.1.0
registry: production
outputPath: schemas/payment.avsc
### Smart Dependency Resolution
Dependencies support smart resolution of `groupId` and `artifactId` from the `name` field:
```yaml
dependencies:
# Smart resolution from group/artifact format
- name: com.example/user-service # → groupId: com.example, artifactId: user-service
version: ^1.0.0
registry: production
outputPath: protos/user-service.proto
# Smart resolution with simple name
- name: payment-events # → groupId: default, artifactId: payment-events
version: ~2.1.0
registry: production
outputPath: schemas/payment.avsc
# Complex artifact names work too
- name: nprod/sp.frame.Frame # → groupId: nprod, artifactId: sp.frame.Frame
version: 4.3.1
registry: nprod-apicurio
outputPath: protos/sp/frame/frame.proto
# Explicit override of smart resolution
- name: custom-name # Name is just an alias
groupId: com.special.group # Explicit groupId overrides smart resolution
artifactId: actual-artifact # Explicit artifactId overrides smart resolution
version: ^1.0.0
registry: production
outputPath: protos/special.proto
Smart Resolution Rules:
name contains /: groupId = part before /, artifactId = part after /name is simple: groupId = "default", artifactId = entire namegroupId/artifactId fields override smart resolutionpublishes:
### Global Registries (`~/.config/apicurio/registries.yaml`)
Global registry definitions shared across projects:
```yaml
registries:
- name: company-registry
url: https://registry.company.com
auth:
type: bearer
tokenEnv: COMPANY_REGISTRY_TOKEN
apicuriolock.yaml)Auto-generated file containing exact resolved versions and checksums:
lockedDependencies:
- name: user-service-protos
registry: production
resolvedVersion: 1.2.3
downloadUrl: https://registry.example.com/apis/registry/v3/groups/com.example.services/artifacts/user-service/versions/1.2.3/content
sha256: a1b2c3d4e5f6...
outputPath: protos/user-service.proto
groupId: com.example.services
artifactId: user-service
versionSpec: ^1.2.0
lockfileVersion: 1
configHash: abc123...
generatedAt: "1735387200000000000"
| Command | Description |
|---|---|
init |
Initialize a new project with config and lock files |
pull |
Fetch dependencies according to lock file (or resolve if no lock exists) |
update |
Re-resolve semver ranges and update lock file |
lock |
Update lock file based on current config without downloading |
| Command | Description |
|---|---|
add <identifier> |
Add a new dependency (interactive if identifier incomplete) |
remove <identifier> |
Remove a dependency by identifier |
list |
List all configured dependencies and registries |
status |
Check for outdated dependencies |
| Command | Description |
|---|---|
registry add <name> <url> |
Add a registry to global config |
registry list |
List all configured registries |
registry remove <name> |
Remove a registry from global config |
| Command | Description |
|---|---|
publish [name] |
Publish artifacts to registries |
verify |
Verify downloaded files against lock file checksums |
doctor |
Validate configuration and connectivity |
| Command | Description |
|---|---|
completions <shell> |
Generate shell completion scripts |
# Initialize a new project
apicurio init
# Add a Protobuf dependency
apicurio add production/com.example/user-service@^1.0.0
# Pull dependencies
apicurio pull
# Check for updates
apicurio status
# Update to latest matching versions
apicurio update
# Add registries
apicurio registry add prod https://prod-registry.com
apicurio registry add dev https://dev-registry.com
# Add dependencies from different registries
apicurio add prod/com.example/users@^1.0.0
apicurio add dev/com.example/orders@^2.0.0
# Configure a publish target in apicurioconfig.yaml
cat >> apicurioconfig.yaml << EOF
publishes:
- name: com.example/my-api
inputPath: protos/my-api.proto
version: 1.0.0
registry: production
type: protobuf
description: "My API definition"
EOF
# Publish the artifact
apicurio publish com.example/my-api
# Set authentication tokens
export APICURIO_TOKEN="your-bearer-token"
export STAGING_PASSWORD="your-password"
# Override registries file location
export APICURIO_REGISTRIES_PATH="/custom/path/registries.yaml"
# Pull dependencies
apicurio pull
auth:
type: none
auth:
type: basic
username: admin
passwordEnv: REGISTRY_PASSWORD
auth:
type: token
tokenEnv: REGISTRY_TOKEN
auth:
type: bearer
tokenEnv: REGISTRY_BEARER_TOKEN
The CLI supports various artifact types with automatic content-type detection:
.proto) - application/x-protobuf.avsc) - application/json.json) - application/json.yaml, .json) - application/json.graphql, .gql) - application/graphql.xml) - application/xmlVersion specifications support standard semantic versioning:
1.2.3 - Exact version^1.2.0 - Compatible releases (>=1.2.0, <2.0.0)~1.2.0 - Reasonably close (>=1.2.0, <1.3.0)>=1.1.0, <1.4.0 - Range specificationgit clone https://github.com/YassineElbouchaibi/apicurio-cli.git
cd apicurio-cli
cargo build
# Run unit tests
cargo test
# Run with logging
RUST_LOG=debug cargo test
# Run specific test
cargo test lockfile_integration
# Using cargo-make for comprehensive testing
cargo make test
cargo make test-integration
cargo make ci
Start a local Apicurio Registry:
docker-compose -f docker-compose.dev.yml up -d
Build and test:
cargo build
./target/debug/apicurio --help
Run integration tests:
# Ensure local registry is running on localhost:8080
cargo test lockfile_integration
src/
├── main.rs # CLI entry point
├── commands/ # Command implementations
│ ├── mod.rs # Command routing
│ ├── init.rs # Project initialization
│ ├── pull.rs # Dependency fetching
│ ├── add.rs # Dependency addition
│ └── ...
├── config.rs # Configuration management
├── lockfile.rs # Lock file operations
├── registry.rs # Registry client
├── dependency.rs # Dependency resolution
└── identifier.rs # Identifier parsing
# Optional external registries file
externalRegistriesFile: string
# Registry definitions
registries:
- name: string # Required: unique registry name
url: string # Required: registry base URL
auth: # Optional: authentication config
type: none|basic|token|bearer # Required if auth present
username: string # Required for basic auth
passwordEnv: string # Required for basic auth
tokenEnv: string # Required for token/bearer auth
# Dependencies to fetch
dependencies:
- name: string # Required: local alias (can use group/artifact format)
groupId: string # Optional: artifact group (resolved from name if not provided)
artifactId: string # Optional: artifact ID (resolved from name if not provided)
version: string # Required: semver specification
registry: string # Required: registry name reference
outputPath: string # Required: local file path
# Smart Resolution Examples:
# name: "com.example/user-service" → groupId: "com.example", artifactId: "user-service"
# name: "user-service" → groupId: "default", artifactId: "user-service"
# name: "nprod/sp.frame.Frame" → groupId: "nprod", artifactId: "sp.frame.Frame"
# Reference resolution configuration
referenceResolution:
enabled: true # Enable automatic reference resolution
outputPattern: string # Pattern for transitive dependency paths
maxDepth: 5 # Maximum reference resolution depth
outputOverrides: # Explicit path mappings
"groupId/artifactId": "path/pattern"
"registry:groupId/artifactId": "path/pattern"
# Dependencies with per-dependency reference control
dependencies:
- name: string # Required: dependency identifier
groupId: string # Optional: defaults from name
artifactId: string # Optional: defaults from name
version: string # Required: semver specification
registry: string # Required: registry name
outputPath: string # Required: local file path
resolveReferences: boolean # Optional: override global reference resolution
# Publishing configuration
publishes:
- name: string # Required: publish identifier
inputPath: string # Required: source file path
version: string # Required: exact version
registry: string # Required: target registry
type: protobuf|avro|... # Optional: auto-detected from extension
groupId: string # Optional: defaults from name
artifactId: string # Optional: defaults from name
ifExists: FAIL|CREATE_VERSION|FIND_OR_CREATE_VERSION
description: string # Optional: artifact description
labels: # Optional: key-value labels
key: value
references: # Optional: artifact references
- name: string # Reference identifier
version: string # Exact version (no ranges)
nameAlias: string # Optional: import alias
1. Authentication failures:
# Check environment variables
echo $APICURIO_TOKEN
# Verify registry connectivity
apicurio doctor
2. Lock file conflicts:
# Regenerate lock file
rm apicuriolock.yaml
apicurio lock
3. Version resolution failures:
# Check available versions
apicurio status
# Update to latest compatible versions
apicurio update
4. Network connectivity:
# Test registry connectivity
curl -H "Authorization: Bearer $APICURIO_TOKEN" https://registry.example.com/apis/registry/v3/groups
# Enable debug logging
RUST_LOG=debug apicurio pull
# Trace network requests
RUST_LOG=reqwest=trace apicurio pull
git checkout -b feature-namecargo testcargo fmtcargo clippyLicensed under either of:
at your option.