热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

golang中的包管理

声明:本文仅限于简书发布,其他第三方网站均为盗版,原文地址:golang中的包管理对于习惯了Java和Python的程序员来说,对于包的管理都有着比较大的期望,当然,虽然Java和

声明:本文仅限于简书发布,其他第三方网站均为盗版,原文地址: golang 中的包管理

对于习惯了 Java 和 Python 的程序员来说,对于包的管理都有着比较大的期望,当然,虽然 Java 和 Python 的包管理也是存在着一些问题,但是相比起 golang 来说,那也是好得多了。

在尝试 golang 一段时间之后,我发现 golang 的一个比较大的问题就是包管理不容易,例如我引用了一个 package:github.com/prometheus/prometheus,然后在 build 的时候先 go get -d 一遍,这里虽然 golang 可以很智能得帮我下载需要的 package,但是,下载的版本却默认是最新的。当然,这也不能怪 go get 这个命令,毕竟你也没告诉它是什么版本,所以给你个最新的也不奇怪,但是,如果我就是不要最新的怎么办?好像目前 go get 还没有这个功能(或者不能简单使用?)

golang 默认包管理

我最开始的做法是先用 go get -d 把需要的包 download 下来,然后再切换到 $GOPATH,之后再 checkout 我需要的版本,这个过程很是繁琐和无趣,非常让人沮丧。不过,好在在我搜索了一会之后,我发现 golang 也没有想象中的那么糟糕,在 Golang 1.5(现在都 1.9 了) 之后,它已经意识到这个问题了,并且给除了一个解决方案,那就是 vendor

golang 1.6 之后,golang 会默认设置环境变量 GO15VENDOREXPERIMENT1,然后当你使用 go get 时,他会在你的当前包的目录下建立一个 vendor 目录,然后将对应的 package 都 download 到这个目录下,但是,还是需要你在这个目录里面切换到你需要的版本,好处就是你切换过一次,以后就不用切换了。这样的话,当你在代码中引用一个 package 时,golang 的查找顺序是:

  • 当前包下的 vendor 目录。
  • 向上级目录查找,直到找到 src 下的 vendor 目录。
  • 在 GOPATH 下面查找依赖包。
  • 在 GOROOT 目录下查找

glide

好像使用 vendor 并没有太多得帮助到我们,一个显而易见的好处就是团队协作方面是不需要担心版本不一致了;然而,问题也很明显,我们平时开发中,每每新建一个项目就需要这么搞一遍也是挺糟心的。程序员总是懒得,所以,有人受不了这些繁琐事了,决定自己搞点大事情,所以就有了很多社区的 package manager tool,我认为目前比较有气候的是 godepglide。在浅尝了两个之后,我觉得 glide 更符合我对于 package manager tool 的期待,但是,并没有完全吻合,只是说够用了。

glide 的安装很简单,直接 brew install glide 就可以的,其他 OS 应该也差不远。装完之后,那么直接使用 glide init 或者 glide create 即可,然后你就会发现你的目录下会有一个新的 glide.yaml 的 YAML 文件,里面描述了 package 的信息,但是只是依赖信息,并没有版本信息。

此后,你需要使用 glide up 命令,它会建立 glide.lock 文件,里面会记录 package 的版本信息。例如我随便创建了一个,差不多就是这个样子:

《golang 中的包管理》

如果你需要指定版本信息,除了编辑 glide.lock 这个粗暴的方法之外,官方建议使用一个更加友善的方式就是使用这条命令:

$ glide get "github.com/gin-gonic/gin#v1.2"

我尝试了一下,之前因为 zsh 的设置问题导致使用失败,不过修改了一下之后,发现运行得还不错,和普通的 get 的区别就是后面加上了一个 # 符号,然后后面接上 版本号,如果你喜欢,加上分支名,commit id,tag 等都是可以的。

Reference

  1. golang vendor
  2. golang/go PackageManagementTools
  3. Glide: Vendor Package Management for Golang
  4. golang使用vendor目录来管理依赖包
  5. compare glide and godep
  6. 采用Glide对Golang进行包管理
  7. Golang 套件管理工具 Glide

推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • Win10 64位旗舰版的优势及特点详解
    本文详细介绍了Win10 64位旗舰版的优势及特点,包括更安全的源安装盘、永久激活方式、稳定性和硬件驱动的集成,以及人性化的维护工具和分区功能。通过阅读本文,您将了解到Win10 64位旗舰版相比其他版本的优势和特点。 ... [详细]
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • (三)多表代码生成的实现方法
    本文介绍了一种实现多表代码生成的方法,使用了java代码和org.jeecg框架中的相关类和接口。通过设置主表配置,可以生成父子表的数据模型。 ... [详细]
  • 本文介绍了自动化测试专家Elfriede Dustin在2008年的文章中讨论了自动化测试项目失败的原因。同时,引用了IDT在2007年进行的一次软件自动化测试的研究调查结果,调查显示很多公司认为自动化测试很有用,但很少有公司成功实施。调查结果表明,缺乏资源是导致自动化测试失败的主要原因,其中37%的人认为缺乏时间。 ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
author-avatar
天使的眼泪174
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有