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

[学习笔记]GoModules使用

我们为什么要使用GoModules?在不借助任何额外工具的情况下,依赖包只能手动下载。手动下载第三方包也没有版本的概念。需要配置GOPATH,协同开发需要统一依赖包。如果使用的包引






我们为什么要使用 Go Modules?
  • 在不借助任何额外工具的情况下,依赖包只能手动下载。

  • 手动下载第三方包也没有版本的概念。

  • 需要配置 GOPATH,协同开发需要统一依赖包。

  • 如果使用的包引用了其他已经转移的包,需要自己修改。

  • 第三方包和自己开发的包都在 GOPATH 下的 src 目录,比较混乱。


使用了 Go Modules 之后?
  • 依赖包自动下载。

  • 会给第三方包标上准确的版本号。

  • 项目根目录下会自动生成 go.mod 文件,列出依赖。

  • 对于转移了的包,可以使用 replace 特性进行替换。

  • 项目可以放在 GOPATH 下的 src 目录之外的地方。


以下是我配置使用 Go Modules 的过程

第一步


  • 先确保您的 golang 版本大于等于 1.12。

    go version
    //go version go1.12.9


  • 添加环境变量 GO111MODULE。

    要注意这里 GO111MODULE 可设置为三种值:


    • auto 自动模式,如果项目在 $GOPATH/src里,就会使用 $GOPATH/src 的依赖包,在$GOPATH/src之外,就会使用 go.mod 里 require 的包。

    • on 开启模式,go 1.12 后,无论项目是不是在 $GOPATH/src 里,都会使用 go.mod 里 require 的包。

    • off 关闭模式,就是原始的样子啦。


// 这里我使用的是 fish shell,配置命令如下
vim ~/.config/fish/config.fish
添加 set -x GO111MODULE on

第二步


  • $GOPATH/src 路径外,我们尝试创建一个项目。

cd ~/www/go
mkdir hello-golang && cd hello-golang
vim main.go
package main
import "fmt"
func main() {
fmt.Println("Hello, golang!")
}
go mod init my-first-go-project

  • 运行完上面的命令之后,项目根目录下会生成一个 go.mod 文件,是一个包管理文件。

    官方说明:除了 go.mod 之外,go 命令还维护一个名为 go.sum 的文件,其中包含特定模块版本内容的预期加密哈希

    go 命令使用 go.sum 文件确保项目所依赖的模块不会出现意外更改,无论是出于恶意、意外还是其他原因。 go.mod 和 go.sum 都应检入版本控制。但是这里 go.sum 不需要手工维护,所以可以不用太关注。



  • 查看一下 go.mod 文件。

    cat go.mod
    // 可以看到模块名称以及 go 的版本号
    module my-first-go-project
    go 1.12

    第三步


  • 尝试依赖一下第三方包,这里以 iris 为例。

  • 修改 main.go 文件,键入如下 iris-demo。

    package main
    import "github.com/kataras/iris"
    func main() {
    app := iris.Default()
    app.Get("/ping", func(ctx iris.Context) {
    ctx.JSON(iris.Map{
    "message": "pong",
    })
    })
    app.Run(iris.Addr(":8080"))
    }


  • 按照以前的传统方法,应该要先 go get 安装 iris 到 $GOPATH/src,但是现在我们不用这么做啦。

  • 直接运行如下命令,它会自动检查代码中依赖的包,自动下载,并且把依赖关系以及版本写入 go.mod 以及 go.sum 中。

    go run main.go

    这里如果遇到了超时的问题,需要添加 GOPROXY 环境变量,可参考 GOPROXY 官网进行配置。



  • 运行成功之后,我们再次查看 go.mod 文件

    cat go.mod
    //
    module my-first-go-project
    go 1.12
    require (
    github.com/BurntSushi/toml v0.3.1 // indirect
    github.com/Joker/jade v1.0.0 // indirect
    github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398 // indirect
    github.com/aymerick/raymond v2.0.2+incompatible // indirect
    github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385 // indirect
    github.com/fatih/structs v1.1.0 // indirect
    github.com/flosch/pongo2 v0.0.0-20190707114632-bbf5a6c351f4 // indirect
    github.com/gorilla/schema v1.1.0 // indirect
    github.com/iris-contrib/blackfriday v2.0.0+incompatible // indirect
    github.com/iris-contrib/formBinder v5.0.0+incompatible // indirect
    github.com/iris-contrib/go.uuid v2.0.0+incompatible // indirect
    github.com/json-iterator/go v1.1.7 // indirect
    github.com/kataras/golog v0.0.0-20190624001437-99c81de45f40 // indirect
    github.com/kataras/iris v11.1.1+incompatible // indirect
    github.com/kataras/pio v0.0.0-20190103105442-ea782b38602d // indirect
    github.com/klauspost/compress v1.8.3 // indirect
    github.com/klauspost/cpuid v1.2.1 // indirect
    github.com/microcosm-cc/bluemonday v1.0.2 // indirect
    github.com/ryanuber/columnize v2.1.0+incompatible // indirect
    github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect
    golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7 // indirect
    )


  • 到这里,使用 Go Modules 的一个小 Demo 就完成啦。


你可能想知道?


  • 包去哪了?

    使用 Go Modules 方式管理第三方包,第三包都被下载到了 $GOPATH/pkg/mod 目录下。



  • 版本怎么控制?

    版本可以在 go.mod 中指定,如果没有指定默认依赖最新版。可用 require 语句来依赖指定包以及版本。



  • 地址失效了怎么修复?

    在 go.mod 文件中运用 replace 来替换第三方包,例如

    replace golang.org/x/text => github.com/golang/text latest

    这样就可以完成包的替换,它就会拉github.com/golang/text 的最新版到 $GOPATH/pkg/mod/golang.org/x/text 下完成替换。






学习


推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
  • java drools5_Java Drools5.1 规则流基础【示例】(中)
    五、规则文件及规则流EduInfoRule.drl:packagemyrules;importsample.Employ;ruleBachelorruleflow-group ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • FeatureRequestIsyourfeaturerequestrelatedtoaproblem?Please ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 本文介绍了在CentOS 6.4系统中更新源地址的方法,包括备份现有源文件、下载163源、修改文件名、更新列表和系统,并提供了相应的命令。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 使用eclipse创建一个Java项目的步骤
    本文介绍了使用eclipse创建一个Java项目的步骤,包括启动eclipse、选择New Project命令、在对话框中输入项目名称等。同时还介绍了Java Settings对话框中的一些选项,以及如何修改Java程序的输出目录。 ... [详细]
author-avatar
暮年排击_967
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有