我试图了解如何使用go1.11模块来组织我的golang项目。我尝试了几种选择,但没有一个起作用。
我在主程序包和应用程序文件夹中有一些代码,以及主程序包使用的本地程序包。
$GOPATH
+ src
+ application/
+ main/
+ main.go
+ otherFileUnderMainPackage.go
+ aLocalPackage/
+ someCode.go
+ someCode_test.go
+ someMoreCode.go
+ someMoreCode_test.go
主包中的文件导入../aLocalPackage
。当我用go build main/*.go
进行编译时,它可以正常工作。
然后,我运行go mod init application:V.0.9.9
并获得了go.mod文件,但是构建始终失败。我总是会遇到找不到本地软件包build application:V0.9.9/main: cannot find module for path _/.../src/application/aLocalPackage
的错误。我还尝试将本地包放在src /下,放在main /等下,但是这些方法都不适合我。
使用模块和本地软件包的方式是什么?
谢谢。
答案 0 :(得分:1)
我写了一篇博客文章,介绍如何使用模块启动您的第一个Go项目。
https://marcofranssen.nl/start-on-your-first-golang-project/
通常,它可以简化为仅在系统上的某个位置创建一个新文件夹(不必位于GOPATH中)。
mkdir my-project
cd my-project
go mod init github.com/you-user/my-project
这将创建go.mod文件。现在,您可以简单地创建项目布局并开始构建所需的任何内容。
也许我的其他博客之一可以使您对做事有更多的启发。
https://marcofranssen.nl/categories/software-development/golang/
答案 1 :(得分:0)
在模块模式下不支持相对导入路径。您将需要更新import
语句以使用完整(绝对)导入路径。
您还应该选择application
以外的模块名称。模块路径通常应以您控制的URL前缀开头-您可以是自己的域名,也可以是诸如github.com/$USER/$REPO
之类的唯一路径。
答案 2 :(得分:0)
我自己在处理本地软件包时遇到了一些问题。 有两个技巧可以使它起作用:
这将编译软件包并将其放入构建缓存中。 关于code organisation in go的此链接说明了更多信息。 您可以确定缓存在哪里使用:
>go env GOCACHE
/home/<user>/.cache/go-build
我对正确的导入路径感到困惑,最后发现go doc
或go list
会告诉您。
>go doc
package docs // import "tools/src/hello/docs"
>go list
tools/src/hello/docs
例如。我有一个hello world API项目,并且正在使用swaggo生成它在docs
子目录中所做的文档。
要使用它,我添加一个导入:
_ "tools/src/hello/docs"
就我而言,_很重要,因为docs不能直接使用,但是我们要调用它的init()函数。
现在在hello/main.go
中,我可以添加"tools/src/hello/docs"
,它将导入正确的包。
该路径相对于go.mod的位置(如果有)。 我这里有工具/,因为我有一个go.mod,它声明“模块工具”。
模块是另一种鱼-请参见https://github.com/golang/go/wiki/Modules。
go的最新版本(1.11和更高版本)可以创建一个go.mod
文件,您可以使用该文件来修复所使用的模块的版本,并避免go疯狂的默认行为,即仅下载导入的任何软件包的最新版本。