Go Application Versioning: Difference between revisions
Jump to navigation
Jump to search
Write a Dedicated
(Created page with "=Internal= * Go Engineering") |
|||
(6 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
=External= | |||
* https://www.digitalocean.com/community/tutorials/using-ldflags-to-set-version-information-for-go-applications | |||
=Internal= | =Internal= | ||
* [[Go_Engineering#Subjects|Go Engineering]] | * [[Go_Engineering#Subjects|Go Engineering]] | ||
=Overview= | |||
=Write an Authoritative Source of Version Information Script= | |||
The version information for a build should be generate in just one place. A shell script is probably the most versatile. Write a script that generate the version label at stdout and name it <code>${PROJECT_DIR}/scripts/get-version.sh</code>. | |||
=Pass the Version Information as a Linker Argument= | |||
<syntaxhighlight lang='make'> | |||
version = $(shell $(CURDIR)/scripts/get-version.sh) | |||
... | |||
build: ... | |||
@go build -ldflags="-X 'example.com/myapp/internal/version.Version=$(version)'" ... | |||
</syntaxhighlight> | |||
The <code>go build</code> command passes dynamically-generated version information to the linker. For more details, see: {{Internal|Go_build#-ldflags|<tt>go build -ldflags</tt>}} | |||
=Write a Dedicated <code>version</code> Package= | |||
The <code>version</code> will contain the <code>Version</code> variable whose value will be replaced at linking time with the actual build value: | |||
<syntaxhighlight lang='go'> | |||
package version | |||
var Version = "will be updated during linking" | |||
</syntaxhighlight> | |||
The use of a variable is mandatory. If declared as constant, the value won't be replaced during linking. | |||
<syntaxhighlight lang='go'> | |||
func displayVersion() { | |||
fmt.Printf("%v\n", version.Version) | |||
} | |||
</syntaxhighlight> |
Latest revision as of 23:36, 1 March 2024
External
Internal
Overview
Write an Authoritative Source of Version Information Script
The version information for a build should be generate in just one place. A shell script is probably the most versatile. Write a script that generate the version label at stdout and name it ${PROJECT_DIR}/scripts/get-version.sh
.
Pass the Version Information as a Linker Argument
version = $(shell $(CURDIR)/scripts/get-version.sh)
...
build: ...
@go build -ldflags="-X 'example.com/myapp/internal/version.Version=$(version)'" ...
The go build
command passes dynamically-generated version information to the linker. For more details, see:
Write a Dedicated version
Package
The version
will contain the Version
variable whose value will be replaced at linking time with the actual build value:
package version
var Version = "will be updated during linking"
The use of a variable is mandatory. If declared as constant, the value won't be replaced during linking.
func displayVersion() {
fmt.Printf("%v\n", version.Version)
}