使用Go模块组织程序包中的本地代码
main.go
当在之外使用Go模块(go版本> = 1.11)时,找不到在本地包中分解出某些代码的方法$GOPATH
。
我没有导入任何需要包含在内的外部依赖项go.mod
,我只是想在本地组织此Go模块的源代码。
文件main.go
:
package main// this import does not work
import "./stuff"
func main() {
stuff.PrintBaz()
}
该文件./stuff/bar.go
(假装为本地软件包):
package stuffimport "log"
type Bar struct {
Baz int
}
func PrintBaz() {
baz := Bar{42}
log.Printf("Bar struct: %v", baz)
}
文件go.mod
(命令go mod init foo
):
module foogo 1.12
执行时go run main.go
:
- 如果是我
import "./stuff"
,那么我明白了build command-line-arguments: cannot find module for path _/home/<PATH_TO>/fooprj/stuff
。 - 如果是我
import "stuff"
,那么我明白了build command-line-arguments: cannot load stuff: cannot find module providing package stuff
。 - 如果我
import stuff "./stuff"
使用软件包别名,那么我会再次看到:build command-line-arguments: cannot find module for path _/home/<PATH_TO>/fooprj/stuff
。
我找不到使本地软件包与go模块一起使用的方法。
- 上面的代码有什么问题?
- 如何在使用Go模块(文件
go.mod
)定义的项目中将本地包导入其他Go代码?
回答:
首先,您必须为项目选择一个名称并将其写入go.mod文件。该名称属于项目的根目录。您创建的每个新软件包都必须位于其自己的子目录中,并且其名称应与目录名称匹配。
go.mod:
module myprojectname
或(首选方式,请参见下面的答案以获取详细信息)
module github.com/myname/myproject
然后导入项目的包,例如:
import myprojectname/stuff
要么
import github.com/myname/myproject/stuff
软件包文件stuff
应位于项目stuff
目录中。您可以根据需要命名这些文件。
也可以创建更深的项目结构。例如,您决定将源代码文件与其他文件分开(例如应用程序配置,docker文件,静态文件等)。让我们将stuff
目录移到其中,里面的pkg
每个go文件pkg/stuff
仍然具有stuff
包名。要导入东西包,只需编写:
import myprojectname/pkg/stuff
没有什么可以阻止您在层次结构中创建更多级别github.com/myuser/myproject/pkg/db/provider/postgresql
,其中:
github.com/myuser/myproject
- 项目名称。postgresql
- 包裹名字。pkg/db/provider/postgresql
-相对于项目根目录的软件包路径。
您可以在此处阅读有关go模块的更多信息:https :
//github.com/golang/go/wiki/Modules
查看该存储库,以获取有关项目组织中使用的各种模式的有用信息:https : //github.com/golang-standards/project-
layout如果进入pkg
目录,您将发现哪些开源项目pkg
在其结构中使用目录。
以上是 使用Go模块组织程序包中的本地代码 的全部内容, 来源链接: utcz.com/qa/428388.html