GOPATH 与 Go Modules

GolangGolangBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

介绍

在本实验中,我们将学习 Go 中管理依赖的两种不同方式:GOPATH 和 Go Modules。这些是有效组织和管理 Go 项目的关键概念。

知识点:

  • GOPATH
  • GOROOT
  • Go Modules

准备工作

在这一步骤中,我们将通过解压提供的 tarball 文件来准备环境。

  1. 首先,打开终端并输入以下命令,导航到项目目录:

    cd ~/project
  2. 解压当前目录下的 helloWorld.tar.gz 文件:

    tar -xzf helloWorld.tar.gz
  3. 文件解压完成后,检查是否已创建 helloWorld 文件夹:

    ls helloWorld

如果解压成功,该命令将列出 helloWorld 目录中的内容。

基础模块 GOPATH

在 Go 1.11 之前,Go 使用一个特定的工作空间 GOPATH 来存储所有 Go 代码。在这一步骤中,我们将了解 GOPATH 的工作原理。

  1. GOROOT 是 Go 安装的目录,包括其工具和标准库包。
  2. GOPATH 是你个人 Go 代码存放的位置,它包含三个目录:
    • src:存储你的项目源代码。
    • bin:存储编译后的可执行文件。
    • pkg:存储编译后的非可执行包。

要检查当前的 GOPATHGOROOT,可以运行以下命令:

## 检查 GOPATH 目录
go env | grep GOPATH

## 检查 GOROOT 目录
go env | grep GOROOT

这些命令将显示你机器上的 GOPATHGOROOT 路径。

初始化 mod

Go Modules 在 Go 1.11 中引入,并在 Go 1.13 中默认启用,旨在解决两个主要问题:

  • 对 GOPATH 的过度依赖:在 Go Modules 之前,代码必须存储在 GOPATH/src 目录中。使用 Go Modules 后,你可以将代码存储在系统的任何位置。
  • 版本依赖问题:Go Modules 允许项目管理和跟踪特定版本的依赖项,使得在同一包的不同版本之间工作更加容易。

在这一步骤中,我们将为一个新项目初始化 Go Module。

  1. 创建一个名为 testHello 的项目目录:

    cd ~/project
    mkdir testHello
  2. 切换到 testHello 目录:

    cd testHello
  3. 为该项目初始化 Go Module:

    go mod init testHello

    输出应为:

    go: creating new go.mod: module testHello
  4. testHello 文件夹中创建一个新的 Go 文件 testHello.go,内容如下:

    touch testHello.go
    package main
    
    import "fmt"
    
    func main() {
        fmt.Println("hello, world")
    }

现在,我们已经使用 Go Modules 初始化了 testHello 项目,并向其中添加了一个简单的 Go 程序。

使用 mod 导入其他包

在这一步骤中,我们将演示如何在你的 Go 项目中导入和使用其他模块。

helloWorld 文件夹中的 helloWorld 包已经使用 Go Modules 初始化。同样,test 包也使用了 Go Modules,并从 helloWorld 包中导入了 Say 函数。

要探索这一点,请运行以下命令:

  1. 首先,查看 helloWorldtest 目录的结构:

    helloWorld
    ├── go.mod
    └── helloWorld.go
    test
    ├── go.mod
    └── test.go
  2. 接下来,打开 test/go.mod 文件。你应该会看到以下内容:

    module test
    
    go 1.15
    
    require "helloWorld" v0.0.1
    replace "helloWorld" => "../helloWorld"

replace 指令告诉 Go 使用本地路径 ../helloWorld,而不是从外部仓库获取。require 指令指定 test 包依赖于 helloWorld 包的 v0.0.1 版本。

参数 描述
module 指定包名
require 指定依赖项
replace 替换依赖项
exclude 排除依赖项

要运行 test 包中的 test.go 文件:

cd ~/project/test
go run test.go

输出应为:

hello, world

导入远程包

在 Go 中,你可以轻松导入远程包。让我们通过使用 GitHub 上的一个远程包来演示这一点。

  1. 创建一个目录 remoteModule

    cd ~/project
    mkdir remoteModule
    cd remoteModule
  2. 初始化 Go Module:

    go mod init remoteModule
  3. remoteModule 文件夹中创建一个文件 remote.go,内容如下:

    touch remote.go
    package main
    
    import (
        "github.com/labex-labs/golang-dev-code/chap02module"
    )
    
    func main() {
        chap02module.StringTobase64("miiy")
    }

    该程序从 GitHub 导入了 chap02module 包,并使用其 StringTobase64 函数。

  4. 使用以下命令运行 remote.go 文件:

    go get github.com/labex-labs/golang-dev-code/chap02module
    go run -v remote.go

    提示:免费用户无法访问互联网,因此无法运行此命令。升级到 Pro 计划以获取互联网访问权限。

go get 命令将从 GitHub 下载 chap02module 包并将其放入你的模块缓存中。完成后,go run 命令将执行你的程序。

小测试

在这一步骤中,我们将通过创建一个新文件来测试我们的知识,该文件使用远程模块中的 Hello 函数。

  1. 创建一个文件夹 remoteModule2

    cd ~/project
    mkdir remoteModule2
    cd remoteModule2
  2. 初始化 Go Module:

    go mod init remoteModule2
  3. 创建一个文件 remote2.go,内容如下:

    touch remote2.go
    package main
    
    import (
        "github.com/labex-labs/golang-dev-code/chap02module"
    )
    
    func main() {
        chap02module.Hello()
    }
  4. 运行程序:

    go get github.com/labex-labs/golang-dev-code/chap02module
    go run remote2.go

    输出应为:

    hello
✨ 查看解决方案并练习

总结

在本实验中,我们学习了以下内容:

  • GOPATHGOROOT 目录的含义和用途。
  • 使用 Go Modules 管理依赖的基础知识。
  • 如何在项目中初始化和使用 Go Modules。
  • 如何导入和使用本地及远程的 Go 包。

通过本实验,你应该能够熟练使用 Go Modules 来管理 Go 项目中的依赖。