如何以新方式构造Golang模块和项目结构

时间:2019-09-15 00:57:11

标签: go go-modules

似乎从1.11开始使用模块的方式已更改,我正在尝试了解如何从另一个目录引用模块/包。

让我说我有一个文件夹结构 \ root \ module1 \ root \ module2

我在每个目录中都有一个go.mod,我可以从\ root目录访问/使用这些模块

如何从module1访问module2。这些模块不会在任何地方发布(也不希望它们被发布)-我只想访问它们。模块2包含我需要在mondule1中使用的类型/结构

亲切问候 马丁

1 个答案:

答案 0 :(得分:1)

旧路

Go模块必须放在GOPATH中才能使用。

当我开始一个新的go项目时,通常会在gopath中创建一个文件夹

cd $GOPATH
ls

在这里找到3个文件夹

bin  pkg  src
ls src
>code.cloudfoundry.org  github.com  github.ibm.com  golang.org  gopkg.in  go.uber.org  honnef.co  winterdrache.de

在src中,有一些您使用“ go get”命令检索的代码。

这里的所有内容都可以导入(/导出)到您的软件中。

假设此测试项目:

github.ibm.com/
└── Alessio-Savi
    └── GoLog-Viewer
        ├── conf
        │   ├── dev.json
        │   └── test.json
        ├── database
        │   ├── cloudant
        │   │   └── cloudant.go
        │   └── db2
        │       └── db2.go
        ├── datastructure
        │   └── datastructures.go
        ├── GinProva.go
        ├── README.md
        ├── request
        │   └── request.go
        └── resources
            └── template01.html

注意:数据结构保存在go文件中的正确目录中,以避免导入圈子

您可以使用以下导入语句导入datastructures.go(或所需的其他文件)

package mypackage

import(
    "github.ibm.com/Alessio-Savi/GoLog-Viewer/datastructure"
)

在其他文件中(与其他项目在同一项目中),您只需使用该软件包并让IDE帮助您(由于该模块/项目位于GOPATH中)

enter image description here

新方法

要创建新模块,可以使用新的go module init gotool命令。

在公开源代码的情况下,创建新模块的常见方法是:

go mod init github.com/username/modulename

这将生成两个文件:

  1. go.mod
  2. go.sum

go.mod文件将包含运行模块所需的每个库/外部golang代码。 go.sum文件将包含库的哈希。

例如,我将使用名为GoGPUtils的小型通用库。

mkdir GoGPUtils
cd $_
go mod init github.com/alessiosavi/GoGPUtils

现在,您可以在go.mod库中的代码中插入所需的库。假设您需要ahocorasick实现才能进行字符串搜索,go.mod文件将包含以下内容:

module github.com/alessiosavi/GoGPUtils

go 1.13

require (
    github.com/alessiosavi/ahocorasick v0.0.3
    golang.org/x/tools v0.0.0-20191031220737-6d8f1af9ccc0 // indirect
)

require部分中,列出了所需的软件包。现在,您可以在代码中导入ahocorasick库,如下所示:

import (
    ahocorasick "github.com/alessiosavi/ahocorasick"
)