• GOPATH和Go Modules


    Go语言的包依赖管理经历了几次变革

    最早的时候,Go所依赖的所有的第三方库都放在GOPATH目录下面

    go v1.5引入vendor模式,如果项目目录下有vendor目录,那么go工具链会优先使用vendor内的包进行编译、测试等

    go v1.11开始,引入Go Module 作为依赖解决方案,到v1.16 Go Module作为默认依赖管理工具

    一、GOPATH

    GoPath是一个环境变量,指定了存放源代码、编译后的二进制文件和包依赖的根目录。

    在设置 GOPATH 环境变量后,Go 编译器和相关工具会使用该路径作为默认的工作目录。具体来说,GOPATH 目录下包含了三个主要的子目录:

    src:源代码存放目录,包括你自己的项目代码和导入的外部包。
    pkg:编译后的包文件存放目录,包括使用 go install 命令生成的二进制文件。
    bin:可执行文件存放目录,包括使用 go install 命令生成的可执行文件。

    在使用 go get 命令安装包时,它们将被下载到 $GOPATH/src 目录中,并在 pkg 目录中生成相应的二进制文件。三方包只要不是官方库,都需要放置在GOPATH/src的路径下才可以使用。

    GOPATH 模式下,go get 命令使用时,没有版本选择机制,拉下来的依赖代码都会默认当前最新版本,而且如果当项目 A 和项目 B 分别依赖项目 C 的两个不兼容版本时, GOPATH 路径下只有一个版本的 C 将无法同时满足 A 和 B 的依赖需求。

    二、Go Modules

    Go Modules 是 Go 语言的包管理系统,用于管理项目的依赖关系和版本控制,旨在解决 GOPATH包管理的一些问题。

    Go Modules 允许每个项目都拥有自己的独立依赖项集合,并提供了更精细的版本控制和依赖管理功能。使用 Go Modules,每个项目都包含一个 go.mod 文件,用于定义项目的模块和依赖项。类似Java Maven的做法,将第三方库储存在本地的空间,并且给项目代码去引用。

    go.mod 文件记录了项目所依赖的包及其版本约束。它包含了以下信息:

    模块路径:指定当前项目的模块路径,通常是代码托管服务的 URL 或本地文件系统路径。
    依赖项列表:列出了项目所依赖的包以及它们的版本约束。版本约束可以是精确的版本号,也可以是语义化版本控制(Semantic Versioning)的范围表达式。
    替代模块:允许替换依赖项的特定版本,例如使用本地修改的包或替代的第三方包。


    当构建项目时,Go Modules 会自动下载和管理所需的包,并将它们安装到项目的缓存目录中(默认为 $GOPATH/pkg/mod)。这样,每个项目都可以独立地管理其依赖项,而不会相互干扰。

    Go Modules 还支持版本控制,允许指定包依赖的版本范围。在构建项目时,Go Modules 会选择符合依赖约束的最新版本。开发人员可以使用命令如 go get、go build、go test 等来管理和构建项目的依赖项。

    总结来说,Go Modules 是一种现代化的包管理系统,通过模块文件 (go.mod) 管理项目的依赖关系和版本控制。它提供了更灵活、独立和可控的方式来管理 Go 语言项目的包依赖。

    总结

    GoPath所引出的问题,就是因为第三方类库的包所导致的,所以在有了GoModule之后,GoPath和GoModule就分别负责不同的职责,共同为Golang项目服务

    GoPath用来存放我们从网上拉取的第三方依赖包
    GoModule用来存放我们自己的Golang项目文件,当自己的项目需要依赖第三方的包的时候,我们通过GoModule目录下的一个go.mod文件去引用GoPath目录pkg包下的mod文件夹下的第三方依赖即可

    这样以来,既解决了原来只能局限在GoPath目录src包下进行编程的问题,也解决了第三方依赖包难以管理的问题

  • 相关阅读:
    OpenHarmony组件复用示例
    2021.03青少年软件编程(Python)等级考试试卷(三级)
    js游戏集合
    ROS2时间同步(python)
    NBA赛事直播超清画质背后:阿里云视频云「窄带高清2.0」技术深度解读
    力扣:92. 反转链表 II(Python3)
    SXSSFWorkbook-MinIo-大数据-流式导出
    Java多线程-初阶1
    opengl灯光基础:2.1 光照基础知识
    第十五章总结
  • 原文地址:https://blog.csdn.net/yzh_1346983557/article/details/133776071