go之官方依赖管理工具dep安装和使用

2023-11-01

前言
大家都知道go没有一个自己的包管理平台。社区里go的第三方包托管在各个git托管平台。需要用到包时通过go get 命令工具安装,但这个工具没有版本描述性文件,在go的世界里没有“package.json”这种文件。这个给我们带来直接的影响就是依赖放在外网,而且没有版本约束,这个月下的版本,可能下个月更新了。有道是“工欲善其事,必先利其器”,这个时候我们就需要一个依赖管理工具。
目前依赖工具有很多,如:glide、godep等。今天主要讲是官方出品的dep,注意它和godep不是一个东西。
github地址不同
godep :https://github.com/tools/godep
dep:https://github.com/golang/dep
按照Peter Bourgon博文来说,它们的作者都有相同的人,但是一个是dep是官方版本,godep是第三方工具。
选择dep有什么好处呢?
1、官方出的,不用担心更新维护问题。
2、相对来说,比其他第三方工具兼容问题要好。
还有等用过以后再补。

环境要求
Golang >= 1.9

安装
On other platforms you can use the install.sh script:

$ curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh

安装完成,查看DEP版本


$ dep version  


输出

dep:
 version     : v0.5.0
 build date  : 2018-07-26
 git hash    : 224a564
 go version  : go1.10.3
 go compiler : gc
 platform    : linux/amd64
 features    : ImportDuringSolve=false

初始化

mkdir $GOPATH/src/test
cd  $GOPATH/src/test
dep init

test目录生成如下文件

├── Gopkg.lock
├── Gopkg.toml
└── vendor

其中

  • Gopkg.lock 是生成的文件,不要手工修改 Gopkg.lock 官方文档
  • Gopkg.toml 是依赖管理的核心文件,可以生成也可以手动修改,
    一般情况下Gopkg.toml里面只定义直接依赖项,而Gopkg.lock里面除了包含Gopkg.toml中的所有项之外,还包含传递依赖项。比如我们的项目依赖项目A, 而项目A又依赖B、C,那么只有A会包含在Gopkg.toml中,而A、B、C都会定义在Gopkg.lock中。所以Gopkg.lock定义了所有依赖的项目的详细信息(commit ID和packages),使得每次build我们自己的项目时,始终基于确定不变的依赖项。Gopkg.toml 官方文档
  • vendor目录是 golang1.5 以后依赖管理目录,这个目录的依赖代码是优先加载的,类似 node 的 node_module 目录。
    三个之间的关系
    这里写图片描述

依赖管理

# 依赖管理帮助
dep help ensure
# 添加一条依赖
dep ensure -add github.com/bitly/go-simplejson
# 这里 @= 参数指定的是 某个 tag
dep ensure -add github.com/bitly/go-simplejson@=0.4.3
# 添加后一定记住执行 确保 同步
dep ensure
# 建议使用
dep ensure -v
#  删除没有用到的 package
dep prune -v

参数-v,是为了更好的查看执行过程,建议加上。

依赖更新

dep ensure -update -v 

实例
下面通过实例展示dep具体的功能
在目录$GOPATH/src/test下,创建main.go文件

package main

import (
    "net/http"
    "os"

    "github.com/gorilla/mux"
)

func main() {
    r := mux.NewRouter()
    r.Handle("/", http.FileServer(http.Dir(".")))
    http.ListenAndServe(":"+os.Getenv("PORT"), r)
}

这个时候如果直接执行更新依赖

dep ensure -update -v

你会发现Gopkg.lock没有变化,仅Gopkg.toml和vendor发生了变。
Gopkg.toml

# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'.


[[projects]]
  digest = "1:c79fb010be38a59d657c48c6ba1d003a8aa651fa56b579d959d74573b7dff8e1"
  name = "github.com/gorilla/context"
  packages = ["."]
  pruneopts = "UT"
  revision = "08b5f424b9271eedf6f9f0ce86cb9396ed337a42"
  version = "v1.1.1"

[[projects]]
  digest = "1:e73f5b0152105f18bc131fba127d9949305c8693f8a762588a82a48f61756f5f"
  name = "github.com/gorilla/mux"
  packages = ["."]
  pruneopts = "UT"
  revision = "e3702bed27f0d39777b0b37b664b6280e8ef8fbf"
  version = "v1.6.2"

[solve-meta]
  analyzer-name = "dep"
  analyzer-version = 1
  input-imports = ["github.com/gorilla/mux"]
  solver-name = "gps-cdcl"
  solver-version = 1

vendor下有一下文件

 $ tree
.
└── github.com
    └── gorilla
        ├── context
        │   ├── context.go
        │   ├── doc.go
        │   ├── LICENSE
        │   └── README.md
        └── mux
            ├── context_gorilla.go
            ├── context_native.go
            ├── doc.go
            ├── ISSUE_TEMPLATE.md
            ├── LICENSE
            ├── middleware.go
            ├── mux.go
            ├── README.md
            ├── regexp.go
            ├── route.go
            └── test_helpers.go

dep ensure -add 会更新Gopkg.toml和Gopkg.lock并安装依赖项至vendor/下,需要执行dep ensure -add ,以github.com/apodemakeles/ugo/time为例

dep ensure -add github.com/apodemakeles/ugo/time

这时候会报如下信息

"github.com/apodemakeles/ugo/time" is not imported by your project, and has been temporarily added to Gopkg.lock and vendor/.
If you run "dep ensure" again before actually importing it, it will disappear from Gopkg.lock and vendor/.

它说你没有在你的代码中使用这个新的依赖项。现在让我们来看看Gopkg.toml文件。

# Gopkg.toml example
#
# Refer to https://golang.github.io/dep/docs/Gopkg.toml.html
# for detailed Gopkg.toml documentation.
#
# required = ["github.com/user/thing/cmd/thing"]
# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"]
#
# [[constraint]]
#   name = "github.com/user/project"
#   version = "1.0.0"
#
# [[constraint]]
#   name = "github.com/user/project2"
#   branch = "dev"
#   source = "github.com/myfork/project2"
#
# [[override]]
#   name = "github.com/x/y"
#   version = "2.4.0"
#
# [prune]
#   non-go = false
#   go-tests = true
#   unused-packages = true


[prune]
  go-tests = true
  unused-packages = true


[[constraint]]
  name = "github.com/apodemakeles/ugo"
  version = "0.3.0"

这个时候Gopkg.toml文件多了[[constraint]]信息,同时在vendor文件夹和修改.lock文件中安装最新版本。这个时候执行dep ensure 会报错误

Warning: the following project(s) have [[constraint]] stanzas in Gopkg.toml:

  ✗  github.com/apodemakeles/ugo

However, these projects are not direct dependencies of the current project:
they are not imported in any .go files, nor are they in the 'required' list in
Gopkg.toml. Dep only applies [[constraint]] rules to direct dependencies, so
these rules will have no effect.

Either import/require packages from these projects so that they become direct
dependencies, or convert each [[constraint]] to an [[override]] to enforce rules
on these projects, if they happen to be transitive dependencies.

如果不想报错只需import代码中的依赖项,如下所示:

import "github.com/apodemakeles/ugo/time"

然后执行dep ensure。
一般在项目中新增代码,只需执行dep ensure,它将在vendor文件夹和修改.lock文件中安装最新版本。

查看依赖状态

通过执行dep status命令,将列出您的应用程序中使用的版本以及开发人员发布的最新版本。

PROJECT                     CONSTRAINT  VERSION  REVISION  LATEST  PKGS USED
github.com/gorilla/context  v1.1.1      v1.1.1   08b5f42   v1.1.1  1  
github.com/gorilla/mux      v1.6.2      v1.6.2   e3702be   v1.6.2  1 

删除依赖

修改Gopkg.toml文件相应内容,同时要保证代码中没有引用,再执行dep ensure 或dep ensure -update 均可。
参考
https://golang.github.io/dep/docs/introduction.html
https://jjude.com/go-dep/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

go之官方依赖管理工具dep安装和使用 的相关文章

随机推荐

  • Eureka的黑白名单过滤机制(Eureka的注册黑白名单)

    参考链接 Eureka的注册黑白名单 不过这篇博文只提供了实现思路和大致 我这边帮忙把完整代码贴出来 通过springboot的autoconfigure实现 大致思路是用自己定义的Eureka注册包装类替换原来的Eureka注册类 当Eu
  • SpaceX预计到2022年Starlink用户将达到2000万,但最终达到了100万

    SpaceX的Starlink部门还没有接近实现客户和收入的预测 该公司在建立卫星网络之前与投资者分享了这一点华尔街日报报道今天出版 据报道 2015年的一份题为 SpaceX用来从投资者那里筹集资金 的报告预计 到2022年 Starli
  • C++ String去除头尾空格 实现trim()方法

    虽然C 11的标准库中并没有提供trim 方法 但我们可以使用string的find first not of 和find last not of方法实现trim include
  • centos linux介绍,关于CentOS使用的简介

    CentOS对大家来说已经很熟悉 什么是CentOS呢 CentOS Community ENTerprise Operating System 是Linux发行版之一 它是来自于Red Hat Enterprise Linux依照开放源代
  • BUUCTF WEB 强网杯 2019 随便注

    1 题目 2 解题 2 1 尝试点提交 url变为 http b61f33a4 644b 402a 9da5 4bdf8043f954 node4 buuoj cn inject 1 可知传入的参数名为 inject 参数为1 2 2 尝试
  • vector中reserve与resize区别

    vector中reserve与resize区别 一 基本概念 1 capacity 指容器在分配新的存储空间之前能存储的元素总数 2 size 指当前容器所存储的元素个数 二 reserve与resize 1 区别 1 reserve 只修
  • 如何计算当前进程的CPU占用率

    由于测试一个解码器的项目 很长时间都在反复进行domain knowledge的学习 再加上自己是一个测试新手 对于测试代码撰写啥的还很是生嫩 前一阵被要求在性能测试中 最好在测试时能够计算出解码进程的CPU占用率 做为我们参考的一种性能参
  • w10 没有internet信息服务器,win10找不到“internet信息服务(IIS)管理器”怎么办...

    用户在搭建开发环境的时候 找了很久没发现 internet信息服务 IIS 管理器 那么 internet信息服务 IIS 管理器 去哪里了 如果你在win10找不到 internet信息服务 IIS 管理器 不要着急 在这里跟大家分享下具
  • shell脚本基础知识-shell中的特殊符号

    1 代表零个或多个字符或数字 test后面可以没有任何字符 也可以有多个字符 总之有或没有都能匹配出来 2 只代表一个任意的字符 不管是数字还是字母 只要是一个都能匹配出来 3 这个符号在linux中表示注释说明的意思 即 后面的内容lin
  • pip安装更换镜像

    原文链接 使用pip来安装python包有时候安装起来会非常慢 因此需要换成国内的源来加速下载 1 使用命令 以Torch为例 pip install i https pypi tuna tsinghua edu cn simple tor
  • DNS 解析顺序是怎样的?

    1 DNS 解析过程 当客户端对域名发起访问时 会将解析请求发送给递归解析服务器 递归服务器会代替客户端进行全球递归查询 首先递归服务器会请求根域名服务器 根域名服务器根据域名后缀 告知对应的顶级域名服务器 递归服务器再向顶级服务器发起请求
  • Silence - 专注于阅读的博客园主题

    最近花了点心思整理了下我的博客园主题代码 今天正式和大家分享一下 感兴趣的园友可以了解一下 主题介绍 Silence 追求大道至简的终极真理 旨在打造一个干净 专注阅读的博客主题 没有二维空间元素 不存在花里胡哨 简单概括其几个主要特点 专
  • Java面向对象编程

    在 OSI 分层模型中 把传输的比特流划分为帧 是哪一层的功能 A 物理层 B 网络层 C 数据链路层 D 传输层 答案 C 下面关于源端口地址和目标端口地址的描述中 正确的是 A 在TCP UDP传输段中 源端口地址和目的端口地址是不能相
  • Activity启动流程源码分析-浅析生命周期函数

    源码分析 接着上一篇 Activity启动流程源码分析 setContentView源码阅读 的讲解 本节介绍一下Activity的生命周期函数何时被调用 要看Activity的生命周期函数何时被调用 不得不翻阅 ActivityThrea
  • c++中string转UNIX时间戳

    最近的业务 需要用到string转UNIX时间戳 记录一下实现过程 c 代码如下 include
  • Pandas学习笔记

    Pandas学习笔记 1 Pandas介绍 1 1 认识Pandas 1 2 案例 2 Pandas 数据结构 2 1 Series 2 2 DataFram 3 Pandas的基本数据操作 3 1 索引操作 3 2 赋值 3 3 排序 4
  • 各种图论模型及其解答

    原文转自Jelline blog http blog chinaunix net uid 9112803 id 411340 html 本文用另一种思路重新组织 图论及其应用 相关知识 首先 用通俗化语言阐述了如何对事物间联系的问题进行图论
  • C++学习之空间配置器--------(二级空间配置器)

    二级空间配置器 出现的原因 二级空间配置器的原理 二级空间配置器的底层代码解析 出现的原因 原因 由于我们申请的空间有时会太小 而频繁的去申请这样的小空间就会造成太多小额区块造成的内存碎片 对于这些小额区块所带来的不仅仅是内存碎片 更是配置
  • python每日一练-合并两个有序的链表(超详细讲解)

    先来看题 首先对于链表我也是首次接触 所以自己取学习了一下关于链表的知识 首先我们先来看题目 因为本题目需要使用到递归的方法 所以我们首先先来介绍一下什么是递归 递归又是怎么用的 函数在运行时调用自己 这个函数就是递归函数 调用的过程就叫做
  • go之官方依赖管理工具dep安装和使用

    前言 大家都知道go没有一个自己的包管理平台 社区里go的第三方包托管在各个git托管平台 需要用到包时通过go get 命令工具安装 但这个工具没有版本描述性文件 在go的世界里没有 package json 这种文件 这个给我们带来直接