>  기사  >  백엔드 개발  >  golang 종속성 관리 모드에 대한 자세한 설명

golang 종속성 관리 모드에 대한 자세한 설명

藏色散人
藏色散人앞으로
2021-04-08 16:03:502300검색

다음 튜토리얼 칼럼인 golang에서는 golang 의존성 관리 모드를 소개하겠습니다. 필요한 친구들에게 도움이 되길 바랍니다!

golang 종속성 관리 모드에 대한 자세한 설명

golang 종속성 관리 mod

go에는 해당 종속성을 직접 얻을 수 있는 go get 명령이 내장되어 있습니다. 매우 편리하지만 버전 유지 및 관리가 없다는 점이 큰 문제이고, 버전이 일치하지 않으면 다양한 호환성 문제가 발생할 수 있어 dep 및 <code>glide 그 중 최고인 Go 1.11에서 공식은 마침내 자체 종속성 관리 도구인 mod를 출시했으며 이는 Go 버전에 내장되었습니다. >go mod는 사용하기 쉽고 강력하며 가능합니다. 대부분의 이전 타사 도구와 자동으로 호환되며 수많은 우수한 오픈 소스 라이브러리가 go mod로 전환되었습니다. 이는 세계를 통합할 수 있는 잠재력을 가지고 있습니다go get 命令,可以直接获取对应的依赖,非常方便,但是有一个巨大的缺陷,没有版本的维护和管理,而版本不一致可能会导致各种兼容性问题,因此出现了很多第三方依赖管理工具,depglide 就是其中的佼佼者,到了 go 1.11 官方终于推出了自己的依赖管理工具 mod,并内置在 go 版本中,go mod 使用简单,功能强大,并且能自动兼容大多数之前的第三方工具,大量优秀的开源库都已经切换到了 go mod,大有一统江湖之势

GO111MODULE

一个最大的变化是 golang 的项目终于不再依赖 $GOPATH 目录了,之前的项目由于 import 机制问题,所有项目都位于 $GOPATH/src 目录下,虽然也没有太大的问题,但总是让人感觉很怪,go 1.11 终于调整了这个问题,将代码从 $GOPATH 中迁出了,为了兼容之前研发模式,也仍然支持放到 $GOPATH 下,通过 GO111MODULE 环境变量控制

  • GO111MODULE=off: 关闭 mod,查找 vendor 目录和 $GOPATH 路径下的依赖
  • GO111MODULE=on: 开启 mod, 仅根据 go.mod 下载和查找依赖
  • GO111MODULE=auto: 默认值,在非 $GOPATH 路径并且包含 go.mod 的项目中才开启 mod

主要命令

go mod init     # 在新的 go 项目中执行,自动分析依赖,创建 go.sum
go mod tidy     # 自动分析依赖,并自动添加和删除依赖
go mod vendor   # 创建 vendor 目录,将依赖拷贝到当前的 vendor 文件夹下
go mod download # 手动下载依赖
  1. 对于一个新的 go 项目,只需要新建项目的时候执行一下 go mod init
  2. 之后每次库更新,只需要先在代码中 import 对应库,然后执行 go mod tidy 即可(也可用 go mod download 手动下载)

库版本更换

手动修改 go.mod 文件中的 require 字段,重新执行 go mod tidy 即可

require (
    github.com/gin-gonic/gin v1.4.0
)

golang 的版本使用以 v 开头的三位版本号,其中第一位表示有重大本本的更新,当发布一个 v2+ 版本的库时,module my-module 应该改为 module my-module/v2,否则引入该库需要在增加 +incompatible 后缀

require (
    github.com/lestrrat-go/file-rotatelogs v2.2.0+incompatible
)

解决 GFW 问题

因为一些原因,国内的网络访问不到 golang.org 上的库,好在大部分库在 github 上都有镜像,可以用 replace 命令设置镜像,下面是我碰到的一些库

replace (
    cloud.google.com/go => github.com/googleapis/google-cloud-go v0.0.0-20190603211518-c8433c9aaceb
    go.etcd.io/bbolt => github.com/etcd-io/bbolt v1.3.4-0.20191001164932-6e135e5d7e3d
    go.uber.org/atomic => github.com/uber-go/atomic v1.4.1-0.20190731194737-ef0d20d85b01
    go.uber.org/multierr => github.com/uber-go/multierr v1.2.0
    go.uber.org/zap => github.com/uber-go/zap v1.10.1-0.20190926184545-d8445f34b4ae
    golang.org/x/crypto => github.com/golang/crypto v0.0.0-20190605123033-f99c8df09eb5
    golang.org/x/exp => github.com/golang/exp v0.0.0-20190510132918-efd6b22b2522
    golang.org/x/image => github.com/golang/image v0.0.0-20190523035834-f03afa92d3ff
    golang.org/x/lint => github.com/golang/lint v0.0.0-20190409202823-959b441ac422
    golang.org/x/mobile => github.com/golang/mobile v0.0.0-20190607214518-6fa95d984e88
    golang.org/x/net => github.com/golang/net v0.0.0-20190606173856-1492cefac77f
    golang.org/x/oauth2 => github.com/golang/oauth2 v0.0.0-20190604053449-0f29369cfe45
    golang.org/x/sync => github.com/golang/sync v0.0.0-20190423024810-112230192c58
    golang.org/x/sys => github.com/golang/sys v0.0.0-20190602015325-4c4f7f33c9ed
    golang.org/x/text => github.com/golang/text v0.3.2
    golang.org/x/time => github.com/golang/time v0.0.0-20190308202827-9d24e82272b4
    golang.org/x/tools => github.com/golang/tools v0.0.0-20190608022120-eacb66d2a7c3
    google.golang.org/api => github.com/googleapis/google-api-go-client v0.6.0
    google.golang.org/appengine => github.com/golang/appengine v1.6.1
    google.golang.org/genproto => github.com/google/go-genproto v0.0.0-20190605220351-eb0b1bdb6ae6
    google.golang.org/grpc => github.com/grpc/grpc-go v1.21.1
)

GO 1.12 之后支持了一个新的环境变量 GOPROXY,用来设置依赖的代理地址,有两个共用的地址:社区的 goproxy.io 和又拍云的 goproxy.cn,亲测好用

export GO111MODULE=on
export GOPROXY=https://goproxy.io

缓存

go mod 更新依赖后会在本地缓存,缓存路径 $GOPATH/pkg/mod

IDE 支持

goland

启用 mod 配置

【Goland】→【Preference】→【Go Module (vgo)】→ 【Enable Go Modules (vgo)】→ 【OK】

启用 mod 之后,goland 会自动检查依赖,并自动更新 go.sum,从而引入依赖库,一般情况下都是好使的,偶尔不好使,手动执行下 go mod tidy 即可

vscode

vscode 好像不会自动更新,手动执行 go mod tidy

GO111MODULE

가장 큰 변화 중 하나는 마침내 golang 프로젝트가 더 이상 $GOPATH 디렉토리에 의존하지 않는다는 것입니다. code>import 메커니즘이 있기 때문에 이전 프로젝트는 모두 $GOPATH/src 디렉터리에 있었습니다. 큰 문제이긴 하지만 Go 1.11에서는 마침내 이 문제가 조정된 것 같습니다. 이전 개발 모델과의 호환성을 위해 $GOPATH 아래에 코드를 넣는 것을 지원하며 를 통해 제어합니다. >GO111MODULE 환경 변수
  • GO111MODULE=off: 모드를 닫고 $GOPATH에서 vendor 디렉토리와 종속성을 검색합니다. > 경로
  • GO111MODULE=on: 모드를 활성화하고 go.mod를 기반으로 하는 종속성만 다운로드하고 찾습니다.
  • GO111MODULE=auto: 기본값 value, mod만 활성화

main command
rrreee
새 go 프로젝트의 경우 새 프로젝트를 생성할 때마다 라이브러리가 업데이트될 때마다 go mod init만 실행하면 됩니다. 즉, 먼저 코드에서 해당 라이브러리를 가져온 다음 go mod tidy를 실행하면 됩니다(go mod download를 사용하여 수동으로 다운로드할 수도 있습니다)🎜 ol>🎜라이브러리 버전 변경🎜🎜go.mod 파일의 필수 필드를 수동으로 수정하고 go mod tidy를 다시 실행하세요. 🎜rrreee🎜golang 버전은 세 가지- v로 시작하는 숫자 버전 번호(첫 번째 숫자는 주요 버전을 나타냄) 라이브러리의 v2+ 버전을 릴리스할 때 module my-modulemodule my-module/v2로 변경해야 합니다. 그렇지 않으면 라이브러리에 GFW 문제를 해결하기 위해 +in Compatible 접미사🎜rrreee🎜를 추가해야 합니다🎜🎜몇 가지 이유가 있습니다 , 국내 네트워크에서는 golang.org의 라이브러리에 액세스할 수 없습니다. 다행히 대부분의 라이브러리에는 github에 미러가 있습니다. replace 명령을 사용하여 미러를 설정할 수 있습니다🎜rrreee. 🎜GO 1.12에서는 종속 프록시 주소를 설정하는 데 사용되는 새로운 환경 변수 GOPROXY를 지원합니다. 커뮤니티의 goproxy.iogoproxy.cn이라는 두 가지 공통 주소가 있습니다. code>는 개인 테스트에서 사용하기 쉽습니다. 🎜rrreee🎜caching🎜🎜go 모드는 종속성을 업데이트한 후 로컬로 캐시됩니다. 캐시 경로는 <code>$GOPATH/pkg/mod🎜🎜IDE에서 지원합니다🎜goland🎜모드 구성 활성화🎜🎜【Goland】→【Preference】→【Go Module (vgo)】 → [Go Modules (vgo) 활성화] → [OK]🎜🎜모드를 활성화하면 goland는 자동으로 종속성을 확인하고 자동으로 go.sum을 업데이트하여 종속 라이브러리를 도입합니다. 일반적으로 잘 작동하지만 때로는 그렇지 않은 경우 go mod tidy 🎜

vscode

를 수동으로 실행합니다. 🎜vscode가 자동으로 업데이트되지 않는 것 같습니다. go mod tidy를 수동으로 실행한 다음 다시 시작하여 적용하세요🎜 🎜Link🎜🎜🎜공식 웹사이트: https://blog.golang.org/using-go- module🎜🎜Go 모듈: https://blog.csdn.net/ytd7777/article/details/86898187🎜🎜goproxy.io: https://goproxy.io/🎜🎜🎜재인쇄하려면 출처를 표시해 주세요🎜이 문서 링크 : https://tech.hatlonely.com/article/56🎜🎜

위 내용은 golang 종속성 관리 모드에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제