当前位置: 首页 > article >正文

golang版本工具GVM 和包管理工具go mod原理讲解

一句话简介

GVM(Go Version Manager)

下载多版本golang到本地缓存,通过切换环境变量指向不同的Golang版本

Go mod

对 go modules 的依赖管理,使得不同项目中依赖不同版本的同一个库更简单。

进一步介绍

GVM配置环境变量的原理

  • gvm配置路径

    $ cat /Users/name/.gvm/scripts/gvm
    export GVM_ROOT=/Users/name/.gvm
    . $GVM_ROOT/scripts/gvm-default
    
  • gvm配置后的 golang 环境变量

    $go env
    GO111MODULE=""
    GOARCH="amd64"
    GOBIN=""
    GOCACHE="/Users/name/Library/Caches/go-build"
    GOENV="/Users/name/Library/Application Support/go/env"
    GOEXE=""
    GOFLAGS=""
    GOHOSTARCH="amd64"
    GOHOSTOS="darwin"
    GONOPROXY=""
    GONOSUMDB=""
    GOOS="darwin"
    GOPATH="/Users/name/.gvm/pkgsets/go1.13.10/global" #路径带了版本标识: go1.13.10 
    GOPRIVATE=""
    GOPROXY="https://proxy.golang.org,direct"
    GOROOT="/Users/name/.gvm/gos/go1.13.10" #路径带了版本标识: go1.13.10 
    GOSUMDB="sum.golang.org"
    GOTMPDIR=""
    GOTOOLDIR="/Users/name/.gvm/gos/go1.13.10/pkg/tool/darwin_amd64" #路径带了版本标识
    GCCGO="gccgo"
    AR="ar"
    CC="clang"
    CXX="clang++"
    CGO_ENABLED="1"
    GOMOD=""
    CGO_CFLAGS="-g -O2"
    CGO_CPPFLAGS=""
    CGO_CXXFLAGS="-g -O2"
    CGO_FFLAGS="-g -O2"
    CGO_LDFLAGS="-g -O2"
    PKG_CONFIG="pkg-config"
    GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/k2/sl1g0vys41q4msqx6hd40_hh0000gn/T/go-build407280275=/tmp/go-build -gno-record-gcc-switches -fno-common"
    
    • 从上面的 go env 配置可以看到,通过 gvm 管理的 golang 关键环境变量都带上了golang的版本标识

      • GOPATH="/Users/name/.gvm/pkgsets/go1.13.10/global"
      • GOROOT="/Users/name/.gvm/gos/go1.13.10"
      • GOTOOLDIR="/Users/name/.gvm/gos/go1.13.10/pkg/tool/darwin_amd64"

      这就代表着 ~/.gvm/ 路径下可以同时存在多个 golang 版本,通过 gvm 命令切换指定版本的golang路径即可完成版本的切换。

      这跟手动下载多个golang版本,每次切换手动配置环境变量指向是一样的道理。只不过 gvm 封装了这些操作,让这件事变得很轻松的实现。

Go mod

go mod 作用详解
  • 类似于Android Gradle,每个项目单独配置依赖 modules

  • Go1.12 版本以前的 go module 依赖是直接全局下载到 GoPath 路径下,当不同的项目使用不同版本的依赖库时,就会变得非常麻烦,因为 GoPath 下只保存了一个版本的依赖库。在以往这需要手动拷贝一份相关依赖库,到其他路径给不同的项目用。

  • go mod 起到的作用是,它可以管理一个依赖库的多个版本同时存在。

go mod 库版本管理的原理

go mod 维护了两个主要文件 go.sum 和 go.mod

  • go.mod 维护了项目的golang版本以及golang依赖的库

    $ cat go.mod
    module /go/mod-demo
    go 1.12
    require (
        github.com/PuerkitoBio/goquery v1.5.0 // indirect
        github.com/antchfx/htmlquery v1.0.0 // indirect
        github.com/antchfx/xmlquery v1.0.0 // indirect
        github.com/antchfx/xpath v0.0.0–20190319080838-ce1d48779e67 // indirect
        github.com/gobwas/glob v0.2.3 // indirect
        github.com/gocolly/colly v1.2.0
        github.com/kennygrant/sanitize v1.2.4 // indirect
        github.com/saintfish/chardet v0.0.0–20120816061221–3af4cd4741ca // indirect
        github.com/temoto/robotstxt v0.0.0–20180810133444–97ee4a9ee6ea // indirect
        golang.org/x/net v0.0.0–20190522155817-f3200d17e092 // indirect
        google.golang.org/appengine v1.6.0 // indirect
    )
    
  • go.sum 维护了项目依赖库的版本管理信息,类似 svn/git 的一个库版本记录,可以切换同一个库的不同版本

    cat go.sum
    github.com/PuerkitoBio/goquery v1.5.0 h1:uGvmFXOA73IKluu/F84Xd1tt/z07GYm8X49XKHP7EJk=
    github.com/PuerkitoBio/goquery v1.5.0/go.mod h1:qD2PgZ9lccMbQlc7eEOjaeRlFQON7xY8kdmcsrnKqMg=
    github.com/andybalholm/cascadia v1.0.0 h1:hOCXnnZ5A+3eVDX8pvgl4kofXv2ELss0bKcqRySc45o=
    github.com/andybalholm/cascadia v1.0.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y=
    github.com/antchfx/htmlquery v1.0.0 h1:O5IXz8fZF3B3MW+B33MZWbTHBlYmcfw0BAxgErHuaMA=
    github.com/antchfx/htmlquery v1.0.0/go.mod h1:MS9yksVSQXls00iXkiMqXr0J+umL/AmxXKuP28SUJM8=
    github.com/antchfx/xmlquery v1.0.0 h1:YuEPqexGG2opZKNc9JU3Zw6zFXwC47wNcy6/F8oKsrM=
    github.com/antchfx/xmlquery v1.0.0/go.mod h1:/+CnyD/DzHRnv2eRxrVbieRU/FIF6N0C+7oTtyUtCKk=
    github.com/antchfx/xpath v0.0.0–20190319080838-ce1d48779e67 h1:uj4UuiIs53RhHSySIupR1TEIouckjSfnljF3QbN1yh0=
    github.com/antchfx/xpath v0.0.0–20190319080838-ce1d48779e67/go.mod h1:Yee4kTMuNiPYJ7nSNorELQMr1J33uOpXDMByNYhvtNk=
    github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y=
    github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=
    github.com/gocolly/colly v1.2.0 h1:qRz9YAn8FIH0qzgNUw+HT9UN7wm1oF9OBAilwEWpyrI=
    github.com/gocolly/colly v1.2.0/go.mod h1:Hof5T3ZswNVsOHYmba1u03W65HDWgpV5HifSuueE0EA=
    github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM=
    github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=github.com/kennygrant/sanitize v1.2.4 h1:gN25/otpP5vAsO2djbMhF/LQX6R7+O1TB4yv8NzpJ3o=
    github.com/kennygrant/sanitize v1.2.4/go.mod h1:LGsjYYtgxbetdg5owWB2mpgUL6e2nfw2eObZ0u0qvak=
    github.com/saintfish/chardet v0.0.0–20120816061221–3af4cd4741ca h1:NugYot0LIVPxTvN8n+Kvkn6TrbMyxQiuvKdEwFdR9vI=
    github.com/saintfish/chardet v0.0.0–20120816061221–3af4cd4741ca/go.mod h1:uugorj2VCxiV1x+LzaIdVa9b4S4qGAcH6cbhh4qVxOU=
    github.com/temoto/robotstxt v0.0.0–20180810133444–97ee4a9ee6ea h1:hH8P1IiDpzRU6ZDbDh/RDnVuezi2oOXJpApa06M0zyI=
    github.com/temoto/robotstxt v0.0.0–20180810133444–97ee4a9ee6ea/go.mod h1:aOux3gHPCftJ3KHq6Pz/AlDjYJ7Y+yKfm1gU/3B0u04=
    golang.org/x/crypto v0.0.0–20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
    golang.org/x/net v0.0.0–20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
    golang.org/x/net v0.0.0–20180724234803–3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
    golang.org/x/net v0.0.0–20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
    golang.org/x/net v0.0.0–20190522155817-f3200d17e092 h1:4QSRKanuywn15aTZvI/mIDEgPQpswuFndXpOj3rKEco=
    golang.org/x/net v0.0.0–20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
    golang.org/x/sys v0.0.0–20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
    golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
    golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
    google.golang.org/appengine v1.6.0 h1:Tfd7cKwKbFRsI8RMAD3oqqw7JPFRrvFlOsfbgVkjOOw=
    google.golang.org/appengine v1.6.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
    

    这样当使用同一个库的不同版本时,可以根据 go.sum 记录的版本信息,为不同项目依赖切换对应的库版本。



喜欢的朋友记得点赞、收藏、关注哦!!!


http://www.kler.cn/a/371283.html

相关文章:

  • Linux开放端口问题(同一局域网)
  • leetcode 75-13 k和数对的最大数目
  • 蓝海创意云入选中国夏衍电影学会工业与科技影视专业委员会成员单位
  • 666666666666666666
  • Springboot整合spring-boot-starter-data-elasticsearch
  • 2024.10.25 软考学习笔记(知识点)
  • 17 Docker容器存储架构:docker存储持久化-bind mount
  • 计算机视觉-Harris特征点检测实验报告
  • c++11新语法(上)
  • Python bs4 结合 Scrapy,进行数据爬取和处理
  • 利用游戏引擎的优势
  • windows 驱动实例分析系列: NDIS 6.0的Filter 驱动改造(四)
  • Educational Codeforces Round 171 (Rated for Div. 2)(A~D题题解)
  • ChatGPT、Python和OpenCV支持下的空天地遥感数据识别与计算——从0基础到15个案例实战
  • Ubuntu22.04环境搭建MQTT服务器
  • 【Spring框架】Spring框架的开发方式
  • 短视频矩阵系统源代码开发|技术源代码部署/OEM贴牌搭建
  • electron知识整理和问题汇总
  • Data+AI时代下,如何做数字化转型升级!
  • 【MySQL】 运维篇—备份与恢复:使用mysqldump进行数据库备份与恢复
  • 开源一款前后端分离的企业级网站内容管理系统,支持站群管理、多平台静态化,多语言、全文检索的源码
  • IDEA连接EXPRESS版本的SQL server数据库
  • QT交互界面:实现按钮运行脚本程序
  • conda、virtualenv, venv分别是什么?它们之间有什么区别?
  • (青牛科技)双通道H桥电机驱动芯片GC8548 12V双通道全桥驱动芯片GC8548兼容LV8548
  • Skywalking教程一