《快学 Go 语言》第 16 课 —— 包管理 GOPATH 和 Vendor

GOPATH 在 Go Modules 时代的真实角色与实战避坑指南 GOPATH 是 Go 语言早期定义的工作区路径,虽被 Go Modules 主导的依赖管理取代,但并未废弃,而是演变为模块缓存($GOPATH/pkg/mod)的根目录和工具链定位基准。其核心原理在于为 go build、go install 等命令提供确定性路径解析能力,支撑零配置构建与离线开发。技术价值体现在构建可复现性、CI/CD 缓存优化及编辑器智能感知(如 VS Code 跳转定义)的底层支撑。典型应用场景覆盖 Docker 多阶段构建、Kubernetes Init Container 依赖预 阅读详情

到目前位置我们一直在编写单文件代码,只有一个 main.go 文件。本节我们要开始朝完整的项目结构迈进,需要使用 Go 语言的模块管理功能来组织很多的代码文件。

细数 Go 语言的历史发展,模块管理经历了三个重要的阶段。第一阶段是通过全局的 GOPATH 来管理所有的第三方包,第二阶段是通过 Vendor 机制将项目的依赖包局部化,第三阶段是 Go 语言的最新功能 Go Module。

本节我们重点讲解前两个阶段,这两个阶段要求我们编写代码时必须在 GOPATH 下面对应的包路径目录里写。第三个阶段 Go Module 内容较新,也比较复杂需要另起一节单独讲解。

系统包路径

Go 语言有很多内置包,内置包的使用需要用户手工 import 进来。Go 语言的内置包都是已经编译好的「包对象」,使用时编译器不需要进行二次编译。可以使用下面的命令查看这些已经编译好的包对象在哪里。

// go sdk 安装路径
$ go env GOROOT
/usr/local/go
$ go env GOOS
darwin
$ go env GOARCH
amd64
$ ls /usr/local/go/darwin_amd64
total 22264
drwxr-xr-x   4 root  wheel      136 11  3 05:11 archive
-rw-r--r--   1 root  wheel   169564 11  3 05:06 bufio.a
-rw-r--r--   1 root  wheel   177058 11  3 05:06 bytes.a
drwxr-xr-x   7 root  wheel      238 11  3 05:11 compress
drwxr-xr-x   5 root  wheel      170 11  3 05:11 container
-rw-r--r--   1 root  wheel    93000 11  3 05:06 context.a
drwxr-xr-x  21 root  wheel      714 11  3 05:11 crypto
-rw-r--r--   1 root  wheel    24002 11  3 05:02 crypto.a
...

全局管理 GOPATH

Go 语言的 GOPATH 路径下存放了全局的第三方依赖包,当我们在代码里面 import 某个第三方包时,编译器都会到 GOPATH 路径下面来寻找。GOPATH 目录可以指定多个位置,不过用户一般很少这样做。如果你没有人工指定 GOPATH 环境变量,编译器会默认将 GOPATH 指向的路径设定为 ~/go 目录。用户可以使用下面的命令看看自己的 GOPATH 指向哪里

$ go env GOPATH
/Users/qianwp/go

640?wx_fmt=png

当我们导入第三方包时,编译器优先寻找已经编译好的包对象,如果没有包对象,就会去源码目录寻找相应的源码来编译。使用包对象的编译速度会明显快于使用源码。

友好的包路径

Go 语言允许包路径带有网站域名,这样它就可以使用 go get 指令直接去相应的网站上拉去包代码。最常用的要数 github.com、gopkg.in、golang.org 这三个网址。

import "github.com/go-redis/redis"
import "golang.org/x/net"
import "gopkg.in/mgo.v2"
import "myhost.com/user/repo" // 个人提供的仓库

模块的标准结构

了解模块结构的最好办法就是看看别人的模块是怎么写的,这里我们来观察一下 mongo 包。使用下面的命令将 redis 的包下载本 GOPATH 目录下

$ go get gopkg.in/mgo.v2

640?wx_fmt=png

打开代码中的任意一个文件你可以发现代码中的 package 声明的包名是 mgo,这个和当前的目录名称可以不一样,不过当前目录下所有的文件都是这同一个包名 mgo。同时我们还注意到即使是包内代码引用,还是使用了全路径来导入而不是相对导入,比如下图的 bson,虽然同属一个项目,但是它们好像根本就互不相识,要使用对方的的路径全称来打招呼。

640?wx_fmt=png

当其它项目导入这个包时,import 语句后面的路径是 mongo 包的目录路径,而使用的包名却是这个目录下面代码中 package 语句声明的包名 mgo。

package main

import "gopkg.in/mgo.v2"

func main() {
  session, err := mgo.Dial(url)
  ...
}

640?wx_fmt=png

它已经由另一个社区项目接手。如果你要使用 mongo 的包,请使用

$ go get github.com/globalsign/mgo

编写第一个模块

下面我们尝试编写第一个模块,这个模块是一个算法模块,提供两个方法,一个是计算斐波那契数,一个用来计算阶乘。我们要将这个包放到 github.com 上,需要读者在 github.com 上申请自己的账户,然后创建自己的项目名叫 mathy。我的 github id 是 pyloque,于是这个项目的包名就是 github.com/pyloque/mathy。第一步在 GOPATH 里创建这个包目录

$ mkdir -p ~/go/src/github.com/pyloque/mathy
$ cd ~/go/src/github.com/pyloque/mathy

package mathy

//  函数名大写,其它的包才可以看的见
func Fib(n int) int64 {
    if n <= 1 {
        return 1
    }
    var s = make([]int64, n+1)
    s[0] = 1
    s[1] = 1
    for i := 2; i <= n; i++ {
        s[i] = s[i-1] + s[i-2]
    }
    return s[n]
}

func Fact(n int) int64 {
    if n <= 1 {
        return 1
    }
    var s int64 = 1
    for i := 2; i <= n; i++ {
        s *= int64(i)
    }
    return s
}

package main

import (
    "fmt"

    "github.com/pyloque/mathy"  // 引用刚刚创建的包名
)

func main() {
    fmt.Println(mathy.Fib(10))
    fmt.Println(mathy.Fact(10))
}

-------------
89
3628800

$ git init
Initialized empty Git repository in /Users/qianwp/go/src/github.com/pyloque/mathy/.git/

$ git add --all

$ git commit -a -m 'first commit'
[master (root-commit) 7da8809] first commit
 2 files changed, 37 insertions(+)
 create mode 100644 cmd/main.go
 create mode 100644 mathy.go

$ git remote add origin https://github.com/pyloque/mathy.git

$ git push origin master
Counting objects: 5, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (5/5), 555 bytes | 555.00 KiB/s, done.
Total 5 (delta 0), reused 0 (delta 0)
remote:
remote: Create a pull request for 'master' on GitHub by visiting:
remote:      https://github.com/pyloque/mathy/pull/new/master
remote:
To https://github.com/pyloque/mathy.git
 * [new branch]      master -> master

640?wx_fmt=png

这个项目提交到了 github.com 意味着全球的人都可以使用你的代码了,前提是人们愿意使用。现在你可以将本地的 mathy 文件夹删除,然后执行一下 go get

$ go get github.com/pyloque/mathy

Go 语言支持使用 . 和 .. 符号相对导入,但是不推荐使用。官方表示相对导入只应该用于本地测试,如果要正式发布一定需要修改为绝对导入。相对导入可以不必将代码放在 GOPATH 里面编写,所以会方便本地测试。但是将代码放到 GOPATH 里面写又能产生多大障碍呢?总之就是不推荐使用相对导入。

两个包的包名一样怎么办?

如果你的代码需要使用两个包,这两个包的路径最后一个单词是一样的,那该如何分清使用的是那个包呢?为了解决这个问题,Go 语言支持导入语句名称替换功能

import pmathy "github.com/pyloque/mathy"
import omathy "github.com/other/mathy"

无名导入

Go 语言还支持一种罕见的导入语法可以将其它包的所有类型变量都导入到当前的文件中,在使用相关类型变量时可以省去包名前缀。

package main

import "fmt"
import . "github.com/pyloque/mathy"

func main() {
  fmt.Println(Fib(10))
  fmt.Println(Fact(10))
}

匿名导入

Go 语言还支持匿名导入,就是说你导入了某个第三方包,但是不需要显示使用它,这时就可以使用匿名导入。什么时候需要导入某个包而不使用呢?这是因为 Go 语言的代码文件中可以存在一个特殊的 init() 函数,它会在包文件第一次被导入的时候运行。

640?wx_fmt=png
图片

当我们使用数据库驱动的时候就会经常遇到匿名导入,第三方驱动包会在 init() 函数中将当前驱动注册到全局的驱动列表中,这样通过特定的 URI 就可以识别并找到相应的驱动来使用。

import (
    "database/sql"
    _ "github.com/go-sql-driver/mysql"
)

import (  
    "image"
    _ "image/gif"
    _ "image/png"
    _ "image/jpeg"
)

包名和目录名不一样

Go 语言允许包名和当前的目录名成不一样,在导入包的时候使用的是目录路径,但是在使用的时候应该使用目录下的包名。所以你会看到导入的路径尾部和真正使用时的包名前缀不一样。

import "github.com/json-iterator/go"

var json = jsoniter.ConfigCompatibleWithStandardLibrary
json.Marshal(&data)

go get vs go build vs go install

Go 提供了三个比较的常用的指令用来进行全局的包管理。

go build: 仅编译。如果当前包里有 main 包,就会生成二进制文件。如果没有 main 包,build 指令仅仅用来检查编译是否可以通过,编译完成后会丢弃编译时生成的所有临时包对象。这些临时包包括自身的包对象以及所有第三方依赖包的包对象。如果指定 -i 参数,会将编译成功的第三方依赖包对象安装到 GOPATH 的 pkg 目录。

go install:先编译,再安装。将编译成的包对象安装到 GOPATH 的 pkg 目录中,将编译成的可执行文件安装到 GOPATH 的 bin 目录中。如果指定 -i 参数,还会安装编译成功的第三方依赖包对象。

go get:下载代码、编译和安装。安装内容包括包对象和可执行文件,但是不包括依赖包。

$ go get github.com/go-redis/redis
640?wx_fmt=png

注意编译过程中第三方包的 main 包是不可能被编译的,安装的对象也就不可能包括第三方依赖包的可执行文件。

当我们使用 go run 指令来测试运行正在开发的程序时,如果发现启动了很久,这时候可以考虑先执行 go build -i 指令,将编译成功的依赖包都安装到 GOPATH 的 pkg 目录下,这样再次运行 go run 指令就会快很多。

$ go build -i
$ go run main.go

$ go get -u github.com/go-redis/redis

局部管理 Vendor

当我们在本地要开发多个项目时,如果不同的项目需要依赖某个第三方包的不同版本,这时候仅仅通过全局的 GOPATH 来存放第三方包是无解的。解决方法有一个,那就是需要在不同的项目里设置不同的 GOPATH 变量来解决冲突问题。但是这还是不能解决一个重要的问题,那就是当我们的项目依赖了两个第三方包,这两个第三方包又同时依赖了另一个包的两个不同版本,这时候就会再次发生冲突。这种多版本依赖有一个专业的名称叫「钻石型」依赖。

640?wx_fmt=png

为了解决这个问题,Go 1.6 引入了 vendor 机制。这个机制非常简单,就是在你自己项目的目录下增加一个名字为 vendor 子目录,将自己项目依赖的所有第三方包放到 vendor 目录里。这样当你导入第三方包的时候,优先去 vendor 目录里找你需要的第三方包,如果没有,再去 GOPATH 全局路径下找。

640?wx_fmt=png

使用 vendor 有一个限制,那就是你不能将 vendor 里面依赖的类型暴露到外面去,vendor 里面的依赖包提供的功能仅限于当前项目使用,这就是 vendor 的「隔离沙箱」。正是因为这个沙箱才使得项目里可以存在因为依赖传递导致的同一个依赖包的多个版本。同时这也意味着项目里可能存在多份同一个依赖包,即使它们是同一个版本。比如你的包在 vendor 里引入了某个第三方包 A,然后别人的项目在 vendor 里引入你的包,同时它也引入第三方包 A。这就会导致生成的二进制文件变大,也会导致运行时内存变大,不过也无需担心,这点代价对于服务端程序来说基本可以忽略不计。

讲到这里还有一个很重要的问题没有解决,github 上有很多开源项目,这些项目都有多个版本号,我如何引入具体某一个版本呢?如果使用 go get 指令,它总是引入 master 分支的最新代码,它往往不是稳定的可靠代码。这就需要 Go 语言的依赖管理工具的支持了,它就好比 java 语言的 maven 工具,python 语言的 pip 工具。

Dep

640?wx_fmt=png

Go 语言没有内置 vendor 包管理工具,它需要第三方工具的支持。这样的工具很多,目前最流行的要数 golang/dep 项目了,它差一点就被官方收纳为内置工具了,很可惜!上图是它的 Logo,图中叠起来的箱子就是 dep 正在管理的各种第三方依赖包。使用它之前我们需要将 dep 工具安装到 GOPATH 下面

$ go get github.com/golang/dep

配置文件

dep 管理的项目会有两个配置文件,分别是 Godep.toml 和 Godep.lock。Godep.toml 用于配置具体的依赖规则,里面包含项目的具体版本号信息。通过 toml 配置文件,你即可以使用远程的依赖包(github),也可以直接使用本地的依赖包(GOPATH)。还可以为依赖包指定别名,这样就可以在代码里使用和真实路径不一样的导入路径。当你需要切换依赖包的不同版本时,可以在 toml 配置文件里修改依赖的版本号,然后通过 dep ensure 指令来更新依赖项。

Gopkg.lock 是基于当前的 toml 文件配置规则和项目代码来生成依赖的精确版本,它确定了 vendor 文件夹里要下载的依赖项代码的目标版本。

dep init

该指令用于初始化当前的项目,它会静态分析当前的项目代码(如有有的话),生成 Godep.toml 和 Godep.lock 依赖配置文件,将依赖的项目代码下载到当前项目的 vendor 文件夹里面。它会根据一定的策略来选择最新的依赖包版本。如果自动策略生成的版本号不是你想要的,可以再修改配置文件执行 dep ensure 来切换其它版本。

dep ensure

该指令会下载代码里用到的新依赖项、移除当前项目代码里不使用的依赖项。确保当前的依赖包代码和当前的项目代码配置处于完全一致的状态。

dep ensure -update

更新 Godep.lock 文件中的所有依赖项到最新版本。可以增加 一到多个包名参数,指定更新特定的依赖包。如果 toml 配置文件限定了依赖包的版本范围,那么更新必须遵守 toml 规则的版本限制。

dep ensure -add github.com/a/b

增加并下载一个新的项目依赖包,可以指定依赖版本号。如 dep ensure -add github.com/a/b@master 或者 github.com/a/b@1.0.0

dep status

显示当前项目的依赖状态。

Dep 在使用起来比较简单,但是其内部实现上是一个比较复杂的工具,鉴于篇幅限制,本节就不再继续深入讲解 Dep 了,以后有空再单独开启一篇来深入探讨吧。我甚至觉得理解 Dep 已经变得没有那么必要,因为它已经被 Go 语言官方抛弃了,取而代之的解决方案是 Go Module。

640?wx_fmt=png

大拇指长按图片识别二维码,订阅《快学 Go 语言》更多内容

Python CalmAn(Calcium Imaging Analysis)神经生物学工具包安装及环境配置过程 CalmAn是一个用于大规模钙成像数据分析和行为分析的Python工具箱。CaImAn实施了大规模钙成像数据分析管道中所需的一套基本方法。针对多天的运动校正、源提取、尖峰反褶积和分量配准,实现了快速且可扩展的算法。它适用于双光子和单光子荧光显微镜数据,可以在批处理和在线模式下运行;CaImAn还包含一些分析摄像机行为的例程。 阅读详情

相关推荐

使用 Cadence ams 仿真器 对 混合信号电路 进行仿真

文章目录Cadence 基于ams仿真器的混合信号电路仿真建立数字(Digital)模块建立 Analog - Digital 混合仿真原理图建立 Analog - Digital 混合仿真config文件配置混合信号电路仿真环境针对混合信号电路demo进行仿真 Cadence 基于ams仿真器的混合信号电路仿真 你好,这里是一篇关于使用 Cadence 软件通过 ams 仿真器对混合信号电路(D...

mymatin1004的博客 2万+

【Go】Go 包管理 之 Go Vendor

本文介绍了go vender

weixin_44211968的博客 7816

单片机通信总述——理论部分(CAN、串口、SPI、I2C等)

并行通信:传输原理:数据各个位同时传输;优点:速度快; 缺点:占用引脚资源多。是指使用 8、16、32 及 64 根或更多的数据线(有多少信号为就需要多少信号位)进行传输的通讯方式,可以同一时刻传输多个数据位的数据。串行通信: 传输原理:数据按位顺序传输;优点:占用引脚资源少; 缺点:速度相对较慢。是指设备之间通过一根数据信号线,地线以及控制信号线,按数据位形式一位一位地传输数据的通讯方式,同一时刻只能传输一位(bit)数据。 单工: 数据传输只支持数据在一个方向上传输。信息只能单方向传输的工作方式,一

qq_42475191的博客 1万+

Maven回顾

1.maven是什么? Maven 是一个项目管理工具,它包含了一个 项目对象模型 (POM:Project Object Model),一组标准集合,一个项目生命周...

庭前云落的博客 288

Claude Code教程(二) | Claude Code 核心信息与使用指南

Claude Code 核心信息与使用指南

qq_20236937的博客 2186

DeepSeek赋能CAD:从API调用到智能设计工作流的实战指南

本文详细介绍了如何利用DeepSeek AI技术赋能CAD设计工作流,从API调用到智能设计优化的实战指南。通过Python环境配置、API接入详解以及四大智能设计场景的实战案例,帮助CAD设计师实现参数化设计优化、自动规范检查等高效工作方式,大幅提升设计效率和质量。

weixin_29092579的博客 629

Go:包管理工具GOPATH、vendor、dep 、go module

Go包管理工具:前言 Golang一直存在一个被人诟病的问题是缺少一个官方的包依赖管理工具。从我个人的角度上来看存在两个问题: GOPATH特性对于多工程的情况下,支持不算友好。 GOPATH无法对依赖包进行有效的版本管理,没有任何地方能够表明依赖包的具体版本号,无法简单清晰获取到有效的依赖包版本信息等。 GOPATH 在 go mod 出现之前,所有的 Go 项目都需要放在同一个工...

琦彦 1万+

针对so层不固定位置的动态加密,怎么解决?(面试题)

Android逆向之破解某应用加密算法(动态调试so和hook so代码):so 代码动态解密后才执行,我们可以在解密完成后获取解密后的代码或数据。Android逆向之旅—动态方式破解apk进阶篇(IDA调试so源码)如果你有更具体的加密场景,欢迎提供更多信息,我可以给出更详细的方案!某些 so 在运行时生成密钥,解密后再用。某APP密码加密算法分析。

SXXYNHHXX的博客 927

理解Go 1.5 vendor

Go 1.5中(目前最新版本go1.5beta3)加入了一个experimental feature: vendor/。这个feature不是Go 1.5的正式功能,但却是Go Authors们在解决Go被外界诟病的包依赖管理的道路上的一次重要尝试。目前关于Go vendor机制的资料有限,主...

ciddk2085的博客 570

计算机控制液压同步顶升系统,PLC四点多点同步顶升系统,同步液压顶升系统

PLC同步顶升系统系统可分为5个部分:液压泵站、PLC计算机控制系统、液压终端、位移压力检测与人机界面操作系统,位移同步精度1mm,同步控制点数:4,8,12,16,20,40,80,99;产品特点:高速置零、低速顶升,升降速度可以任意控制;液压千斤顶内置式(或外置)位移、压力传感器、均载阀,保证了顶升系统在恶劣工作环境下的高可靠性;均载阀的过载保护功能,避免了多缸顶升时常见的胀缸事故;先进的进油...

weixin_30093045的博客 1434

嵌入式AI实战:基于RK3588部署YOLOv11并集成OpenCV实现实时推理(全流程详解)

本文详细介绍了在RK3588芯片上部署YOLOv11目标检测模型的全流程,包括环境搭建、模型转换和实时推理实现。主要内容为:1)通过YOLOv11官方工具将PyTorch模型转为ONNX格式;2)使用RKNN Toolkit2将ONNX模型转换为适配RK3588的RKNN格式;3)在RK3588上结合OpenCV实现实时视频推理功能。教程提供了完整的代码示例和详细步骤说明,帮助开发者快速在边缘设备上部署目标检测模型,实现AI视觉应用的落地。

LXY_LOVE36的博客 214

go import 指定分支_《快学 Go 语言》第 16 课 —— 包管理 GOPATH 和 Vendor

到目前位置我们一直在编写单文件代码,只有一个 main.go 文件。本节我们要开始朝完整的项目结构迈进,需要使用 Go 语言的模块管理功能来组织很多的代码文件。细数 Go 语言的历史发展,模块管理经历了三个重要的阶段。第一阶段是通过全局的 GOPATH 来管理所有的第三方包,第二阶段是通过 Vendor 机制将项目的依赖包局部化,第三阶段是 Go 语言的最新功能 Go Module。本节我们重点讲...

weixin_32770423的博客 1473

Asterisk中MixMonitor之支持接通后录音

一、概述 当我们使用开源的IPPBX(比如Elastix-2.5/4.0或者ISSABEL-4.0/FreePBX)的时候Outbound和Inbound路由(RingGroup/FollowMe)中有一个Call Recording选项,其值包括:Allow、Record immediately、Record On Answer和Nerver。当选择为Record On Answer,其实就是MixMonitor自带一个b选项。 尽管Asterisk自带的MixMoni...

宽简厚重—博约 1156

go语言 第三方包安装方法_《快学 Go 语言》第 16 课 —— 包管理 GOPATH 和 Vendor...

到目前位置我们一直在编写单文件代码,只有一个 main.go 文件。本节我们要开始朝完整的项目结构迈进,需要使用 Go 语言的模块管理功能来组织很多的代码文件。细数 Go 语言的历史发展,模块管理经历了三个重要的阶段。第一阶段是通过全局的 GOPATH 来管理所有的第三方包,第二阶段是通过 Vendor 机制将项目的依赖包局部化,第三阶段是 Go 语言的最新功能 Go Module。本节我们重点讲...

weixin_39783771的博客 700

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

[Go]包管理发展之路(Go Modules VS GOPATH)

[Go]包管理发展之路(Go Modules VS GOPATH)

weixin_45565886的博客 1109

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

GOPATH和Go Modules

GoPath所引出的问题,就是因为第三方类库的包所导致的,所以在有了GoModule之后,GoPath和GoModule就分别负责不同的职责,共同为Golang项目服务GoPath用来存放我们从网上拉取的第三方依赖包GoModule用来存放我们自己的Golang项目文件,当自己的项目需要依赖第三方的包的时候,我们通过GoModule目录下的一个go.mod文件去引用GoPath目录pkg包下的mod文件夹下的第三方依赖即可。

yzh_1346983557的博客 1414

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Golang1.5到Golang1.12包管理:golang vendor 到 go mod

1. 前言 Golang 是一门到如今有十年的静态高级语言了,2009年的时候算是正式推出了,然后到最近的一两年,2017-2018年的时候,突然直线上升,爆火了,得益于容器化运维/直播/短视频/区块链... 我从2016年毕业的时候,第一份工作,就接触了 Golang 语言,那时公司用 Java 处理数据流,然后用 Golang 写高...

weixin_34221276的博客 795

golang编译之vendor机制

原文地址:golang编译之vendor机制 Go 1.5引入了vendor 机制,但是需要手动设置环境变量 GO15VENDOREXPERIMENT= 1,Go编译器才能启用。从Go1.6起,,默认开启 vendor 目录查找,vendor 机制就是在包中引入 vendor 目录,将依赖的外部包复制到 vendor 目录下,编译器在查找外部依赖包时,优先在 vendor 目录下查找。整个查找第三方包的流程如下: 如果当前包下有vendor目录,则从其下查找第三方的包,如果没有找到,则继续...

优秀技术文章收录 6024

Go包管理工具Vendor使用

一、Go包管理工具Vendor 一、使用步骤   1、首先,从go get -u github.com/kardianos/govendor下载govendor工具到本地。   2、govendor使用时,必须保证你的工程项目放在GOPATH/src目录下。   3、在Go命令行执行govendor init,自动生成vendor文件夹(存放你项目需要的依赖包)和vendor.json...

weixin_30263073的博客 555

go如何解决包管理问题

go如何解决包管理问题

bx13099003035的博客 189

go入门第三天 了解go语言是怎么解决包依赖管理问题的

了解go语言是怎么解决依赖包管理的 发展过程

qq_41407687的博客 1049

Go-6-常用命令-go包管理问题-两个路径-GO111MODULE

所谓的vendor机制,就是每个项目的根目录下可以有一个vendor目录,里面存放了该项目的依赖的package。这种方式的最大弊端就是无法实现包的多版本控制,比如项目A和项目B依赖与不同版本的package,如果package没有左到完全的向前兼容,往往会导致一些问题。模块支持,go会忽略GOPATH和vendor文件夹,只根据go.mod下载依赖。gomodinitxxx.go#初始化,会生成go.mod文件。GOPATHgo指定的工作空间--用于保存go项目的代码和第三方依赖包。...

weixin_57475485的博客 934

Go Mod包管理实战:从GOPATH到多工程协作的完整避坑指南

本文详细解析了Go语言从GOPATH到Go Modules的包管理演进,重点介绍了go mod在多工程协作中的实战应用。通过对比两种模式的差异,提供迁移步骤、依赖解析原理及多工程协作解决方案,帮助开发者规避常见陷阱,提升开发效率。

weixin_28318011的博客 78

go依赖包管理工具对比

写的挺清楚的,备份一下  转载于:https://www.studygolang.com/articles/10523  vendor一下 当开始真正用go去做项目的时候,不可避免的就会遇到依赖包的问题。go的依赖包管理与java+maven的依赖管理不太一样,我们从GOPATH开始逐渐理解其思想,然后再对比下目前常用的依赖包管理工具。 GOPATH和GOROOT 初学者很容易会被这两个

阿仆的专栏 2684
上一篇: 既生 Redis 何生 LevelDB ?
下一篇: 一位 40 岁老程序员的反思
码洞
博客等级 码龄10年 41粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值