Think && Act
  • Welcome
  • OpenWRT系统
    • Remote Command Execution on GL.iNet's mini-routers
    • 配置DTS支持USB存储
    • OpenWRT procd启动过程
    • udhcpc如何绑定网络接口
    • 提交新平台补丁到OpenWRT社区
  • 无线WiFi技术
    • WiFi 四次握手分析
    • mac80211框架基础
    • How to get wirelss assoclist on MT7628
    • WPS on GL.iNet's OpenWRT
  • 密码学与安全
    • Feistel Cipher
    • 数据加密标准(DES)
    • Data Encryption Standard(DES)
    • Advanced Encryption Standard(AES)
  • 数据结构与算法
  • VPN技术
    • Using Tor on GL.iNet's mini-routers
    • Using Softether VPN on GL.iNet's mini-routers
    • Using ZeroTier on GL.iNet's mini-routers
  • Go语言
    • A Quick Guide for Go Modules
  • Shell脚本
    • Parameter Expansion ${}
    • User's Guide for Awk
  • Python语言
    • Python in Visual Studio Code
  • 投资理财
    • 【入门】股票入门基础
    • 【股初】找准股票入场时机
    • 【股初】合理规避风险
    • 【股初】“好公司”投资法
    • 【股初】财务三表分析
    • 【股初】“捡烟蒂”投资法
    • 【股初】构建白马组合
    • 【股进】选择好生意
    • 【股进】好公司——商业逻辑
  • 工具箱
    • A Guide of Visual Studio Code
    • hexo搭建博客
Powered by GitBook
On this page
  • 写在前面
  • 快速开始
  • See also

Was this helpful?

  1. Go语言

A Quick Guide for Go Modules

写在前面

在编译frp项目的时候,它依赖的golang相关库在下载时被墙了,导致编译中止。根据以往的经验,尝试手动把相关依赖git clone到GOPATH后继续编译,但是仍然失败。

打开源码目录,发现一个go.mod的文件,查了下资料才明白原来这是Go1.11的一个新特性——Go Modules,也就是Go的包依赖管理。

快速开始

在GOPATH目录外创建一个新目录:

$ mkdir -p /tmp/scratchpad/hello
$ cd /tmp/scratchpad/hello

初始化一个新模块:

$ go mod init github.com/you/hello
go: creating new go.mod: module github.com/you/hello

写段测试代码:

$ cat <<EOF > hello.go
package main

import (
    "fmt"
    "rsc.io/quote"
)

func main() {
    fmt.Println(quote.Hello())
}
EOF

编译:

$ go build
go: golang.org/x/text@v0.0.0-20170915032832-14c0d48ead0c: unrecognized import path "golang.org/x/text" (https fetch: Get https://golang.org/x/text?go-get=1: dial tcp 216.239.37.1:443: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has
failed to respond.)
go: error loading module requirements

不妙,被墙了。幸好Go Modules支持replace命令,提供导入另一个路径,可以是位于VCS (GitHub或其他地方)中的另一个模块,或者是本地的绝对、相对路径。

编辑go.mod文件,用github仓库代替golang:

cat go.mod
module github.com/kysonlok/hello

go 1.12

// Add replace directive in here
replace (
        golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c => github.com/golang/text v0.0.0-20170915032832-14c0d48ead0c
)

重新编译并运行:

$ go build
$ .\hello.exe
你好,世界。

go.mod文件会自动被更新,而且包含了依赖的明确依赖信息:

$ cat go.mod
module github.com/kysonlok/hello

go 1.12

replace golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c => github.com/golang/text v0.0.0-20170915032832-14c0d48ead0c

require rsc.io/quote v1.5.2

有了Go Modules以后,工作流应该变成这样:

  • 在.go文件用import导入依赖

  • 执行标准命令go build或者go test,将会自动更新go.mod,并且下载依赖

  • 当需要指定依赖版本的时候,可以执行诸如这样的命令go get foo@v1.2.3, go get foo@master, go get foo@e3702bed2,或者直接编辑go.mod文件

简单介绍我们可能常会用到的功能:

  • go list -m all: 查看构建中直接或者间接依赖的packages的当前版本

  • go list -u -m all: 查看直接或者间接依赖的packages的最新版本

  • go get -u or go get -u=patch: 更新直接或者间接依赖的pakages到最新版本

  • go build ./... or go test ./...: 在模块的跟目录执行时,构建并且测试模块中的所有pakages

  • go mod tidy: 从go.mod中删除任何不再需要的依赖项

  • replace指令 or gohack: 用另外一个版本代替自动推导的版本,可以是源于不同的repo

  • go mod vendor: 创建vendor目录,并且把直接或者间接依赖的packages复制到该目录下

好了,先Mark到这里。

See also

PreviousGo语言NextShell脚本

Last updated 5 years ago

Was this helpful?

Go Modules