gpt4 book ai didi

go - Golang中如何导入KFServing客户端包

转载 作者:行者123 更新时间:2023-12-04 17:16:06 27 4
gpt4 key购买 nike

我们正在使用 KFServing在我们的 kubernetes 集群中。该项目在文件夹 pkg/中提供了 InferenceService 结构和 clientset。

如何在pkg/client下导入这些包?我的代码如下:

package main
import (
"fmt"
kfs
"github.com/kubeflow/kfserving/pkg/client/clientset/versioned"
)

func main() {
var clientset *kfs.Cientset
clientset = kfs.NewForConfig(nil)
fmt.Println(clientset)
}

尝试 go mod tidy 我得到了(我需要指定版本 v0.5.1 上的开发):

    main imports
github.com/kubeflow/kfserving/pkg/client/clientset/versioned
imports
k8s.io/client-go/discovery imports
github.com/googleapis/gnostic/OpenAPIv2:
module github.com/googleapis/gnostic@latest found (v0.5.5),
but does not contain package
github.com/googleapis/gnostic/OpenAPIv2
main imports
github.com/kubeflow/kfserving/pkg/client/clientset/versioned
imports
...

尝试编译我得到的这些代码:

  a lot of errors .....

go get github.com/kubeflow/kfserving 之后我得到了:

然后我更改了 go.mod 并将 kfseving 版本从 v0.6.0 重新配置为 v0.5.1,然后重新编译这些代码,仍然出现以下错误:

go build .
go: github.com/kubeflow/kfserving@v0.5.1: missing go.sum entry; to add it:
go mod download github.com/kubeflow/kfserving

go.mod 的内容:

module main

go 1.16

require github.com/kubeflow/kfserving v0.5.1 // indirect

更新
对于 kfserving v0.4.0 一切正常

最佳答案

查看 kfserving go.mod 文件 v0.5.1,我看到 a big block of replace directives 。按照设计,replace directives“仅适用于主模块的 go.mod 文件,在其他模块中被忽略”,所以看起来 kfserving 在这里有一些技术债务,他们'重新传递给你。

我从一个空的 go.mod 文件开始,并粘贴了那些 replace 指令。然后:

$ go get -d github.com/kubeflow/kfserving/pkg/client/clientset/versioned@v0.5.1
go get: added github.com/PuerkitoBio/purell v1.1.1

go get: added sigs.k8s.io/yaml v1.2.0

.go 源文件需要一些拼写错误和不匹配类型的修复。我把它捏造成:

package main

import (
"fmt"

kfs "github.com/kubeflow/kfserving/pkg/client/clientset/versioned"
)

func main() {
var clientset *kfs.Clientset
clientset = kfs.NewForConfigOrDie(nil)
fmt.Println(clientset)
}

然后 go build 。 成功:

$ go build -o /dev/null .

现在我将运行 go mod tidy 来清理 go.modgo.sum 文件:

$ go mod tidy
go: downloading github.com/stretchr/testify v1.5.1

go: downloading github.com/jmespath/go-jmespath v0.3.0

但是等等!我仍然欠下 kfserving/go.mod 的所有技术债——没有任何解释版本选择的评论! — 我正在将技术债务转嫁给任何下游用户。让我们看看我在这里时是否可以改善这种情况。

Go 1.16 比以前的 Go 版本更好地处理 exclude 指令,所以也许我可以使用一些有针对性的 exclude 指令而不是(相当大的) 替换锤子。

我将从提交到目前为止的修复开始。 (如果不出意外,我希望能够 git diff 需求以查看发生了什么变化。)

$ git add *.go go.mod go.sum

$ git commit -m 'fixed kfserving build'
[main fd93b1d] fixed kfserving build
3 files changed, 1643 insertions(+), 2 deletions(-)
create mode 100644 go.sum

我注意到所有 replace 指令都适用于 k8s.io 路径,因此我将列出这些路径的当前版本以查看需要修复的内容:

$ go list -m k8s.io/...
k8s.io/api v0.19.2 => k8s.io/api v0.19.2
k8s.io/apiextensions-apiserver v0.19.2 => k8s.io/apiextensions-apiserver v0.19.2
k8s.io/apimachinery v0.19.2 => k8s.io/apimachinery v0.19.2
k8s.io/apiserver v0.19.2 => k8s.io/apiserver v0.19.2
k8s.io/client-go v11.0.1-0.20190805182717-6502b5e7b1b5+incompatible => k8s.io/client-go v0.19.2
k8s.io/cloud-provider v0.19.2 => k8s.io/cloud-provider v0.19.2
k8s.io/code-generator v0.19.2 => k8s.io/code-generator v0.19.2
k8s.io/component-base v0.19.2 => k8s.io/component-base v0.19.2
k8s.io/csi-translation-lib v0.19.2 => k8s.io/csi-translation-lib v0.19.2
k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14
k8s.io/klog v1.0.0 => k8s.io/klog v1.0.0
k8s.io/klog/v2 v2.2.0
k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6
k8s.io/legacy-cloud-providers v0.17.4 => k8s.io/legacy-cloud-providers v0.19.2
k8s.io/test-infra v0.0.0-20200803112140-d8aa4e063646 => k8s.io/test-infra v0.0.0-20200803112140-d8aa4e063646
k8s.io/utils v0.0.0-20200912215256-4140de9c8800 => k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89

大多数看起来不错,但有三个不匹配的版本:

k8s.io/client-go v11.0.1-0.20190805182717-6502b5e7b1b5+incompatible => k8s.io/client-go v0.19.2

k8s.io/legacy-cloud-providers v0.17.4 => k8s.io/legacy-cloud-providers v0.19.2

k8s.io/utils v0.0.0-20200912215256-4140de9c8800 => k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89

legacy-cloud-providers 只需要升级,所以应该很容易用 go get 修复——但它与这个包无关,所以我可以让它 float 到它最终的任何版本。我将把 replace 指令缩减为仅剩下的两个模块,看看我能走多远:

replace (
k8s.io/client-go => k8s.io/client-go v0.19.2
k8s.io/utils => k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89
)

现在:

$ go mod tidy

$ go build -o /dev/null .

好的,所以构建仍然很好——我已经取得了渐进的进展,所以我将其锁定:

$ git add go.mod go.sum

$ git commit -m 'go.mod: remove irrelevant replacements'
[main cdbc1db] go.mod: remove irrelevant replacements
3 files changed, 456 insertions(+), 43 deletions(-)
rewrite go.mod (85%)
create mode 100755 m

现在让我们尝试使用 exclude 指令去除不良的 client-go 版本:

$ go mod edit -exclude=k8s.io/client-go@v11.0.1-0.20190805182717-6502b5e7b1b5+incompatible

$ go list -m k8s.io/client-go
k8s.io/client-go v9.0.0+incompatible => k8s.io/client-go v0.19.2

$ go mod edit -exclude=k8s.io/client-go@v9.0.0+incompatible

$ go list -m k8s.io/client-go
k8s.io/client-go v0.19.2 => k8s.io/client-go v0.19.2

现在我处于所需的 client-go 版本,所以我可以删除 replace 指令:

$ go mod edit -dropreplace=k8s.io/client-go

$ go mod tidy

$ go build -o /dev/null .

再次锁定它:

$ git add go.mod go.sum

$ git commit -m 'go.mod: use exclude instead of replace to notch out unwanted client-go versions'
[main de69965] go.mod: use exclude instead of replace to notch out unwanted client-go versions
2 files changed, 21 insertions(+), 3 deletions(-)

现在让我们看看这个 k8s.io/utils 替换发生了什么。我怀疑它并不是真正需要的——版本会升级一点,但我敢打赌它不会破坏构建。而且,确实,它似乎很好:

$ go list -m k8s.io/utils
k8s.io/utils v0.0.0-20200912215256-4140de9c8800 => k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89

$ go mod edit -dropreplace=k8s.io/utils

$ go mod tidy

$ go build -o /dev/null .

$ go list -m k8s.io/utils
k8s.io/utils v0.0.0-20200912215256-4140de9c8800

现在我已经成功地将 replace 指令从 kfserving 减少到只有几个 exclude 指令目标缩回版本k8s.io/client-go。这是我在此过程结束时的整个 go.mod 文件:

module example.com/m

go 1.16

exclude (
k8s.io/client-go v11.0.1-0.20190805182717-6502b5e7b1b5+incompatible
k8s.io/client-go v9.0.0+incompatible
)

require github.com/kubeflow/kfserving v0.5.1

关于go - Golang中如何导入KFServing客户端包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68688752/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com