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
- First run and Vision
- Concept: What is a Graft
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:
- Same module + same version can run on many Gateway nodes — consumers use one Graft package.
- Same version + changed public interface → registration fails (prevents silent contract drift).
- Changed public contract → you must increment the module version (assembly version, package version, etc.).
- 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
| Mistake | Fix |
|---|---|
| Interface change, same version, registration fails | Bump module version or use --noVersioning in dev only |
Using --noVersioning in production CI | Prefer explicit versioning for reproducible deploys |
| Expecting consumers to auto-update | Refresh/reinstall Graft after host version or hash change |