如何在 Go 中嵌入隐藏文件?

套管

我想嵌入隐藏文件,在 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章