gpushare-scheduler-extender 升级依赖引发关于 golang dep 工具的思考
gpushare-scheduler-extender 依赖的 go package 升级带来的问题
gpushare-scheduler-extender 的依赖软件包默认是 kubernetes 1.11,版本较低,需要升级。该项目使用 dep
来管理软件包,我们之前使用过 dep,但是没有非常仔细的使用过。
dep 主要有 4 个命令:
- dep init
- dep status
- dep ensure
- dep check
当你有一个全新的项目时,请使用 dep init
来构建你的依赖,执行后,会在项目中生成 Gopkg.lock
、Gopkg.toml
,同时所有的依赖包都在 vendor
下面。
但是通常,中国特色的开发基本上基于开源项目,而开源项目因为种种原因依赖的 go package 会非常的旧,导致出现一系列问题,我们就需要使用 dep ensure -v
来升级这些旧的依赖包。
# gpushare-scheduler-extender 的 Gopkg.toml 节选
[[constraint]]
name = "k8s.io/kubernetes"
version = "v1.11.2"
[[constraint]]
name = "k8s.io/apimachinery"
branch = "release-1.11"
[[constraint]]
name = "k8s.io/client-go"
version = "~v8.0.0"
[[override]]
name = "k8s.io/api"
version = "kubernetes-1.11.2"
我们需要将其升级到 1.15.0
升级详解
总的来说,非常的简单:
- 修改 Gopkg.toml
- 执行
dep ensure -v
升级依赖 - 执行
dep status
查看依赖
原始 Gopkg.toml
[root@localhost gpushare-scheduler-extender]# cat Gopkg.toml
# Dependency rules: constraints and overrides allow the user to specify which versions of dependencies are acceptable, and where they should be retrieved from.
# 你依赖哪个版本的 go package?从哪里能获得到?
# Dependency rules: [[constraint]] and [[override]]
[[constraint]]
# name 就是 go package 的名称(go get 能够下载的地址)
name = "k8s.io/kubernetes"
# 下面 3 选 1
# version = "1.0.0" github 项目中的 tag
# branch = "master" github 中的 branch
# revision = "abc123" github 中的 commit
version = "v1.11.2"
# 下载的额外来源,以这个为准,一般不用
# source = "https://github.com/myfork/package.git"
# 没用过,不知道
#[metadata]
#key1 = "XXX"
#system1-data = "value that is used by a system"
#system2-data = "value that is used by another system"
[[constraint]]
name = "k8s.io/apimachinery"
branch = "release-1.11"
[[constraint]]
name = "k8s.io/client-go"
# version 的规则
* `=`: equal
* `!=`: not equal
* `>`: greater than
* `<`: less than
* `>=`: greater than or equal to
* `<=`: less than or equal to
* `-`: literal range. E.g., 1.2 - 1.4.5 is equivalent to >= 1.2, <= 1.4.5
* `~`: minor range. E.g., ~1.2.3 is equivalent to >= 1.2.3, < 1.3.0
* `^`: major range. E.g., ^1.2.3 is equivalent to >= 1.2.3, < 2.0.0
* `[xX*]`: wildcard. E.g., 1.2.x is equivalent to >= 1.2.0, < 1.3.0
version = "~v8.0.0"
# constraint 和 override 的区别
# 个人的理解是,constraint 填写的项目中,会依赖其他项目,这些所有的相关性依赖都必须遵守
# 如果有两个 constraint 中依赖同一个项目,但是版本不同,则需要使用 override 明确这个依赖的版本是什么
[[override]]
name = "k8s.io/api"
version = "kubernetes-1.11.2"
[[override]]
name = "github.com/gregjones/httpcache"
revision = "787624de3eb7bd915c329cba748687a3b22666a6"
[[override]]
name = "golang.org/x/time"
revision = "f51c12702a4d776e4c1fa9b0fabab841babae631"
[[override]]
name = "github.com/docker/docker"
revision = "4f3616fb1c112e206b88cb7a9922bf49067a7756"
[[override]]
name = "github.com/docker/distribution"
revision = "edc3ab29cdff8694dd6feb85cfeb4b5f1b38ed9c"
# 排除掉一些 packages,全局性的
# https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md#prune
[prune]
go-tests = true
unused-packages = true
# required and ignored
# https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md#package-graph-rules-required-and-ignored
# 我个人的理解是,我们依赖一个项目(project),但是往往只依赖这个项目中的几个 packages,而不是所有,因此,可以指定我要依赖这个项目的哪个package,或者哪个 packages 我是肯定不需要的
执行原始 dep ensure -v
[root@localhost gpushare-scheduler-extender]# dep ensure -v
# Gopkg.lock is out of sync with Gopkg.toml and project imports:
k8s.io/apimachinery/pkg/labels: imported or required, but missing from Gopkg.lock's input-imports
Root project is "github.com/AliyunContainerService/gpushare-scheduler-extender"
7 transitively valid internal packages
19 external packages imported from 6 projects
(0) ✓ select (root)
(1) ? attempt github.com/comail/colog with 1 pkgs; at least 1 versions to try
(1) try github.com/comail/colog@master
(1) ✓ select github.com/comail/colog@master w/1 pkgs
(2) ? attempt github.com/julienschmidt/httprouter with 1 pkgs; at least 1 versions to try
(2) try github.com/julienschmidt/httprouter@v1.2.0
(2) ✓ select github.com/julienschmidt/httprouter@v1.2.0 w/1 pkgs
(3) ? attempt k8s.io/api with 1 pkgs; at least 1 versions to try
(3) try k8s.io/api@kubernetes-1.11.2
(3) ✓ select k8s.io/api@kubernetes-1.11.2 w/1 pkgs
(4) ? attempt github.com/gogo/protobuf with 2 pkgs; at least 1 versions to try
(4) try github.com/gogo/protobuf@v1.1.1
(4) ✓ select github.com/gogo/protobuf@v1.1.1 w/2 pkgs
(5) ? attempt k8s.io/apimachinery with 6 pkgs; at least 1 versions to try
(5) try k8s.io/apimachinery@release-1.11
(5) ✓ select k8s.io/apimachinery@release-1.11 w/22 pkgs
(6) ? attempt github.com/google/gofuzz with 1 pkgs; at least 1 versions to try
(6) try github.com/google/gofuzz@master
(6) ✓ select github.com/google/gofuzz@master w/1 pkgs
(7) ? attempt golang.org/x/net with 1 pkgs; at least 1 versions to try
(7) try golang.org/x/net@master
(7) ✓ select golang.org/x/net@master w/4 pkgs
(8) ? revisit k8s.io/apimachinery to add 4 pkgs
(8) ✓ include 11 more pkgs from k8s.io/apimachinery@release-1.11
(8) ? attempt k8s.io/client-go with 9 pkgs; at least 1 versions to try
(9) try k8s.io/client-go@v8.0.0
(9) ✓ select k8s.io/client-go@v8.0.0 w/124 pkgs
(9) ? revisit k8s.io/api to add 28 pkgs
(10) ✓ include 29 more pkgs from k8s.io/api@kubernetes-1.11.2
(9) ? attempt github.com/googleapis/gnostic with 1 pkgs; at least 1 versions to try
(11) try github.com/googleapis/gnostic@v0.2.0
(11) ✓ select github.com/googleapis/gnostic@v0.2.0 w/3 pkgs
(10) ? revisit k8s.io/apimachinery to add 18 pkgs
(12) ✓ include 40 more pkgs from k8s.io/apimachinery@release-1.11
(10) ? attempt github.com/davecgh/go-spew with 1 pkgs; at least 1 versions to try
(13) try github.com/davecgh/go-spew@v1.1.1
(13) ✓ select github.com/davecgh/go-spew@v1.1.1 w/1 pkgs
(11) ? attempt github.com/ghodss/yaml with 1 pkgs; at least 1 versions to try
(14) try github.com/ghodss/yaml@v1.0.0
(14) ✓ select github.com/ghodss/yaml@v1.0.0 w/1 pkgs
(12) ? attempt github.com/golang/groupcache with 1 pkgs; at least 1 versions to try
(15) try github.com/golang/groupcache@master
(15) ✓ select github.com/golang/groupcache@master w/1 pkgs
(13) ? attempt github.com/peterbourgon/diskv with 1 pkgs; at least 1 versions to try
(16) try github.com/peterbourgon/diskv@v2.0.1
(16) ✓ select github.com/peterbourgon/diskv@v2.0.1 w/1 pkgs
(14) ? attempt github.com/google/btree with 1 pkgs; at least 1 versions to try
(17) try github.com/google/btree@master
(17) ✓ select github.com/google/btree@master w/1 pkgs
(15) ? attempt k8s.io/kubernetes with 1 pkgs; at least 1 versions to try
(18) try k8s.io/kubernetes@v1.12.1
(18) ✓ select k8s.io/kubernetes@v1.12.1 w/1 pkgs
(16) ? revisit k8s.io/client-go to add 1 pkgs
(19) ✓ include 14 more pkgs from k8s.io/client-go@v8.0.0
(16) ? attempt github.com/json-iterator/go with 1 pkgs; at least 1 versions to try
(20) try github.com/json-iterator/go@v1.1.5
(20) ✓ select github.com/json-iterator/go@v1.1.5 w/1 pkgs
(17) ? attempt github.com/golang/protobuf with 2 pkgs; at least 1 versions to try
(21) try github.com/golang/protobuf@v1.2.0
(21) ✓ select github.com/golang/protobuf@v1.2.0 w/5 pkgs
(18) ? attempt github.com/spf13/pflag with 1 pkgs; at least 1 versions to try
(22) try github.com/spf13/pflag@v1.0.3
(22) ✓ select github.com/spf13/pflag@v1.0.3 w/1 pkgs
(19) ? attempt github.com/modern-go/concurrent with 1 pkgs; at least 1 versions to try
(23) try github.com/modern-go/concurrent@1.0.3
(23) ✓ select github.com/modern-go/concurrent@1.0.3 w/1 pkgs
(20) ? attempt github.com/gregjones/httpcache with 2 pkgs; at least 1 versions to try
(24) try github.com/gregjones/httpcache@787624de3eb7bd915c329cba748687a3b22666a6
(24) ✓ select github.com/gregjones/httpcache@787624de3eb7bd915c329cba748687a3b22666a6 w/2 pkgs
(21) ? attempt github.com/petar/GoLLRB with 1 pkgs; at least 1 versions to try
(25) try github.com/petar/GoLLRB@master
(25) ✓ select github.com/petar/GoLLRB@master w/1 pkgs
(22) ? revisit github.com/golang/protobuf to add 1 pkgs
(26) ✓ include 1 more pkgs from github.com/golang/protobuf@v1.2.0
(22) ? attempt golang.org/x/text with 3 pkgs; at least 1 versions to try
(27) try golang.org/x/text@v0.3.0
(27) ✓ select golang.org/x/text@v0.3.0 w/14 pkgs
(23) ? attempt github.com/modern-go/reflect2 with 1 pkgs; at least 1 versions to try
(28) try github.com/modern-go/reflect2@1.0.1
(28) ✓ select github.com/modern-go/reflect2@1.0.1 w/1 pkgs
(24) ? attempt golang.org/x/crypto with 1 pkgs; at least 1 versions to try
(29) try golang.org/x/crypto@release-branch.go1.11
(29) ✓ select golang.org/x/crypto@release-branch.go1.11 w/1 pkgs
(25) ? attempt github.com/golang/glog with 1 pkgs; at least 1 versions to try
(30) try github.com/golang/glog@master
(30) ✓ select github.com/golang/glog@master w/1 pkgs
(26) ? attempt github.com/hashicorp/golang-lru with 1 pkgs; at least 1 versions to try
(31) try github.com/hashicorp/golang-lru@v0.5.0
(31) ✓ select github.com/hashicorp/golang-lru@v0.5.0 w/2 pkgs
(27) ? attempt github.com/imdario/mergo with 1 pkgs; at least 1 versions to try
(32) try github.com/imdario/mergo@v0.3.6
(32) ✓ select github.com/imdario/mergo@v0.3.6 w/1 pkgs
(28) ? attempt golang.org/x/sys with 2 pkgs; at least 1 versions to try
(33) try golang.org/x/sys@release-branch.go1.11
(33) ✓ select golang.org/x/sys@release-branch.go1.11 w/2 pkgs
(29) ? attempt golang.org/x/time with 1 pkgs; at least 1 versions to try
(34) try golang.org/x/time@f51c12702a4d776e4c1fa9b0fabab841babae631
(34) ✓ select golang.org/x/time@f51c12702a4d776e4c1fa9b0fabab841babae631 w/1 pkgs
(30) ? revisit golang.org/x/net to add 1 pkgs
(35) ✓ include 1 more pkgs from golang.org/x/net@master
(30) ? attempt gopkg.in/inf.v0 with 1 pkgs; at least 1 versions to try
(36) try gopkg.in/inf.v0@v0.9.1
(36) ✓ select gopkg.in/inf.v0@v0.9.1 w/1 pkgs
(31) ? attempt gopkg.in/yaml.v2 with 1 pkgs; at least 1 versions to try
(37) try gopkg.in/yaml.v2@v2.2.1
(37) ✓ select gopkg.in/yaml.v2@v2.2.1 w/1 pkgs
(32) ? attempt k8s.io/kube-openapi with 1 pkgs; at least 1 versions to try
(38) try k8s.io/kube-openapi@feature-serverside-apply
(38) ✓ select k8s.io/kube-openapi@feature-serverside-apply w/1 pkgs
✓ found solution with 250 packages from 32 projects
Solver wall times by segment:
b-list-pkgs: 2.689677652s
b-gmal: 2.0545678s
b-deduce-proj-root: 1.040181941s
b-source-exists: 218.179794ms
satisfy: 136.320187ms
select-atom: 133.297563ms
b-rev-present-in: 6.873667ms
new-atom: 3.712946ms
select-root: 982.554µs
other: 144.423µs
add-atom: 86.194µs
TOTAL: 6.284024721s
(1/32) Wrote gopkg.in/inf.v0@v0.9.1
(2/32) Wrote github.com/golang/glog@master
(3/32) Wrote gopkg.in/yaml.v2@v2.2.1
(4/32) Wrote github.com/google/gofuzz@master
(5/32) Wrote golang.org/x/time@f51c12702a4d776e4c1fa9b0fabab841babae631
(6/32) Wrote github.com/peterbourgon/diskv@v2.0.1
(7/32) Wrote github.com/modern-go/concurrent@1.0.3
(8/32) Wrote github.com/julienschmidt/httprouter@v1.2.0
(9/32) Wrote github.com/gregjones/httpcache@787624de3eb7bd915c329cba748687a3b22666a6
(10/32) Wrote github.com/modern-go/reflect2@1.0.1
(11/32) Wrote github.com/davecgh/go-spew@v1.1.1
(12/32) Wrote github.com/hashicorp/golang-lru@v0.5.0
(13/32) Wrote github.com/ghodss/yaml@v1.0.0
(14/32) Wrote github.com/imdario/mergo@v0.3.6
(15/32) Wrote github.com/comail/colog@master
(16/32) Wrote github.com/google/btree@master
(17/32) Wrote github.com/golang/groupcache@master
(18/32) Wrote k8s.io/kube-openapi@feature-serverside-apply
(19/32) Wrote github.com/spf13/pflag@v1.0.3
(20/32) Wrote github.com/petar/GoLLRB@master
(21/32) Wrote github.com/json-iterator/go@v1.1.5
(22/32) Wrote github.com/golang/protobuf@v1.2.0
(23/32) Wrote golang.org/x/sys@release-branch.go1.11
(24/32) Wrote k8s.io/api@kubernetes-1.11.2
(25/32) Wrote k8s.io/apimachinery@release-1.11
(26/32) Wrote golang.org/x/crypto@release-branch.go1.11
(27/32) Wrote github.com/googleapis/gnostic@v0.2.0
(28/32) Wrote golang.org/x/net@master
(29/32) Wrote k8s.io/client-go@v8.0.0
(30/32) Wrote golang.org/x/text@v0.3.0
(31/32) Wrote github.com/gogo/protobuf@v1.1.1
(32/32) Wrote k8s.io/kubernetes@v1.12.1
执行原始 dep status
[root@localhost gpushare-scheduler-extender]# dep status
PROJECT CONSTRAINT VERSION REVISION LATEST PKGS USED
github.com/comail/colog branch master branch master fba8e7b fba8e7b 1
github.com/davecgh/go-spew v1.1.1 v1.1.1 8991bc2 v1.1.1 1
github.com/ghodss/yaml v1.0.0 v1.0.0 0ca9ea5 v1.0.0 1
github.com/gogo/protobuf v1.1.1 v1.1.1 636bf03 v1.1.1 2
github.com/golang/glog branch master branch master 23def4e 23def4e 1
github.com/golang/groupcache branch master branch master c65c006 611e8ac 1
github.com/golang/protobuf v1.2.0 v1.2.0 aa810b6 v1.2.0 5
github.com/google/btree branch master branch master 4030bb1 479b5e8 1
github.com/google/gofuzz branch master branch master 24818f7 db92cf7 1
github.com/googleapis/gnostic v0.2.0 v0.2.0 7c66326 v0.2.0 3
github.com/gregjones/httpcache 787624d (override) 787624d 2
github.com/hashicorp/golang-lru v0.5.0 v0.5.0 20f1fb7 v0.5.0 2
github.com/imdario/mergo v0.3.6 v0.3.6 9f23e2d v0.3.6 1
github.com/json-iterator/go v1.1.5 v1.1.5 1624edc v1.1.5 1
github.com/julienschmidt/httprouter v1.2.0 v1.2.0 348b672 v1.2.0 1
github.com/modern-go/concurrent 1.0.3 1.0.3 bacd9c7 1.0.3 1
github.com/modern-go/reflect2 1.0.1 1.0.1 4b7aa43 1.0.1 1
github.com/petar/GoLLRB branch master branch master 53be0d3 33fb24c 1
github.com/peterbourgon/diskv v2.0.1 v2.0.1 5f041e8 v2.0.1 1
github.com/spf13/pflag v1.0.3 v1.0.3 298182f v1.0.3 1
golang.org/x/crypto branch release-branch.go1.11 branch release-branch.go1.11 56440b8 56440b8 1
golang.org/x/net branch master branch master 9b4f9f5 daa7c04 5
golang.org/x/sys branch release-branch.go1.11 branch release-branch.go1.11 98c5dad 98c5dad 2
golang.org/x/text v0.3.0 v0.3.0 f21a4df v0.3.0 14
golang.org/x/time f51c127 (override) f51c127 1
gopkg.in/inf.v0 v0.9.1 v0.9.1 d2d2541 v0.9.1 1
gopkg.in/yaml.v2 v2.2.1 v2.2.1 5420a8b v2.2.1 1
k8s.io/api kubernetes-1.11.2 (override) kubernetes-1.11.2 2d6f90a 29
k8s.io/apimachinery branch release-1.11 branch release-1.11 def12e6 c182ff3 41
k8s.io/client-go ~8.0.0 v8.0.0 7d04d0e v8.0.0 124
k8s.io/kube-openapi branch feature-serverside-apply branch feature-serverside-apply f442ecb f442ecb 1
k8s.io/kubernetes ^1.11.2 v1.12.1 4ed3216 v1.16.2 1
修改 Gopkg.toml
我们可以看到,k8s.io/XXX 使用的都是 1.11 的内容。通过上文对 Gopkg.toml
的分析,我们应该如何修改呢?
[[constraint]]
# https://github.com/kubernetes/client-go
name = "k8s.io/client-go"
version = "=kubernetes-1.15.0"
source = "https://github.com/kubernetes/client-go.git"
[[constraint]]
# https://github.com/kubernetes/api
name = "k8s.io/api"
version = "=kubernetes-1.15.0"
source = "https://github.com/kubernetes/api.git"
[[constraint]]
# https://github.com/kubernetes/apimachinery
name = "k8s.io/apimachinery"
version = "=kubernetes-1.15.0"
source = "https://github.com/kubernetes/apimachinery.git"
[[constraint]]
# https://github.com/kubernetes/kubernetes
name = "k8s.io/kubernetes"
version = "=v1.15.0"
source = "https://github.com/kubernetes/kubernetes.git"
[[override]]
name = "github.com/gregjones/httpcache"
revision = "787624de3eb7bd915c329cba748687a3b22666a6"
[[override]]
name = "golang.org/x/time"
revision = "f51c12702a4d776e4c1fa9b0fabab841babae631"
[[override]]
name = "github.com/docker/docker"
revision = "4f3616fb1c112e206b88cb7a9922bf49067a7756"
[[override]]
name = "github.com/docker/distribution"
revision = "edc3ab29cdff8694dd6feb85cfeb4b5f1b38ed9c"
[prune]
go-tests = true
unused-packages = true
执行修改后的 Gopkg.toml
[root@localhost gpushare-scheduler-extender]# dep ensure -v
...
kubernetes-1.14.9-beta.0: Could not introduce k8s.io/api (from https://github.com/kubernetes/api.git)@kubernetes-1.14.9-beta.0, as it is not allowed by constraint =kubernetes-1.15.0 from project github.com/AliyunContainerService/gpushare-scheduler-extender.
kubernetes-1.15.0: Could not introduce k8s.io/api (from https://github.com/kubernetes/api.git)@kubernetes-1.15.0, as it is not allowed by constraint =kubernetes-1.15.0 from project github.com/AliyunContainerService/gpushare-scheduler-extender.
kubernetes-1.15.0-alpha.0: Could not introduce k8s.io/api (from https://github.com/kubernetes/api.git)@kubernetes-1.15.0-alpha.0, as it is not allowed by constraint =kubernetes-1.15.0 from project github.com/AliyunContainerService/gpushare-scheduler-extender.
...
明明 k8s.io/api (from https://github.com/kubernetes/api.git)@kubernetes-1.15.0
能够找到,为什么就不能匹配到 constraint =kubernetes-1.15.0
? 这困扰了我很久很久,我仔细阅读了官方文档 发现举的例子中,版本都是 2.0.1
、1.3.8
等,都是以数字开头的,这就引起了我的警惕,是不是不支持以字符开头的版本?
You might, for example, include a rule that specifies
version = "=2.0.0"
to pin a dependency to version 2.0.0, or constrain to minor releases with:version = "~2.1.0"
. Refer to the semver library documentation for more info.
From https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md
查看 semver 项目的说明,在 README.md 中有提示:Optionally work with a v prefix
,大胆的推测,version 一定不能支持形如 kubernetes-1.15.0
的版本。证明如下:
# 下载 semver
(nni) root@ubuntu:/home/lihao/codes/testgo# go get https://github.com/Masterminds/semver.git
# 编写测试代码
(nni) root@ubuntu:/home/lihao/codes/testgo# cat test-semver.go
package main
import (
"fmt"
"sort"
"github.com/Masterminds/semver"
)
func main() {
// 使用 kubernetes-1.14.0 这种 version
raw := []string{"kubernetes-1.15.0", "kubernetes-1.14.0", "kubernetes-1.16.4"}
vs := make([]*semver.Version, len(raw))
for i, r := range raw {
v, err := semver.NewVersion(r)
if err != nil {
fmt.Printf("Error parsing version: %s", err)
}
vs[i] = v
}
sort.Sort(semver.Collection(vs))
fmt.Println(vs)
}
# 编译
(nni) root@ubuntu:/home/lihao/codes/testgo# go build /home/lihao/codes/testgo/test-semver.go
# 执行,果然报错!
(nni) root@ubuntu:/home/lihao/codes/testgo# ./test-semver
Error parsing version: Invalid Semantic VersionError parsing version: Invalid Semantic VersionError parsing version: Invalid Semantic Versionpanic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x4c1bda]
goroutine 1 [running]:
github.com/Masterminds/semver.(*Version).Compare(0x0, 0x0, 0x5c7170)
/opt/ml/bin/work/src/github.com/Masterminds/semver/version.go:387 +0x3a
github.com/Masterminds/semver.(*Version).LessThan(...)
/opt/ml/bin/work/src/github.com/Masterminds/semver/version.go:362
github.com/Masterminds/semver.Collection.Less(...)
/opt/ml/bin/work/src/github.com/Masterminds/semver/collection.go:17
sort.insertionSort(0x51fc00, 0xc00006e2a0, 0x0, 0x3)
/usr/local/go/src/sort/sort.go:27 +0xc4
sort.quickSort(0x51fc00, 0xc00006e2a0, 0x0, 0x3, 0x4)
/usr/local/go/src/sort/sort.go:209 +0x201
sort.Sort(0x51fc00, 0xc00006e2a0)
/usr/local/go/src/sort/sort.go:218 +0x79
main.main()
/home/lihao/codes/testgo/test-semver.go:22 +0x135
如果将 raw := []string{"kubernetes-1.15.0", "kubernetes-1.14.0", "kubernetes-1.16.4"}
-> raw := []string{"v1.15.0", "v1.14.0", "v1.16.4"}
,确实可以正常运行:
(nni) root@ubuntu:/home/lihao/codes/testgo# ./test-semver
[1.14.0 1.15.0 1.16.4]
折腾我一周的问题,终于得到了解决,原来是这样....换成了下面的内容,再执行 dep ensure -v
将无报错:
[[constraint]]
# https://github.com/kubernetes/client-go
name = "k8s.io/client-go"
version = "kubernetes-1.15.0"
# 因为 kubernetes-1.15.0 = v12.0.0 因此:
# version = "=v12.0.0" 也不会出错!
source = "https://github.com/kubernetes/client-go.git"
[[constraint]]
# https://github.com/kubernetes/api
name = "k8s.io/api"
version = "kubernetes-1.15.0"
source = "https://github.com/kubernetes/api.git"
[[constraint]]
# https://github.com/kubernetes/apimachinery
name = "k8s.io/apimachinery"
version = "kubernetes-1.15.0"
source = "https://github.com/kubernetes/apimachinery.git"
[[constraint]]
# https://github.com/kubernetes/kubernetes
name = "k8s.io/kubernetes"
# 或者 version = "=v1.15.0" 也是可以的
version = "v1.15.0"
source = "https://github.com/kubernetes/kubernetes.git"
[[override]]
name = "github.com/gregjones/httpcache"
revision = "787624de3eb7bd915c329cba748687a3b22666a6"
[[override]]
name = "golang.org/x/time"
revision = "f51c12702a4d776e4c1fa9b0fabab841babae631"
[[override]]
name = "github.com/docker/docker"
revision = "4f3616fb1c112e206b88cb7a9922bf49067a7756"
[[override]]
name = "github.com/docker/distribution"
revision = "edc3ab29cdff8694dd6feb85cfeb4b5f1b38ed9c"
[prune]
go-tests = true
unused-packages = true
尝试过删去 k8s.io/api
、k8s.io/apimachinery
会报错
[[constraint]]
# https://github.com/kubernetes/client-go
name = "k8s.io/client-go"
version = "=v12.0.0"
#version = "kubernetes-1.15.0"
source = "https://github.com/kubernetes/client-go.git"
[[constraint]]
# https://github.com/kubernetes/kubernetes
name = "k8s.io/kubernetes"
version = "=v1.15.0"
source = "https://github.com/kubernetes/kubernetes.git"
[[override]]
name = "github.com/gregjones/httpcache"
revision = "787624de3eb7bd915c329cba748687a3b22666a6"
[[override]]
name = "golang.org/x/time"
revision = "f51c12702a4d776e4c1fa9b0fabab841babae631"
[[override]]
name = "github.com/docker/docker"
revision = "4f3616fb1c112e206b88cb7a9922bf49067a7756"
[[override]]
name = "github.com/docker/distribution"
revision = "edc3ab29cdff8694dd6feb85cfeb4b5f1b38ed9c"
[prune]
go-tests = true
unused-packages = true
报错内容节选
# 对于 k8s.io/api,dep 工具默认给你选了个 k8s.io/api@release-1.10
? attempt k8s.io/api with 1 pkgs; 283 versions to try
(2) try k8s.io/api@master
(2) ✗ unable to update checked out version: fatal: reference is not a tree: 0171b7c15da1e52c17b83d3e2524d0100c080d5d
(2) : command failed: [git checkout 0171b7c15da1e52c17b83d3e2524d0100c080d5d]: exit status 128
(2) try k8s.io/api@release-1.10
(2) ✓ select k8s.io/api@release-1.10 w/1 pkgs
(3) ? attempt github.com/julienschmidt/httprouter with 1 pkgs; 16 versions to try
(3) try github.com/julienschmidt/httprouter@v1.3.0
(3) ✓ select github.com/julienschmidt/httprouter@v1.3.0 w/1 pkgs
(4) ? attempt k8s.io/apimachinery with 4 pkgs; 308 versions to try
(4) try k8s.io/apimachinery@master
(4) ✗ unable to update checked out version: fatal: reference is not a tree: fee41ff082ed4e5e059da79fa0a8fb0713c67710
(4) : command failed: [git checkout fee41ff082ed4e5e059da79fa0a8fb0713c67710]: exit status 128
(4) try k8s.io/apimachinery@f2f3a405f61d
(4) ✗ unable to update checked out version: fatal: reference is not a tree: c18f71bf29474a53323469937882e0ebb873cd8c
(4) : command failed: [git checkout c18f71bf29474a53323469937882e0ebb873cd8c]: exit status 128
(4) try k8s.io/apimachinery@release-1.10
(4) ✓ select k8s.io/apimachinery@release-1.10 w/10 pkgs
# 选择 client-go v12.0.0,依赖 k8s.io/api@release-1.10 是不可以的,因此需要改变 client-go 版本,但是因为我们定死了,必须用 v12.0.0,肯定找不到合适的版本,因此出错。
# 这告诉我们一个道理,项目的重要依赖,一定要写全,否则它会给你乱选,导致问题
try k8s.io/client-go (from https://github.com/kubernetes/client-go.git)@v12.0.0
(11) ✗ k8s.io/client-go (from https://github.com/kubernetes/client-go.git)@v12.0.0 depping on k8s.io/api at release-1.10 has problem subpkg(s): k8s.io/api/auditregistration/v1alpha1 is missing k8s.io/api/autoscaling/v2beta2 is missing k8s.io/api/coordination/v1 is missing k8s.io/api/coordination/v1beta1 is missing k8s.io/api/networking/v1beta1 is missing k8s.io/api/node/v1alpha1 is missing k8s.io/api/node/v1beta1 is missing k8s.io/api/scheduling/v1 is missing k8s.io/api/scheduling/v1beta1 is missing
(10) try k8s.io/client-go (from https://github.com/kubernetes/client-go.git)@v11.0.0
(11) ✗ k8s.io/client-go (from https://github.com/kubernetes/client-go.git)@v11.0.0 not allowed by constraint 12.0.0:
(11) 12.0.0 from (root)
(10) try k8s.io/client-go (from https://github.com/kubernetes/client-go.git)@v10.0.0
(11) ✗ k8s.io/client-go (from https://github.com/kubernetes/client-go.git)@v10.0.0 not allowed by constraint 12.0.0:
执行 dep status
[root@localhost gpushare-scheduler-extender]# dep status
PROJECT CONSTRAINT VERSION REVISION LATEST PKGS USED
github.com/comail/colog branch master branch master fba8e7b fba8e7b 1
github.com/davecgh/go-spew v1.1.1 v1.1.1 8991bc2 v1.1.1 1
github.com/gogo/protobuf v1.3.1 v1.3.1 5628607 v1.3.1 2
github.com/golang/groupcache branch master branch master 611e8ac 611e8ac 1
github.com/golang/protobuf v1.3.2 v1.3.2 6c65a55 v1.3.2 5
github.com/google/go-cmp v0.3.1 v0.3.1 2d0692c v0.3.1 5
github.com/google/gofuzz v1.0.0 v1.0.0 f140a64 v1.0.0 1
github.com/googleapis/gnostic v0.3.1 v0.3.1 ab0dd09 v0.3.1 3
github.com/hashicorp/golang-lru v0.5.3 v0.5.3 7f827b3 v0.5.3 2
github.com/imdario/mergo v0.3.8 v0.3.8 1afb360 v0.3.8 1
github.com/json-iterator/go v1.1.8 v1.1.8 03217c3 v1.1.8 1
github.com/julienschmidt/httprouter v1.3.0 v1.3.0 4eec211 v1.3.0 1
github.com/modern-go/concurrent 1.0.3 1.0.3 bacd9c7 1.0.3 1
github.com/modern-go/reflect2 1.0.1 1.0.1 4b7aa43 1.0.1 1
github.com/spf13/pflag v1.0.5 v1.0.5 2e9d26c v1.0.5 1
golang.org/x/crypto branch release-branch.go1.11 branch release-branch.go1.11 56440b8 56440b8 1
golang.org/x/net branch release-branch.go1.10 branch release-branch.go1.10 0ed95ab 0ed95ab 6
golang.org/x/oauth2 branch master branch master 0f29369 0f29369 2
golang.org/x/sys branch release-branch.go1.11 branch release-branch.go1.11 98c5dad 98c5dad 2
golang.org/x/text v0.3.2 v0.3.2 342b2e1 v0.3.2 16
golang.org/x/time f51c127 (override) f51c127 1
google.golang.org/appengine v1.6.5 v1.6.5 971852b v1.6.5 7
gopkg.in/inf.v0 v0.9.1 v0.9.1 d2d2541 v0.9.1 1
gopkg.in/yaml.v2 v2.2.5 v2.2.5 f90ceb4 v2.2.5 1
k8s.io/api kubernetes-1.15.0 kubernetes-1.15.0 7cf5895 36
k8s.io/apimachinery kubernetes-1.15.0 kubernetes-1.15.0 1799e75 42
k8s.io/client-go 12.0.0 v12.0.0 78d2af7 v12.0.0 148
k8s.io/klog v1.0.0 v1.0.0 2ca9ad3 v1.0.0 1
k8s.io/kube-openapi branch feature-serverside-apply branch feature-serverside-apply f442ecb f442ecb 1
k8s.io/kubernetes 1.15.0 v1.15.0 e8462b5 v1.15.0 2
k8s.io/utils branch master branch master 2b95a09 2b95a09 3
sigs.k8s.io/yaml v1.1.0 v1.1.0 fd68e98 v1.1.0 1
总结
- go 项目使用的版本,最好是
1.x.y
或者v1.x.y
,而不要是什么kubernetes-1.x.y
这样会导致很大的问题 - 如果你依赖的项目中,真的使用了形如
kubernetes-1.x.y
的tag
,你有如下两个办法:- 使用 branch
- 依旧使用 version,但是不要加任何
=
、>=
符号,应该写成version = "kubernetes-1.x.y"
,这表明 version 必须是 kubernetes-1.x.y
- 把你知道的尽可能多的依赖写入
Gopkg.toml
文件中,否则dep ensure
会帮你瞎选(尤其是该项目的 version 命名不规范时)