构建没有主文件的 Go 模块



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

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 模块?这里的动机是在无法访问互联网或私有存储库的其他 go 模块中使用这些包来检索包。

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

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

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

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

go build ./...

go命令将下载的模块作为源代码存储在模块缓存中,而不是编译的目标文件中。go build按需重新生成对象文件,并将其存储在单独的生成缓存中。

如果要分发非公共模块以与其他模块一起使用,则有以下几种选择:

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

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

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

有没有办法构建一个内部只有包而没有 main.go 文件的 go 模块?

不。生成过程的输入是包,而不是模块。请注意它在 go build 的 CLI 文档中是如何说[packages]的。

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

请注意,Go 不支持将包编译为二进制文件以分发闭源库等。然而,情况并非总是如此。请参阅 #28152 和仅二进制包。最接近支持插件的是插件,但它们正在进行中,需要在运行时解析符号。

最新更新