--- Makefile ----
# This how we want to name the binary output
BINARY=gomake
# These are the values we want to pass for VERSION and BUILD
# git tag 1.0.1
# git commit -am "One more change after the tags"
VERSION=`git describe --tags`
BUILD=`date +%FT%T%z`
# Setup the -ldflags option for go build here, interpolate the variable values
LDFLAGS_f1=-ldflags "-w -s -X main.Version=${VERSION} -X main.Build=${BUILD} -X main.Entry=f1"
LDFLAGS_f2=-ldflags "-w -s -X main.Version=${VERSION} -X main.Build=${BUILD} -X main.Entry=f2"
# Builds the project
build:
go build ${LDFLAGS_f1} -o ${BINARY}_f1
go build ${LDFLAGS_f2} -o ${BINARY}_f2
# Installs our project: copies binaries
install:
go install ${LDFLAGS_f1}
# Cleans our project: deletes binaries
clean:
if [ -f ${BINARY} ] ; then rm ${BINARY} ; fi
.PHONY: clean install
字符串 make文件将创建两个可执行文件。一个是执行函数1,另一个将函数2作为主入口:
package main
import (
"fmt"
)
var (
Version string
Build string
Entry string
funcs = map[string]func() {
"f1":functionOne,"f2":functionTwo,
}
)
func functionOne() {
fmt.Println("This is function one")
}
func functionTwo() {
fmt.Println("This is function two")
}
func main() {
fmt.Println("Version: ", Version)
fmt.Println("Build Time: ", Build)
funcs[Entry]()
}
型 然后就跑:
make
型 您将获得:
mab@h2470988:~/projects/go/gomake/3/gomake$ ls -al
total 2020
drwxrwxr-x 3 mab mab 4096 Sep 7 22:41 .
drwxrwxr-x 3 mab mab 4096 Aug 16 10:00 ..
drwxrwxr-x 8 mab mab 4096 Aug 17 16:40 .git
-rwxrwxr-x 1 mab mab 1023488 Sep 7 22:41 gomake_f1
-rwxrwxr-x 1 mab mab 1023488 Sep 7 22:41 gomake_f2
-rw-rw-r-- 1 mab mab 399 Aug 16 10:21 main.go
-rw-rw-r-- 1 mab mab 810 Sep 7 22:41 Makefile
mab@h2470988:~/projects/go/gomake/3/gomake$ ./gomake_f1
Version: 1.0.1-1-gfb51187
Build Time: 2016-09-07T22:41:38+0200
This is function one
mab@h2470988:~/projects/go/gomake/3/gomake$ ./gomake_f2
Version: 1.0.1-1-gfb51187
Build Time: 2016-09-07T22:41:39+0200
This is function two
7条答案
按热度按时间wkyowqbh1#
Go语言链接器(go tool link)有一个选项来设置一个未初始化的字符串变量的值:
字符串
value。注意,在Go 1.5之前,这个选项需要两个单独的参数。现在它需要一个参数,在第一个=符号上分裂。
作为构建过程的一部分,您可以使用此设置版本字符串变量。您可以使用
-ldflags
通过go
工具传递此变量。例如,给定以下源文件:型
然后:
型
为了在构建时将
main.minversion
设置为构建日期和时间:型
如果编译时没有以这种方式初始化
main.minversion
,它将包含空字符串。egdjgwm82#
使用
ldflags
设置main
包中的变量:文件
main.go
:字符串
然后运行:
型
构建:
型
使用
ldflags
设置non-main
包中的变量:文件
config.go
:型
您还需要文件
main.go
:型
首先构建您的二进制文件:
型
查找您要设置的变量名的完整路径:
型
再次运行并构建二进制文件,但使用
ldflags
:型
灵感来自https://github.com/golang/go/wiki/GcToolchainTricks#including-build-information-in-the-executable
如果您使用的是
goreleaser
,请阅读https://goreleaser.com/cookbooks/using-main.version/?h=ldflag#using-the-mainversion-ldflag:默认情况下,GoReleaser设置三个ldflags:
main.version:当前Git标签
main.commit:当前git commit SHA
main.date:日期符合RFC 3339
如果你想看到这个动作:https://github.com/hoto/fuzzy-repo-finder/blob/master/pkg/config/config.go
h43kikqp3#
另外,我想发布一个如何使用git和makefile的小例子:
字符串
make文件将创建两个可执行文件。一个是执行函数1,另一个将函数2作为主入口:
型
然后就跑:
型
您将获得:
型
epggiuax4#
在构建我的混合命令行应用和库项目时,我在使用
-ldflags
参数时遇到了麻烦,所以我最终使用Makefile目标来生成包含应用版本和构建日期的Go源文件:字符串
在我的
init()
方法中,我这样做:型
如果你想要一个自动递增的版本号而不是版本日期,那么你可能需要创建一个包含最后一个版本号的本地文件,Makefile会将文件内容读入一个变量,递增它,将它插入
version.go
文件而不是日期,然后将新的版本号写回文件。vulvrdjw5#
在Windows操作系统上,给出以下程序
字符串
您可以使用
型
日期格式假定您的环境
echo %date%
为Fri 07/22/2016
,echo %time%
为16:21:52.88
然后输出将是:
version=0.0.1, date=2016-07-22T16:21:52
tquggr8v6#
使用multi
-ldflags
:字符串
eqqqjvef7#
在其他答案的基础上,在最近的go版本中,也可以为ELF部分编写一个buildid-尽管这在程序中并不容易阅读。
我向两者写入相同的值,使用如下内容:
字符串
我用
mage
,一个用go编写的构建工具来使用它,你不需要上面额外的标志,但是我选择了那些标志来从发布的二进制文件中剥离尽可能多的信息。(off主题: Mage 比Make之类的东西需要更多的前期工作,但比基于make的构建系统更容易扩展/维护-而且你不必在go和其他语法之间切换思维齿轮。)