import java.io 包下载_Go 包管理机制深入分析

前言

随着 Go 语言的深入使用,其依赖管理机制也一直是各位 Gopher 热衷于探讨的话题。Go 语言的源码依赖可通过 go get 命令来获取,但自动化程度不高,于是官方提供了 Dep 这样的自动化批量管理依赖的工具。虽然 Go 语言的依赖管理在很多方面还是不如人意,但整个体系正在日趋完善,本篇就将从最基本的依赖管理场景出发,一同探讨 Go 语言依赖管理的一些最佳实践。

Go 依赖管理的基本思路

在 Go 语言中,我们通过 go get 命令将 GitHub 或者 Google Code 上的代码下载到本地指定目录,然后在开发代码中通过 import 的形式引用本地的代码。

bfe757f83d8e06c3168dc039cbeeec6a.png

Go 语言可以通过直接分析代码中的 import 语句来查询依赖关系。go get 命令在执行时,就会自动解析 import 来安装所有的依赖。那么下载的依赖在本地是如何存储的呢?

这里就涉及到 Go 语言的 WORKSPACE 概念,简单来说就是通过 GOPATH 环境变量来设置 Go 代码的位置。一般来说,GOPATH 目录下会包含 pkg、src 和 bin 三个子目录,这三个目录各有用处。

bin 目录用来放置编译好的可执行文件,为了使得这里的可执行文件可以方便的运行,在 shell 中设置PATH变量。

src 目录用来放置代码源文件,在进行 import 时,是使用这个位置作为根目录的。自己编写的代码也应该放在这下面,不同的项目放在不同的目录下进行管理。

pkg 用来放置安装的包的链接对象(Object)的。这个概念有点类似于链接库,Go 会将编译出的可连接库放在这里,方便编译时链接。不同的系统和处理器架构的对象会在 pkg 存放在不同的文件夹中。

当项目在 src 目录下管理时,多个项目可能都会使用相同的依赖,如果每个项目都存一份依赖显然会带来大量的冗余,这里我们推荐一个设置 GOPATH 环境变量时的小技巧。

c950734c0fcf17320d4dd6888b52a501.png

这样第三方包就会默认放置在第一个路径中,而你可以在第二个路径下编写自己的代码,多个项目共享一份依赖。

dep - 官方 Go 依赖管理工具

dep 是 Go 语言官方提供的依赖管理工具,跟其他依赖管理工具类似,都是通过一个文件描述依赖的坐标信息,然后批量管理(下载、升级等)依赖包(源码)。dep 是一个开源项目, 大家可以在 https://github.com/golang/dep 了解详细信息,其安装方式大家可以参考官方说明,这里我们主要介绍其使用。

基本操作

通过 dep init 命令来初始化,会创建Gopkg.lock,Gopkg.toml文件和一个空的vendor目录。

我们在代码中通过 import 命令添加依赖后,通过 dep ensure 就可以下载依赖到本地 $GOPATH/src 目录下。

main.go

663c79d082d08bc72188807ad75135bd.png

Gopkg.lock

24d29f14be2cebda6e4641ca1d22f19d.png

通过 dep status 我们可以查看当前依赖引用的情况

3d72962b3de0258597a8cdd3747a8dc3.png

另外有一个 dep check 命令来检查是否存在依赖被引用,但是代码中并没有使用的情况,Go 语言对于依赖的引用比较严格,不允许引用了但是没使用的情况。从软件安全的角度考虑,这是一个很好的实践,避免引入一些安全风险。

53c9abb025db705b8a617461219365c8.png

当然,这种时候我们就需要移除本地依赖,最好不要手动删除vendor中的内容,而是通过 dep ensure -update 命令来移除。

从 dep 的目录结构,我们可以分析出 dep 的基本工作思路:

这里面有两个关键的步骤:

解析依赖

从当前项目的 import 文件中解析出整个工程的依赖情况,并结合 Gopkg.toml 定义的规则,然后将依赖关系输出给 Gopkg.lock,注意这个 lock 文件最好不要手动修改。

获取依赖

通过 Gopkg.lock 了解整个依赖关系之后,将依赖的具体内容拉取下来放到 vendor 目录中,然后执行 Go build 时从本地的 vendor 读取依赖并完成构建。

这一些都是在 dep ensure 时完成的,其实在执行这个命令时还可以传参数,最主要的是 -no-vendor 和 -vendor-only 这两个参数。

-no-vendor 参数只会导致运行 resolve 函数,结果是创建一个新的Gopkg.lock 文件,不会更新 vendor;而 -vendor-only 参数将跳过 resolve 并仅运行 vendoring 函数,导致 vendor/ 从已存在的Gopkg.lock 重新更新。

关于 dep 更多深入内容,可以参考

https://golang.github.io/dep/docs/introduction.html

总结

Go dep 目前是一款比较好用的依赖管理工具,很多比较大型的项目都在使用,从中可以学习到依赖管理的一些基本思路,对于理解其他语言,比如 NPM 的依赖管理模型也是比较有好处的。

更多精彩内容可以专注我们的在线课堂

微信搜索公众号:jfrogchina 获取课程通知

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/245230.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android进出动画有白屏,Android启动白屏原因及解决方案

如果大家碰到了这个问题,相信刚开始大家都是很委屈的吧,心里想:我什么都没干啊,就写了个setContentView就要背锅了?如果已经遇到了,不要方,这里给大家提供几个解决方案,我们APP在启动…

jenkins 插件目录_三十二张图告诉你如何用Jenkins构建SpringBoot

目录前言如何安装Jenkins?环境准备开始安装Jenkins初始化配置访问首页输入管理员密码安装插件创建管理员实例配置配置完成构建Spring Boot 项目配置JDK、maven、Git环境安装插件添加 SSH Server添加凭据新建Maven项目构建任务如何构建托管在GitLab的项目&#xff1f…

android+rom+bootloader+flash,Android ROM开发(4) bootloader 三种启动模式

Andrew Huang 转载请注明作者及网址HTC手机中用的bootloader称为HBoot,不知道是不是HTC Bootloader 之意,从官网的源码看这个bootloader不象是u-boot的改版。(当然这个也不太确定HBOOT就是完全使用与Android相同的源码)在Android 的刷机时,经常会听到SPL…

filter过滤后重新添加_每天记一个单词(第3518)filter

filter /ˈfɪltər/ n. 过滤器;点击音频收听跟读 ↓↓↓↓↓↓(中慢速带读)(音频不显示请关闭头条app后台重新打开或者更新最新版本)英英解释:something that you pass water, air etc through in order to remove unwanted substances and make it clean or suita…

openwrt dhcp 无法获取ip_如何安装Openwrt软路由系统并配置正常使用

本篇文章教大家如何安装Openwrt软路由系统并配置正常使用。首先我们需要能用来当作软路由的主板,主板要至少需要2个千兆网口,一个用作Wan,其他用作Lan.我这边用到的是ASUS-N3050I-CM-A,这块主板拥有两个千兆网口,搭载了功耗仅6w的n3050 CPU,非…

android 低功耗蓝牙,Android 低功耗(BLE)蓝牙开发说明

BLE(Bluetooth Low Energy)低功耗蓝牙兴起的原因BLE蓝牙的兴起主要是因为可穿戴设备的流行,由于传统蓝牙不能满足可穿戴设备的续航要求,因此大部分可穿戴设备采用蓝牙4.0技术,即BLE蓝牙技术。BLE的特点快速搜索、快速连接、超低功耗连接和数据…

android opencv 获取小图在大图的坐标_Android开发—基于OpenCV实现相机实时图像识别跟踪...

利用OpenCV实现实时图像识别和图像跟踪图像识别什么是图像识别图像识别,是指利用计算机对图像进行处理、分析和理解,以识别各种不同模式的目标和对像的技术。根据观测到的图像,对其中的物体分辨其类别,做出有意义的判断。利用现代…

三菱a系列motion软体_三菱M70A/64SM重要功能比较

三菱M70A/64SM重要功能比较M70A特有功能,64SM无法作到的功能往 期 精 选 1>三菱M70系统全清操作步骤2>三菱M70系统 程序传输操作步骤3>三菱M70分中对刀操作步骤4>三菱M70设置加工条件选择 介绍5>三菱M70系统 原点设定方法6>三菱M70/M700 用户参数…

手机网页转换为html文件,怎么在手机上打开HTML文件

回答:一1、我们打开XMind软件2、点击插入----超链接3、我们输入我们的网址二使用二:XMind如何分享,XMind提供非常强大的共享功能,而且在不断完善,那么大家知道XMind如何分享吗?其实操作还是简单的。1、我们…

centos 卸载_CentOS「linux」学习笔记12:磁盘管理、分区挂载卸载操作

linux基础操作:主要介绍了磁盘管理、分区挂载卸载操作。特别说明linux中磁盘表现形式:IDE硬盘在linux中表示方式为"hdx"。SCSI硬盘在linux中表示方式为"sdx"。这里的x代表磁盘号[a代表基本主磁盘(主盘)对应数字表示:1,b代…

html制作翻页效果代码,使用原生JS实现滚轮翻页效果的示例代码

一、滚轮事件当用户通过鼠标滚轮与页面交互、在垂直方向上滚动页面时,就会触发mousewheel事件,这个事件就是实现全屏切换效果需要用到的。在IE6, IE7, IE8, Opera 10, Safari 5中,都提供了 “mousewheel” 事件,而 Firefox 3.5 中…

python leetcode_Leetcode 常用算法 Python 模板

小 trickoverlap条件&#xff1a;start1 < end2 and end1 > start2 在DFS中我们说关键点是递归以及回溯&#xff0c;在BFS中&#xff0c;关键点则是状态的选取和标记树算法Binary Indexed Tree BIT 树状数组class BIT:def __init__(self, n):self.n n 1self.sums [0] …

画瀑布图_常见的招财风水画之含义

点击上方【觉悟法华】关注 风水画是指利于风水的字画&#xff0c;能起到招财、旺运、化煞等等的风水作用。那么&#xff0c;常见的招财风水画有哪些含义&#xff1f;大鹏展翅图&#xff1a;大鹏展翅图&#xff0c;通常挂在书房或者客厅&#xff0c;给人以一种“鹏程万里”、积极…

荣耀play4 pro怎么升级鸿蒙系统,华为鸿蒙系统手机型号有哪些

华为鸿蒙系统支持的手机型号有很多&#xff0c;如果你想第一时间升级鸿蒙系统&#xff0c;需要申请内测后&#xff0c;才能够下载安装升级哦&#xff01;不知道如何操作的小伙伴们&#xff0c;一起来看看趣丁网带来的华为鸿蒙os2.0系统怎么升级教程吧&#xff01;一、华为鸿蒙系…

shell脚本中取消高亮显示_Linux中强大的top命令

top命令算是最直观、好用的查看服务器负载的命令了。它实时动态刷新显示服务器状态信息&#xff0c;且可以通过交互式命令自定义显示内容&#xff0c;非常强大。在终端中输入top&#xff0c;回车后会显示如下内容&#xff1a;一、系统信息统计前五行是系统整体状态的统计信息展…

body onload 控制窗口大小 html,HTML5 对各个标签的定义与规定:body的介绍

HTML5 对各个标签的定义与规定&#xff1a;body的介绍2019年07月25日| 萬仟网IT编程| 我要评论本文主要介绍body标签... 12-06-21body元素就是就是html文档的主内容标签。可设置属性onafterprint 在打印文档之后运行脚本onbeforeprint 在文档打印之前运行脚本onbeforeonload 在…

python杨辉三角函数公式大全_python-1-杨辉三角算法总结

题目计算杨辉三角前6行。杨辉三角的三种方法求杨辉三角的前6行。1-1方法先拼凑两端的1&#xff0c;中间两两相加triangle[[1],[1,1]]for i in range(2,6): # 外层循环&#xff0c;i表示索引cur[1] # 拼头部pretriangle[i-1] # 上一行for j in range(len(pre)-1): # 内层循环&am…

html5手机电商网页设计代码_Html5网站制作,干货!20个视觉体验和内容俱佳的优秀网页设计...

如何创建一个网页&#xff1f;“Html5网站制作”和“灵感干货&#xff01;20个视觉、体验和内容俱佳的优秀网页设计”有什么关系和内在关联&#xff1f;在图片方面&#xff0c;有三个具体方案&#xff1a;图片地图、Css Sprites、内联图片三种&#xff0c;最值得关注的是 Css S…

2021 高考 成绩查询,精准预测!2021全国大学录取分数线表查询

高考分数对应大学层次等级随着各大高校的疯狂扩招&#xff0c;大学的门槛近年来越来越低&#xff0c;虽然还不至于达到普及大学的程度&#xff0c;但对于成绩不是太差的高中生而言&#xff0c;上大学确实是一件轻松加愉快的事情。在高考总分750的情况下&#xff0c;文科生551分…

python 打包工具_介绍一款Python打包工具(py2exe)

下面小编就为大家带来一篇Python之py2exe打包工具详解。小编觉得挺不错的&#xff0c;现在就分享给大家&#xff0c;也给大家做个参考。一起跟随小编过来看看吧下载Python对应版本的py2exe&#xff0c;使用这个工具可以将自己的程序打包成exe文件。使用这个工具需要写一个用于打…