创建工程
利用go module
创建模块
root@ubuntu:~/go_learn/proj1# go mod init demo-controller go: creating new go.mod: module demo-controller root@ubuntu:~/go_learn/proj1# ls go.mod root@ubuntu:~/go_learn/proj1# mkdir demo-controller root@ubuntu:~/go_learn/proj1#
编写pkg/api
code-generator
要求工程的目录结构满足一定的规则
- 目录结构必须为
pkg/apis/xxx/yyy/
- 包含如下文件
doc.go
register.go
types.go
hack
这部分内容,我们直接从kubernetes
官方示例(sample-controller)中拷贝即可
执行脚本创建pkg/generated
在执行脚本前,我们需要先下载一个依赖的脚本,就是update-codegen.sh
中提到的generate-groups.sh
root@ubuntu:~/go_learn/proj1/demo-controller/hack# ls boilerplate.go.txt custom-boilerplate.go.txt tools.go update-codegen.sh verify-codegen.sh root@ubuntu:~/go_learn/proj1/demo-controller/hack# cd ../../ root@ubuntu:~/go_learn/proj1# ls demo-controller go.mod root@ubuntu:~/go_learn/proj1# cd $GOPATH root@ubuntu:/opt/gopath# mkdir -p src/k8s.io root@ubuntu:/opt/gopath# cd src/k8s.io root@ubuntu:/opt/gopath/src/k8s.io# git clone https://github.com/kubernetes/code-generator.git Cloning into 'code-generator'... remote: Enumerating objects: 10133, done. remote: Counting objects: 100% (511/511), done. remote: Compressing objects: 100% (182/182), done. remote: Total 10133 (delta 340), reused 483 (delta 325), pack-reused 9622 Receiving objects: 100% (10133/10133), 9.28 MiB | 9.40 MiB/s, done. Resolving deltas: 100% (5440/5440), done. root@ubuntu:/opt/gopath/src/k8s.io# root@ubuntu:/opt/gopath/src/k8s.io# cd ~/go_learn/proj1/ root@ubuntu:~/go_learn/proj1# ls demo-controller go.mod root@ubuntu:~/go_learn/proj1# cd ~/go_learn/proj1/demo-controller/ root@ubuntu:~/go_learn/proj1/demo-controller# ls hack pkg root@ubuntu:~/go_learn/proj1/demo-controller# bash hack/update-codegen.sh go: downloading k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027 go: downloading golang.org/x/tools v0.1.2 go: downloading golang.org/x/mod v0.4.2 go: downloading golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 Generating deepcopy funcs Generating clientset for democontroller:v1 at demo-controller/pkg/generated/clientset Generating listers for democontroller:v1 at demo-controller/pkg/generated/listers Generating informers for democontroller:v1 at demo-controller/pkg/generated/informers root@ubuntu:~/go_learn/proj1/demo-controller#
root@ubuntu:~/go_learn/proj1/demo-controller# ls pkg/ apis root@ubuntu:~/go_learn/proj1/demo-controller# ls pkg/apis/ democontroller root@ubuntu:~/go_learn/proj1/demo-controller# ls pkg/apis/democontroller/ v1 root@ubuntu:~/go_learn/proj1/demo-controller# ls pkg/apis/democontroller/v1/ doc.go register.go types.go root@ubuntu:~/go_learn/proj1/demo-controller# ls hack pkg root@ubuntu:~/go_learn/proj1/demo-controller# cd .. root@ubuntu:~/go_learn/proj1# ls demo-controller go.mod root@ubuntu:~/go_learn/proj1# ls demo-controller/pkg/generated/listers ls: cannot access 'demo-controller/pkg/generated/listers': No such file or directory root@ubuntu:~/go_learn/proj1# ls demo-controller/pkg/generated/ ls: cannot access 'demo-controller/pkg/generated/': No such file or directory --什么都没有 root@ubuntu:~/go_learn/proj1# ls demo-controller/pkg/ apis root@ubuntu:~/go_learn/proj1# ls demo-controller/pkg/apis/ democontroller root@ubuntu:~/go_learn/proj1#
原来是go mod init demo-controller使用了错误的目录
root@ubuntu:~/go_learn/proj1/demo-controller# go mod init demo-controller go: creating new go.mod: module demo-controller root@ubuntu:~/go_learn/proj1/demo-controller# ls go.mod hack pkg root@ubuntu:~/go_learn/proj1/demo-controller# bash hack/update-codegen.sh Generating deepcopy funcs Generating clientset for democontroller:v1 at demo-controller/pkg/generated/clientset Generating listers for democontroller:v1 at demo-controller/pkg/generated/listers Generating informers for democontroller:v1 at demo-controller/pkg/generated/informers root@ubuntu:~/go_learn/proj1/demo-controller# ls demo-controller/pkg/generated ls: cannot access 'demo-controller/pkg/generated': No such file or directory root@ubuntu:~/go_learn/proj1/demo-controller# ls demo-controller/pkg/ ls: cannot access 'demo-controller/pkg/': No such file or directory root@ubuntu:~/go_learn/proj1/demo-controller# ls go.mod go.sum hack pkg root@ubuntu:~/go_learn/proj1/demo-controller# ls pkg/ apis generated root@ubuntu:~/go_learn/proj1/demo-controller#
root@ubuntu:~/go_learn/proj1/demo-controller# cat hack/update-codegen.sh
#!/usr/bin/env bash
# Copyright 2017 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
set -o errexit
set -o nounset
set -o pipefail
SCRIPT_ROOT=$(dirname "${BASH_SOURCE[0]}")/..
CODEGEN_PKG=${GOPATH}/src/k8s.io/code-generator
# generate the code with:
# --output-base because this script should also be able to run inside the vendor dir of
# k8s.io/kubernetes. The output-base is needed for the generators to output into the vendor dir
# instead of the $GOPATH directly. For normal projects this can be dropped.
bash "${CODEGEN_PKG}"/generate-groups.sh "deepcopy,client,informer,lister"
demo-controller/pkg/generated demo-controller/pkg/apis
democontroller:v1
# --output-base "$(dirname "${BASH_SOURCE[0]}")/../../.."
# --go-header-file "${SCRIPT_ROOT}"/hack/boilerplate.go.txt
# To use your own boilerplate text append:
# --go-header-file "${SCRIPT_ROOT}"/hack/custom-boilerplate.go.txt
更改