golang模块和本地包

时间:2018-09-12 13:12:46

标签: go module

我试图了解如何使用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 /等下,但是这些方法都不适合我。

使用模块和本地软件包的方式是什么?

谢谢。

3 个答案:

答案 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)

我自己在处理本地软件包时遇到了一些问题。 有两个技巧可以使它起作用:

  1. 您在软件包目录中运行“开始构建”

这将编译软件包并将其放入构建缓存中。 关于code organisation in go的此链接说明了更多信息。 您可以确定缓存在哪里使用:

>go env GOCACHE
/home/<user>/.cache/go-build
  1. 使用相对于项目的路径导入

我对正确的导入路径感到困惑,最后发现go docgo 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疯狂的默认行为,即仅下载导入的任何软件包的最新版本。