团队博客

使用 Go Module 导入本地包

杜林君  2024-04

简介

Go Module 是从 Go 1.11 版本开始引入的依赖管理工具,并在 Go 1.13 成为默认配置。到 Go 1.14 发布后,官方正式推荐在生产环境中使用 Go Modules。本文将详细介绍如何在 Go Module 模式下导入本地包。

前提条件

假设我们有两个包:demomypackage,其中 demo 包会导入并调用 mypackage 包中的 New 方法。

// mypackage/mypackage.go
package mypackage

import "fmt"

func New() {
    fmt.Println("mypackage.New")
}

我们将分两种情况讨论:

  • 在同一个项目下。
  • 不在同一个项目下。

同一个项目下的导入

目录结构

在同一项目中,我们可以定义多个包。例如:

demo
├── go.mod
├── main.go
└── mypackage
    └── mypackage.go

配置

demo/go.mod 文件中定义模块信息:

module demo

go 1.14

导入包

demo/main.go 中导入 mypackage 包:

package main

import (
    "fmt"
    "demo/mypackage"  // 导入同一项目下的mypackage包
)

func main() {
    mypackage.New()
    fmt.Println("main")
}

示例

假设文件目录结构如下:

importpackage
├── dao
│   └── mysql.go
├── go.mod
└── main.go
  • importpackage/go.mod 内容:
module github.com/test/importpackage

go 1.14
  • importpackage/dao/mysql.go 内容:
package dao

import "fmt"

func New() {
    fmt.Println("mypackage.New")
}
  • importpackage/main.go 内容:
package main

import (
    "fmt"
    "github.com/test/importpackage/dao"
)

func main() {
    dao.New()
    fmt.Println("main")
}

不同项目下的导入

目录结构

当两个包不在同一个项目路径下时,需要确保每个包都有自己的 go.mod 文件。例如:

├── demo
│   ├── go.mod
│   └── main.go
└── mypackage
    ├── go.mod
    └── mypackage.go

配置

首先,在 mypackage 下初始化模块:

module mypackage

go 1.14

然后,在 demo/go.mod 中添加 replace 指令以指向本地路径:

module demo

go 1.14

require "mypackage" v0.0.0
replace "mypackage" => "../mypackage"

导入包

demo/main.go 中按如下方式导入:

package main

import (
    "fmt"
    "mypackage"
)

func main() {
    mypackage.New()
    fmt.Println("main")
}

示例

假设文件目录结构如下:

├── package1
│   ├── go.mod
│   └── main.go
└── package2
    ├── go.mod
    └── package2.go
  • package2/go.mod 内容:
module bendi.com/test/package2

go 1.14
  • package1/main.go 中导入 package2.go 定义的函数:
package main

import (
    "fmt"
    "bendi.com/test/package2"
)

func main() {
    package2.New()
    fmt.Println("main")
}

因为 bendi.com/test/package2 并未上传至远程仓库,需在 package1/go.mod 中使用 replace 指令:

module github.com/test/package1

go 1.14

require "bendi.com/test/package2" v0.0.0
replace "bendi.com/test/package2" => "../package2"

总结

通过以上步骤,您可以轻松地在 Go Module 模式下导入本地包。无论是同一项目内还是不同项目间的包导入,只需正确配置 go.mod 文件和使用 replace 指令即可。希望这篇文章能帮助您更好地理解和使用 Go Module。

Kamailio 案例分享