Module versioning and noVersioning

When to use this

You need to know whether to increment your module version when the public interface changes, or use --noVersioning during rapid development.

Prerequisites


Default versioning behavior

When GG runs in project-bound mode (with a Project Key), each exposed module is registered in a virtual feed for that project.

Rules:

  1. Same module + same version can run on many Gateway nodes — consumers use one Graft package.
  2. Same version + changed public interface → registration fails (prevents silent contract drift).
  3. Changed public contract → you must increment the module version (assembly version, package version, etc.).
  4. Consumers refresh Grafts like normal packages when you publish a new version.

This matches how NuGet, npm, and other package managers expect immutability per version.


When to bump version

Bump your module version when you:

  • Add, remove, or rename public methods
  • Change method signatures (parameters, return types)
  • Expose new public types that appear in the Graft interface

You do not need to bump version for private/internal changes that do not affect the public surface analyzed into the UGM.


--noVersioning mode

Use --noVersioning when you intentionally do not want version-based identity — for example local development without maintaining semver on every build.

./gg ./MyLib.dll --noVersioning --port 8888 --httpPort 8889

What happens:

  • GG generates a hash (noVersioningHash) at startup
  • The hash is appended to module identity in the Unified Graft Model
  • Re-registering the same logical module gets a new identity when the hash or interface changes

Trade-offs:

  • Simpler local iteration without bumping assembly version
  • Less predictable for production CI/CD that expects semver
  • Consumers may need to refresh Grafts when the hash changes

Examples

# Production: use normal module versioning (default)
./gg ./MyLib.dll --projectKey "$GC_PROJECT_KEY" --port 8888

# Development: skip semver, use hash identity
./gg ./MyLib.dll --noVersioning --port 8888 --httpPort 8889

Verify it works

  • With default versioning: change a public method without bumping version → GG reports registration conflict
  • With --noVersioning: module registers using hash suffix; check Vision for updated install identity

Common mistakes

MistakeFix
Interface change, same version, registration failsBump module version or use --noVersioning in dev only
Using --noVersioning in production CIPrefer explicit versioning for reproducible deploys
Expecting consumers to auto-updateRefresh/reinstall Graft after host version or hash change

See also