Skip to main content

Rust-specific extras

Features anodizer adds because Rust's toolchain and packaging conventions differ from Go's. No GoReleaser equivalent.

Rust-specific extras

These features exist because Rust's toolchain and packaging conventions differ from Go's. They are dogfooded by anodizer and cfgd themselves.

Live configuration

Excerpt from cfgd/.anodizer.yaml (snapshot 2026-05-24) — every feature in the table below is wired here.

# Tag bumper — requires an explicit signal per commit range
# (Conventional Commits or `#major`/`#minor`/`#patch` tokens).
tag:
  default_bump: none
  branch_history: full
  tag_prefix: "v"
  release_branches: [master]
  initial_version: "0.3.5"

# UPX target-triple globs — Rust triples, not Go GOOS/GOARCH.
upx:
  - id: default
    enabled: true
    args: ["--best", "--lzma"]
    targets:
      - x86_64-unknown-linux-gnu
      - aarch64-unknown-linux-gnu
      - x86_64-apple-darwin
      - x86_64-pc-windows-msvc

# Workspaces — independent release cadences per crate.
workspaces:
  - name: cfgd-core                 # shared library, crates.io only
    skip: [announce]
    crates:
      - name: cfgd-core
        path: crates/cfgd-core
        tag_template: "core-v{{ Version }}"
        version_sync: { enabled: true, mode: cargo }
        # publish.cargo inherited from defaults (index_timeout: 600)

  - name: cfgd                      # cross-platform CLI
    crates:
      - name: cfgd
        path: crates/cfgd
        tag_template: "v{{ Version }}"
        depends_on: [cfgd-core]     # dependency-aware publish ordering
        version_sync: { enabled: true, mode: cargo }
        universal_binaries:
          - { name_template: "{{ ProjectName }}", replace: false }
        binstall:
          enabled: true   # pkg_url + per-target overrides derived from archive.name_template
  # ... cfgd-operator, cfgd-csi follow the same shape
FeatureStatusNotes
crates.io publish✅ VerifiedDependency-aware ordering. anodizer on crates.io · cfgd on crates.io. cfgd publishes 4 crates in dependency order on every release
binstall metadata✅ Verifiedcfgd .anodizer.yaml (binstall.enabled: truepkg-url + per-target overrides auto-derived from archive.name_template, no hand-written URL)
cargo_workspace detection✅ Verifiedcfgd .anodizer.yaml (4 workspaces: entries)
version_sync✅ Verifiedcfgd .anodizer.yaml (version_sync.enabled: true + mode: cargo per crate)
tag_pre_hooks✅ Verifiedcrates/core/src/config/tag.rs (tag_pre_hooks field)
tag_post_hooks✅ Verifiedcrates/core/src/config/tag.rs (tag_post_hooks field)
ANODIZER_SPLIT_TARGET✅ Verifiedcrates/core/src/partial.rs (ANODIZER_OS / ANODIZER_ARCH env vars; accepts GGOOS/GGOARCH aliases)
UPX target-triple globs✅ Verifiedcfgd .anodizer.yaml (upx.targets: Rust target triples like x86_64-unknown-linux-gnu)
anodizer targets --json✅ Verifiedcrates/cli/src/commands/targets.rs (consumed by anodizer-action matrix input)
anodizer resolve-tag✅ Verifiedcfgd release.yml (resolve-workspace: 'true' step)
Dual-license SPDX rendering (MIT OR Apache-2.0)✅ Verifiedanodizer Cargo.toml (license = "MIT OR Apache-2.0") is parsed once and rendered per publisher: Homebrew license any_of:, AUR license=('MIT' 'Apache-2.0'), Nix with lib.licenses; [ mit asl20 ], Chocolatey SPDX-aware licenseUrl. The live npm metapackage anodizer carries the compound license: "MIT OR Apache-2.0" (npm view anodizer license). See crates/core/src/license.rs
version_files[] (tag-time rewrite)✅ Verified (tests)crates/core/src/version_files.rs (rewrite_version_in_files — word-boundary rewrite of bare + v-prefixed version, committed atomically with the Cargo.toml/Cargo.lock bump). Neither dogfood project enrolls files yet
anodizer changelog command✅ Verifiedcfgd v0.4.0 release body (rendered Keep-a-Changelog groups). Formats: keep-a-changelog (alias kac), release-notes, json; --write updates CHANGELOG.md. See crates/cli/src/commands/changelog.rs
Generated crate READMEs✅ Verifiedanodizer crates/xtask/src/validate_readme.rs (template-driven READMEs kept in sync, validated in CI)
npms[] per-package auth (auto/token/oidc)✅ VerifiedThe live anodizer metapackage (npm view anodizer optionalDependencies) declares all 8 per-platform optionalDependencies (@tj-smith47/anodizer-{darwin,linux,win32}-*), each published with provenance. auth: auto probes package existence to pick OIDC Trusted Publishing vs token per package. See crates/stage-publish/src/npm/publish.rs (decide_auth)