在没有主文件的情况下构建 Go 模块

Building Go module without main file

我有一个包含一些共享代码的小模块。该模块如下所示:

Shared
├── go.mod
├── go.sum
├── logging
│   └── logger.go
└── db-utils
    ├── db.go

如果我尝试从目录内部构建共享模块,我会收到一个错误,指出此模块下没有可用的 go 文件。

bash-3.2$ go build .
no Go files in /Users/xxxx/go/src/Shared

有没有办法构建一个只包含包而没有 main.go 文件的 Go 模块?这里的动机是在其他无法访问 internet 或私有 repo 的 go 模块中使用这些包来检索包。

Is there a way to build a go module that only has packages inside and doesn't have a main.go file?

没有。构建过程的输入是一个包,而不是一个模块。请注意 CLI documentation of go build.

中的 [packages]

当构建一个包导致编译多个包时,这仅仅是来自 .go- 位于您正在构建的包中的文件的直接和间接导入语句的结果。

请注意,Go 不支持将包编译为二进制文件以分发闭源库等。不过,情况并非总是如此。请参阅 #28152 and Binary-Only packages. The closest which exists to supporting that are plugins,但它们仍在进行中,需要在运行时解析符号。

go 命令将下载的模块存储在 module cache as source code, not compiled object files. go build rebuilds the object files on demand and stores them in a separate build cache.

如果你想分发一个非public模块与其他模块一起使用,你有几个选择:

  1. 您可以将模块发布到私有存储库——通常使用存储在 .netrc 文件中的凭据进行访问——并使用 GOPRIVATE 环境变量告诉 go 命令不要尝试从 public 代理和校验和服务器获取它。

  2. 您可以提供一个包含源代码的私有GOPROXY服务器或目录,并使用GOPROXY环境变量来指示go命令使用那个代理。

  3. 您可以将源代码发布为目录树,并使用消费者 go.mod 文件中的 replace directive 将其插入模块图中。

如果您只需要在loggingdb-utils目录中构建文件,那么您可以从根目录Shared执行以下命令:

go build <INSERT_MODULE_NAME_FROM_GO_MOD>/logging
go build <INSERT_MODULE_NAME_FROM_GO_MOD>/db-utils

如果其中一个文件依赖于另一个目录中的文件,我不确定这些命令是否有效。

可能会构建整个项目的另一个命令是:

go build ./...