August 14, 20262 minutes
The OCM Go bindings have moved from 30+ independently versioned Go modules to a
single module at ocm.software/open-component-model/bindings/go.
This change does not dilute our current modularity or dependency footprint. If you have questions or concerns about this change please get in touch.
In this post we’ll explain what changed, why, and what it means for consumers and contributors.
Each binding package (runtime, oci, descriptor/v2, helm, …) was its own
Go module with its own go.mod and version tag. A change in runtime required
releasing it, then bumping go.mod in every dependent module, layer by layer,
multiple levels deep.
This created friction in three ways:
All per-binding go.mod files are replaced by a single go.mod at
bindings/go/. The import path is unchanged for consumers:
import "ocm.software/open-component-model/bindings/go/oci"The only difference in your go.mod is the require line:
-require ocm.software/open-component-model/bindings/go/oci v0.0.49
+require ocm.software/open-component-model/bindings/go v0.0.2
descriptor/v2 still gets
the same minimal set of transitive dependencies.depguard rules enforce the same modularity that the
separate go.mod files used to enforce structurally.go test ./... from bindings/go/ tests all bindings together, no go.work
needed.bindings/go/v0.0.x) covers the whole library.After the first monolithic release, update your go.mod:
ocm.software/open-component-model/bindings/go/*go get ocm.software/open-component-model/bindings/go@v0.0.2go mod tidyWhile previously released per-module versions remain available, we discourage continuing to use them, as new features and fixes will only be published under the monolithic version.
This decision is documented in ADR 25: Bindings CI and Release Strategy.