我想嵌入隐藏文件,在 Go 中嵌入包。比如git信息。
例如
package main
import _ "embed"
var (
//go:embed .git/HEAD
head string
)
func main() {
print(head)
}
但是出现编译错误。
$ go build
main.go:6:13: pattern .git/HEAD: cannot embed file .git/HEAD: in invalid directory .git
我试过那些方法,但没有奏效。
究竟是什么意思files outside the package's module
?
这听起来不是关于go-modules。
为什么下面的文件可以,但不行.git/*
?
$ mkir .hidden && echo "hello world" > .hidden/hello.txt
$ tree -a
.
|-- .hidden
| `-- hello.txt <- is package's module ?
|-- go.mod
|-- go_embed_git_version
`-- main.go
.git/HEAD
和 和有什么不一样.hidden/hello.txt
?
该行为已明确记录:
模式不能匹配包模块之外的文件,例如
.git/*
或 符号链接。空目录的匹配被忽略。之后,//go:embed
一行中的每个模式必须至少匹配一个文件或非空目录。
将提交 ID 放入代码的更好方法是将其包含在go build
命令行中,例如此处所述。如果您的代码如下所示:
package main
import "fmt"
var (
head string = "development"
)
func main() {
fmt.Println(head)
}
你像这样构建你的二进制文件:
go build -ldflags "-X main.head=$(git rev-parse HEAD)"
然后运行您的代码将打印代码构建时的 HEAD 提交 ID。
在 a 中自动化此类事情是很常见的Makefile
,例如:
COMMITID = $(shell git rev-parse HEAD)
GOLDFLAGS = -X 'main.head=$(COMMITID)'
all: example
example: main.go
go build -ldflags "$(GOLDFLAGS)"
clean:
rm -f example
然后您只需键入make
以使用正确的命令行标志构建二进制文件。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句