不太喜欢写C/C++的makefile
来说说go的依赖包管理的几种方式:
1. go get xxx (官方)
拉下来的包会放在GOPATH/src目录下,如果没有src,那么会生成src目录, 简单。
2. dep/vendor (准官方,非官方)
要求项目工程的目录必须位于GOPATH/src目录或者其子目录下, 然后dep ini, dep ensurv -v搞起。 在很多项目中, 是用这种方式管理的。 最后vendor目录会生成到项目目录中, 其中包含依赖包。
3. go mod (官方, 新版本的golang中才支持)
通常(其实也可以不这样)也把工程目录放在GOPATH/src目录或者其子目录下, 然后go mod init, go mod tidy搞起。 会在GOPATH中生成pkg, 其中有mod目录,然后其中有依赖包。
来看看代码:
package main
import (
"fmt"
"github.com/apodemakeles/ugo/time"
)
func main() {
fmt.Println(utime.NowUnixTS())
}
来看看上述三种包管理方式的结果, GOPATH是~/test/mytest, 执行tree命令:
当前目录是:~/test/mytest, a.go, b.go, c.go是我写的测试代码, 代码如上:
分别用上述三种包管理方式后,执行tree命令来看看目录和文件:
.
|-- a.go
|-- pkg
| |-- darwin_amd64 ======================(这个是go get时生成的)
| | `-- github.com
| | `-- apodemakeles
| | `-- ugo
| | `-- time.a
| |-- dep ======================(这个是dep时生成的)
| | `-- sources
| | `-- https---github.com-apodemakeles-ugo
| | |-- Gopkg.lock
| | |-- Gopkg.toml
| | |-- README.md
| | |-- assert
| | | `-- uassert.go
| | |-- ctl
| | | |-- pair.go
| | | |-- pair_test.go
| | | |-- supervisor.go
| | | `-- supervisor_test.go
| | |-- st
| | | |-- queue.go
| | | |-- queue_test.go
| | | |-- sliq.go
| | | `-- sliq_test.go
| | `-- time
| | `-- utime.go
| `-- mod ======================(这个是go mod时生成的)
| |-- cache
| | |-- download
| | | `-- github.com
| | | `-- apodemakeles
| | | `-- ugo
| | | `-- @v
| | | |-- list
| | | |-- list.lock
| | | |-- v0.3.0.info
| | | |-- v0.3.0.lock
| | | |-- v0.3.0.mod
| | | |-- v0.3.0.zip
| | | `-- v0.3.0.ziphash
| | |-- lock
| | `-- vcs
| | |-- 068498352f5a03a2b062b41194c2c11551b72916629f773f715c1839d07ddd68
| | | |-- FETCH_HEAD
| | | |-- HEAD
| | | |-- config
| | | |-- description
| | | |-- hooks
| | | | |-- applypatch-msg.sample
| | | | |-- commit-msg.sample
| | | | |-- post-update.sample
| | | | |-- pre-applypatch.sample
| | | | |-- pre-commit.sample
| | | | |-- pre-push.sample
| | | | |-- pre-rebase.sample
| | | | |-- pre-receive.sample
| | | | |-- prepare-commit-msg.sample
| | | | `-- update.sample
| | | |-- info
| | | | |-- attributes
| | | | `-- exclude
| | | |-- objects
| | | | |-- 0b
| | | | | `-- d068f0b8d570f12aa127cbce953ac0090e4b52
| | | | |-- 19
| | | | | `-- 9e6158a3489fc0c2896fb5eaa3eb61009284b0
| | | | |-- 29
| | | | | |-- 4646118961a161c079acd81ea72528dbc74da4
| | | | | `-- d7613714aa66c4105faadade545f3c7c526370
| | | | |-- 40
| | | | | |-- 120f31a2aa92e25ea4bbb3137c123858a62581
| | | | | `-- 9cd32df44b4fe5c37af9c75df8073178c95e15
| | | | |-- 4b
| | | | | `-- 859edab10857ad6fce38854014df32126aedb1
| | | | |-- 66
| | | | | `-- 94943180f8f966d3b9e0a50ab4f640e7405517
| | | | |-- 68
| | | | | `-- cff4ce24d1623e4c3cc1af93c6782317635977
| | | | |-- 81
| | | | | `-- 5a0036bd88ac3ed0fa0e3085c528089140ac19
| | | | |-- 82
| | | | | |-- 59276f5c257c1a3fd939a328fbdd11ca30f341
| | | | | `-- adc92cc444a262d79a5c1bde54c11a5021c0c1
| | | | |-- a0
| | | | | `-- edbfd929c2669f1c79c7841c876e6a442f3c3b
| | | | |-- a4
| | | | | `-- 717f99eeea7028ff1939f8f7d17fceb38fbfbc
| | | | |-- a5
| | | | | `-- 5e3de522ab8f649795fb477eadbdcee2543e09
| | | | |-- be
| | | | | |-- 033ecc565052f17c95039fa94f5da6cf27ce06
| | | | | `-- f2d0092eb5e822ef996e91009ac977094a9fe8
| | | | |-- cf
| | | | | `-- 7b5e6b1f78c06fc8b8b2a86434ccdc5b34cde5
| | | | |-- d1
| | | | | `-- f43c8e9a444c010b766c7bbe5cc5032ad60bf5
| | | | |-- e2
| | | | | `-- 519cebb2ef0f4130ba4cf1a54636eeecab7aae
| | | | |-- f4
| | | | | `-- 79089a2401446fdf51ef3b06d4430af15894a6
| | | | |-- info
| | | | `-- pack
| | | |-- refs
| | | | |-- heads
| | | | `-- tags
| | | | `-- v0.3.0
| | | `-- shallow
| | |-- 068498352f5a03a2b062b41194c2c11551b72916629f773f715c1839d07ddd68.info
| | `-- 068498352f5a03a2b062b41194c2c11551b72916629f773f715c1839d07ddd68.lock
| `-- github.com
| `-- apodemakeles
| `-- ugo@v0.3.0
| |-- Gopkg.lock
| |-- Gopkg.toml
| |-- README.md
| |-- assert
| | `-- uassert.go
| |-- ctl
| | |-- pair.go
| | |-- pair_test.go
| | |-- supervisor.go
| | `-- supervisor_test.go
| |-- st
| | |-- queue.go
| | |-- queue_test.go
| | |-- sliq.go
| | `-- sliq_test.go
| `-- time
| `-- utime.go
`-- src
|-- b.go
|-- github.com ======================(这个是go get时生成的)
| `-- apodemakeles
| `-- ugo
| |-- Gopkg.lock
| |-- Gopkg.toml
| |-- README.md
| |-- assert
| | `-- uassert.go
| |-- ctl
| | |-- pair.go
| | |-- pair_test.go
| | |-- supervisor.go
| | `-- supervisor_test.go
| |-- st
| | |-- queue.go
| | |-- queue_test.go
| | |-- sliq.go
| | `-- sliq_test.go
| `-- time
| `-- utime.go
`-- yourtest
|-- Gopkg.lock ======================(这个是dep时生成的)
|-- Gopkg.toml ======================(这个是dep时生成的)
|-- c.go
|-- go.mod ======================(这个是go mod时生成的)
|-- go.sum ======================(这个是go mod时生成的)
`-- vendor ======================(这个是dep时生成的)
`-- github.com
`-- apodemakeles
`-- ugo
`-- time
`-- utime.go
个人推荐第三种用法。
另外, 在go init生成go.mod和pkg中的部分内容后, 如果直接去编译, 则类似于先执行go mod tidy了, 生成go.sum, 并自动拉下所需要的包, 放在pkg的mod中。
一目了然, 有兴趣可以看看其中重要文件的内容。
最后, 来看一个环境变量:GO111MODULE:
环境变量 GO111MODULE 开启或关闭模块支持,它有三个可选值:off、on、auto,默认值是 auto
- GO111MODULE=off 无模块支持,go 会从 GOPATH 和 vendor 文件夹寻找包。
- GO111MODULE=on 模块支持,go 会忽略 GOPATH 和 vendor 文件夹,只根据 go.mod 下载依赖。
- GO111MODULE=auto 在 GOPATH/src 外面且根目录有 go.mod 文件时,开启模块支持。
不多说。