(免责声明:对本描述中使用的错误词语表示歉意。我仍在熟悉 go)
我的理解是,go
模块非常挑剔,因此这个问题涵盖了与 go
模块和 prometheus
运算符相关的几个主题我正在尝试下载并导入库。
一个巨大的要求:我无法进行大规模go mod
下载/升级,因为下游deps在我的 vendor 目录中升级,并且我们的代码中发生了各种破坏。我正在努力避免这种情况。我只想“安装”这个库(以及任何必要的辅助工具)并完成它。
综上所述,使用 go mod
(或其他合适的工具)获取 "github.com/coreos/prometheus-operator/pkg/apis/的正确方法是什么? Monitoring/v1"
这不会更新我的所有 vendor 库?我只需要导入 v1
api 即可以编程方式设置和读取集群中的 servicemonitor
。
$ go mod download -x github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1
module github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1: not a known dependency
或
$ go get github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1
go: found github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1 in github.com/coreos/prometheus-operator v0.41.1
我的导入
import (
"context"
"encoding/base64"
"fmt"
v1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/util/intstr"
"strings"
"text/template"
"time"
"github.com/google/uuid"
coreosv1 "github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1"
"github.com/go-kit/kit/log"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/tools/clientcmd"
)
我使用这个库的实际代码如下所示:
// define service monitor object
serviceMonitorObject := &coreosv1.ServiceMonitor{
ObjectMeta: metav1.ObjectMeta{
Name: objectMetaDataName,
// TODO: fix namespace
Namespace: "monitoring",
Labels: labels,
},
Spec: coreosv1.ServiceMonitorSpec{
Selector: metav1.LabelSelector{
MatchLabels: labels,
},
NamespaceSelector: coreosv1.NamespaceSelector{
MatchNames: []string{
"monitoring",
},
},
Endpoints: []coreosv1.Endpoint{
{
Port: "metrics",
Interval: "10s",
HonorLabels: true,
},
},
},
}
但是,我似乎不能只导入一个库。任何建议或帮助将不胜感激。
github.com/coreos/prometheus-operator v0.41.1 中的错误 github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1
表明也许我只是导入 github.com/coreos/prometheus-operator
但是当我这样做时,我的 servicemonitor
定义失败。
编辑
我rm
编辑了我的go.{mod,sum}
和vendor
目录以及git reset --hard
我的环境,将 vendor 状态恢复到我工作之前的状态。我运行了以下命令,但如您所见,get
似乎可以工作,但 /project/vendor/*/下不存在
.coreos
目录
$ go get -x github.com/coreos/prometheus-operator/
# get https://proxy.golang.org/github.com/coreos/@v/list
# get https://proxy.golang.org/github.com/@v/list
# get https://proxy.golang.org/github.com/coreos/prometheus-operator/@v/list
# get https://proxy.golang.org/github.com/@v/list: 410 Gone (0.794s)
# get https://proxy.golang.org/github.com/coreos/@v/list: 410 Gone (0.886s)
# get https://proxy.golang.org/github.com/coreos/prometheus-operator/@v/list: 200 OK (0.897s)
go: github.com/coreos/prometheus-operator upgrade => v0.41.1
$ find vendor -name '*prometheus*'
vendor/github.com/go-kit/kit/metrics/prometheus
vendor/github.com/go-kit/kit/metrics/prometheus/prometheus.go
vendor/github.com/prometheus
vendor/github.com/prometheus/client_golang/prometheus
再次重置我的环境。执行了以下操作:
$ go mod download -x github.com/coreos/prometheus-operator/...
warning: pattern "github.com/coreos/prometheus-operator/..." matched no module dependencies
$ go mod download -x github.com/coreos/prometheus-operator/
module github.com/coreos/prometheus-operator/: not a known dependency
根据文档,以下内容应显示使用的所有 mod(添加 grep core
以获得更简短的输出):
$ go list -m all | grep core
github.com/coreos/bbolt v1.3.2
github.com/coreos/etcd v3.3.10+incompatible
github.com/coreos/go-etcd v2.0.0+incompatible
github.com/coreos/go-oidc v2.2.1+incompatible
github.com/coreos/go-semver v0.3.0
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f
github.com/coreos/prometheus-operator v0.41.1
但是,我仍然无法编译:
$ make -f build/Makefile generators ims-bin-darwin && ./ims-api --config_file=/var/tmp/jim-ims-api.yaml --kubeconfig $HOME/.kube/config --populate_demo_db=true --populate_demo_file hack/demo1.yaml --debug_logging --db_debug_logging
./build/generators/api.sh
Ensuring Bin Directory (./build/generators/../../bin) Exists...
Ensuring Destination Directory ( pkg/generated/api ) Exists...
Ensuring Destination Directory ( pkg/generated/kaas-api ) Exists...
Ensuring Swagger Asset Directory ( assets/generated/swagger ) Exists...
go: inconsistent vendoring in /Users/jimconn/projects/src/ims-api:
github.com/go-kit/<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="3c5755487c4a0c120d0c120c" rel="noreferrer noopener nofollow">[email protected]</a>: is explicitly required in go.mod, but vendor/modules.txt indicates github.com/go-kit/<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="254e4c516553150b1c0b15" rel="noreferrer noopener nofollow">[email protected]</a>
github.com/golang/<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="27575548534845524167511609130916" rel="noreferrer noopener nofollow">[email protected]</a>: is explicitly required in go.mod, but vendor/modules.txt indicates github.com/golang/<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="18686a776c777a6d7e586e29362b362a" rel="noreferrer noopener nofollow">[email protected]</a>
github.com/grpc-ecosystem/<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="c6a1b4b6a5eba1a7b2a3b1a7bf86b0f7e8f7f2e8f0" rel="noreferrer noopener nofollow">[email protected]</a>: is explicitly required in go.mod, but vendor/modules.txt indicates github.com/grpc-ecosystem/<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="72150002115f1513061705130b3204435c4b5c44" rel="noreferrer noopener nofollow">[email protected]</a>
github.com/pkg/<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="630611110c11102315534d5a4d52" rel="noreferrer noopener nofollow">[email protected]</a>: is explicitly required in go.mod, but vendor/modules.txt indicates github.com/pkg/<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="284d5a5a475a5b685e1806100619" rel="noreferrer noopener nofollow">[email protected]</a>
github.com/prometheus/<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="accfc0c5c9c2d8f3cbc3c0cdc2cbecda9d829a829c" rel="noreferrer noopener nofollow">[email protected]</a>: is explicitly required in go.mod, but vendor/modules.txt indicates github.com/prometheus/<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="57343b3e3239230830383b36393017216679667967" rel="noreferrer noopener nofollow">[email protected]</a>
golang.org/x/<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="baced3d7dffacc8a948a948a97888a888a8a8e8b8c8a8f8b888b8b978283d98d8cdcd8d9de8fde8b" rel="noreferrer noopener nofollow">[email protected]</a>: is explicitly required in go.mod, but vendor/modules.txt indicates golang.org/x/<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="ff8b96929abf89cfd1cfd1cfd2cdcfcec6cfcccfc7cdcfcdc7cdc8d2c69bcdcb9ac7cdcdc8cd9dcb" rel="noreferrer noopener nofollow">[email protected]</a>
google.golang.org/<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="187f7d76686a776c77586e2836283628352a282a28282e282b292928202b21357d202d2d28292c7c2d2f2b2e" rel="noreferrer noopener nofollow">[email protected]</a>: is explicitly required in go.mod, but vendor/modules.txt indicates google.golang.org/<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="4e292b203e3c213a210e387e607e607e637c7e7f777e767f797e7e7e797e7c637b7b2b77782828282c2a7a76" rel="noreferrer noopener nofollow">[email protected]</a>
google.golang.org/<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="7c1b0e0c1f3c0a4d524e45524d" rel="noreferrer noopener nofollow">[email protected]</a>: is explicitly required in go.mod, but vendor/modules.txt indicates google.golang.org/<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="06617476654670372834352837" rel="noreferrer noopener nofollow">[email protected]</a>
gopkg.in/<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="3b425a5657154d097b4d091508150b" rel="noreferrer noopener nofollow">[email protected]</a>: is explicitly required in go.mod, but vendor/modules.txt indicates gopkg.in/<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="5128303c3d7f27631127637f637f69" rel="noreferrer noopener nofollow">[email protected]</a>
k8s.io/<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="ef8e9f86af99dfc1ded7c1dc" rel="noreferrer noopener nofollow">[email protected]</a>: is explicitly required in go.mod, but vendor/modules.txt indicates k8s.io/<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="4a2b3a230a3c7a647b7d6478" rel="noreferrer noopener nofollow">[email protected]</a>
k8s.io/<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="5f3e2f36323e3c3736313a2d261f296f716e67716c" rel="noreferrer noopener nofollow">[email protected]</a>: is explicitly required in go.mod, but vendor/modules.txt indicates k8s.io/<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="5736273e3a36343f3e3932252e1721677966607965" rel="noreferrer noopener nofollow">[email protected]</a>
k8s.io/<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="3b5857525e554f165c547b4d0b150a031508" rel="noreferrer noopener nofollow">[email protected]</a>: is explicitly required in go.mod, but vendor/modules.txt indicates k8s.io/<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="5437383d313a2079333b1422647a65637a66" rel="noreferrer noopener nofollow">[email protected]</a>
run 'go mod vendor' to sync, or use -mod=mod or -mod=readonly to ignore the vendor directory
make: *** [generators] Error 1
我运行了go modvendor
,我又回到了整个 vendor 树都被更改的情况:
$ g st
On branch expose-bm-prom
Your branch is up to date with 'origin/expose-bm-prom'.
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: assets/generated/swagger/api.swagger.json
modified: go.mod
modified: go.sum
modified: pkg/generated/api/api.pb.go
modified: pkg/generated/api/api.pb.gw.go
...
modified: vendor/sigs.k8s.io/yaml/README.md
modified: vendor/sigs.k8s.io/yaml/yaml.go
Untracked files:
(use "git add <file>..." to include in what will be committed)
vendor/github.com/cespare/
vendor/github.com/coreos/
vendor/github.com/golang/protobuf/internal/
vendor/github.com/golang/protobuf/jsonpb/decode.go
vendor/github.com/golang/protobuf/jsonpb/encode.go
...
vendor/k8s.io/client-go/util/workqueue/
vendor/sigs.k8s.io/structured-merge-diff/
vendor/sigs.k8s.io/yaml/go.mod
vendor/sigs.k8s.io/yaml/go.sum
no changes added to commit (use "git add" and/or "git commit -a")
$ g st | grep -c vendor
942 # files changed
这只是世界的现状吗?我是否无法在不对整个 vendor 树进行大量更改的情况下导入此库,这完全破坏了我的代码!这太荒谬了!
最佳答案
go get -d github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1
是添加对提供该包的模块的最新版本的依赖项的正确方法.
当go get
添加模块依赖项时,它会根据需要升级其他依赖项,以满足新模块的要求。这可能就是为什么您在运行 go modvendor
时看到很多变化的原因。
如果您想最小化这些更改,您可能需要显式选择旧版本(以便它具有旧版本的要求):
go get -d github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1@$OLD_VERSION
关于go mod download 不会下载单个库;如何在不操作整个 vendor 缓存的情况下修改导入单个库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63587509/