Sử dụng ldflags
để đặt biến trong main
gói:
Với tập tin main.go
:
package main
import "fmt"
var (
version string
build string
)
func main() {
fmt.Println("version=", version)
fmt.Println("build=", build)
}
Sau đó chạy:
go run \
-ldflags "-X main.version=1.0.0 -X main.build=12082019" \
main.go
Xây dựng:
go build -o mybinary \
-ldflags "-X main.version=1.0.0 -X 'main.build=$(date)'" \
main.go
Sử dụng ldflags
để đặt biến trong non-main
gói:
Với tập tin config.go
:
package config
import "fmt"
var (
Version string
)
func LogVersion() {
fmt.Println("version=", Version)
}
Bạn cũng sẽ cần tập tin main.go
:
package main
import (
"fmt"
"github.com/user/repo/config"
}
func main() {
config.LogVersion()
}
Xây dựng nhị phân của bạn đầu tiên:
go build -o mybinary main.go
Tìm đường dẫn đầy đủ của tên biến bạn muốn đặt:
go tool nm <path_to_binary> | grep Version
Chạy và xây dựng nhị phân một lần nữa nhưng với ldflags
:
go run \
-ldflags "-X github.com/user/repo/config.Version=1.0.0" \
main.go --version
go build -o mybinary \
-ldflags "-X github.com/user/repo/config.Version=1.0.0" \
main.go
Lấy cảm hứng từ https://github.com/golang/go/wiki/GcToolchainTricks#including-build-inif-in-the-executable
Ngoài ra nếu bạn đang sử dụng goreleaser
thì hãy đọc https://goreleaser.com/#USE-the-main-version :
GoReleaser mặc định đặt ba ldflags:
main.version: Thẻ Git hiện tại
main.commit: Cam kết git hiện tại SHA
main.date: Ngày theo RFC3339
Nếu bạn muốn thấy điều này trong hành động: https://github.com/hoto/fuzzy-repo-finder/blob/master/pkg/config/config.go
go bouild
thay vìgo run
?