准备工作
- 1: Fork Dapr相关的仓库
- 2: 安装golang
- 3: 安装jdk/maven等
- 4: 安装配置IDE
- 5: 为lint做准备
- 6: 安装Protoc
1 - Fork Dapr相关的仓库
将 https://github.com/dapr/ 组织下的各个需要用到的仓库都 fork 一遍,如:
- https://github.com/skyao/dapr
- https://github.com/skyao/components-contrib
- https://github.com/skyao/kit
- https://github.com/skyao/go-sdk/
- https://github.com/skyao/java-sdk/
以及一些部分同学可能不需要关注的仓库:
如果已经 fork 了,注意 master 分支到最新(GitHub 页面上点 “Fetch upstream” 即可)。
注意:绝对不要在 master 分支上直接修改代码。
2 - 安装golang
版本要求
dapr 对 golang 的版本一直要求比较高,基本上是用最新版本的 golang。
具体版本要求可以查看 dapr 下的 go.mod 中的要求,如:
https://github.com/dapr/dapr/blob/master/go.mod
module github.com/dapr/dapr
go 1.20
require (......)
下载安装golang
在golang官方下载地址下载安装对应的版本即可。
安装方式参考官方安装文档:
3 - 安装jdk/maven等
如果需要开发 dapr java-sdk,则需要安装 Java SDK。
为了方便在多个 JDK 版本中切换,建议采用 sdkman 来管理 JDK 版本。
安装 sdkman
参考:
- https://skyao.io/learning-ubuntu-server/docs/development/common/sdkman.html
- https://skyao.io/learning-macos/docs/programing/common/sdkman.html
判断需要的 jdk 版本
参考java sdk 项目的 maven pom 文件设定:
https://github.com/dapr/java-sdk/blob/master/pom.xml
对 java source 和 target 的要求都是8,也就是 Java 8
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
安装 jdk 版本
TBD
sdk list java
sdk install java 11.0.20-zulu
安装 mvn
4 - 安装配置IDE
goland
IDEA 系列,一直都很好用。我长期使用 goland。
但最近为了 remote ssh改用vs code了。
备注: IDEA 系列的 remote ssh 模式是真的很难用
vs code
为了更好的利用 macbook pro m1 max ,remote ssh模式成为刚需。
在 IDEA remote ssh 不给力的情况下,只好改用 vs code。
VS code 的 remote ssh 是真方便,相比之下 IDEA 的复杂设置强太多了。
5 - 为lint做准备
golangci-lint
amd64 机器上安装
适用于 amd64 linux 和 macOS。
dapr提供了 make lint
target 来执行 golangci-lint, 如果没有安装 golangci-lint 则会报错:
$ cd dapr
$ make lint
golangci-lint run --timeout=20m
make: golangci-lint: No such file or directory
make: *** [Makefile:341: lint] Error 127
之前 dapr 用的是 v1.31 老版本,在2022年5月之后, dapr CI 中采用的是最新版本,具体是 golangci-lint v1.51.2。
TIPs: 如何知道 dapr 目前采用的是哪个版本的 golangci-lint?
请查看 dapr 仓库下的 Makefile 文件,找到下述内容:
Please use golangci-lint version v1.51.2 , otherwise you might encounter errors.
查看 .github/workflows/dapr.yml 文件,找到下述内容:
GOLANGCILINT_VER: “v1.51.2”
安装方式参考 https://golangci-lint.run/usage/install/ 。在release页面找到对应版本,主要不要直接安装最新版本:
https://github.com/golangci/golangci-lint/releases/tag/v1.51.2
linux下执行如下命令:
$ curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.51.2 # 特别注意这里一定要指定正确的版本
golangci/golangci-lint info checking GitHub for tag 'v1.51.2'
golangci/golangci-lint info installed /home/sky/work/soft/gopath/bin/golangci-lint
$ golangci-lint --version
golangci-lint has version 1.51.2 built from 3e8facb4 on 2023-02-19T21:43:54Z
切记
golangci-lint 一定要安装对应的版本!m1 macbook上安装
在 m1 macbook 上, dapr之前使用的 1.31 版本发布较早,没有提供对 m1 (也就是darwin-arm64)的支持,但最新的dapr改用 1.45.2 版本之后就支持 arm64 了,所以可以用同样的方式安装:
$ curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.52.1
golangci/golangci-lint info checking GitHub for tag 'v1.52.1'
golangci/golangci-lint info found version: 1.52.1 for v1.52.1/linux/amd64
golangci/golangci-lint info installed /home/sky/work/soft/gopath/bin/golangci-lint
$ golangci-lint --version
golangci-lint has version 1.52.1 built with go1.20.2 from d92b38cc on 2023-03-21T19:48:38Z
注意:golangci-lint 新版本似对 go 有版本要求,如果遇到报错,如我在 golang 1.17 版本下运行会报错:
$ golangci-lint --version
panic: load embedded ruleguard rules: rules/rules.go:13: can't load fmt
goroutine 1 [running]:
github.com/go-critic/go-critic/checkers.init.22()
github.com/go-critic/go-critic@v0.6.2/checkers/embedded_rules.go:46 +0x494
$ go version
go version go1.17.8 darwin/arm64
升级 golang 到新版本如 1.18 就正常了。
gofumpt
运行 lint 之后如果发现 File is not
gofumpt-ed
:
$ make lint
golangci-lint run --timeout=20m
tests/perf/utils/grpc_helpers.go:4 gofumpt File is not `gofumpt`-ed
tests/perf/utils/grpc_helpers.go:9 gofumpt File is not `gofumpt`-ed
则需要安装 gofumpt 进行文件格式,参考 https://github.com/mvdan/gofumpt :
$ go install mvdan.cc/gofumpt@latest
go: downloading golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde
go: downloading golang.org/x/sys v0.0.0-20220829200755-d48e67d00261
然后对有问题的文件执行 gofumpt :
gofumpt -w tests/perf/utils/grpc_helpers.go
goimports
运行 lint 之后如果发现 File is not
goimports-ed
:
$ make lint
golangci-lint run --timeout=20m
tests/perf/utils/grpc_helpers.go:5 goimports File is not `goimports`-ed with -local github.com/dapr/
则需要安装 goimports 对import内容进行文件格式:
go get golang.org/x/tools/cmd/goimports
手工执行
$ goimports -e -d -local github.com/dapr/ tests/perf/utils/grpc_helpers.go
diff -u tests/perf/utils/grpc_helpers.go.orig
tests/perf/utils/grpc_helpers.go
--- tests/perf/utils/grpc_helpers.go.orig 2022-04-08 22:47:08.199473748 +0800
+++ tests/perf/utils/grpc_helpers.go 2022-04-08 22:47:08.199473748 +0800
@@ -4,10 +4,11 @@
"context"
"time"
- v1 "github.com/dapr/dapr/pkg/proto/common/v1"
- runtimev1pb "github.com/dapr/dapr/pkg/proto/runtime/v1"
"google.golang.org/grpc"
"google.golang.org/protobuf/types/known/anypb"
+
+ v1 "github.com/dapr/dapr/pkg/proto/common/v1"
+ runtimev1pb "github.com/dapr/dapr/pkg/proto/runtime/v1"
)
$ goimports -w tests/perf/utils/grpc_helpers.go
配置 goland 自动执行
参考下面文章的建议:
需要修改的地方有几个,打开 goland 的 settings:
-
“Action on Save” 中,勾选 “reformat code” 和 “Optimize imports”
-
“Code Style” -> “Go” -> “Import” 中,“sorting by” 下拉框默认是 “gofmt”,修改为 “goimports”,然后勾选相关的选项
-
“Code Style” -> “Go” -> “other” 中, 勾选 “add a leading space to comments”,这会在注释内容前加一个空格
配置vs code
参考: Formatting Go code with goimports (hyr.mn)
打开 File -> Preferences -> Settings, 搜索 “format on save”,勾选:
搜索 go:format,在 format tool 中选择 goimports:
注意:
- 如果 go:format 搜索时找不到 extends / go,则应该是没有安装 go extensin,或者安装之后没有重启 vs code
- 下拉框选 goimports 时如果报错没有安装 goimports,点安装即可
参考资料
6 - 安装Protoc
Dapr 新版本中对proto文件的代码生成有了极大改进,非常方便。
Dapr 新版本中proto文件的代码生成可以简单参考官方 README 文件的说明:
https://github.com/dapr/dapr/tree/master/dapr
步骤一:安装Protoc
目前 daprd 要求的版本是 [v3.21.12 ](https://github.com/protocolbuffers/protobuf/releases/tag/v21.12)。
linux-amd64 安装
如果之前安装过其他,则需要删除已经安装的版本:
sudo rm -rf /usr/local/include/google/protobuf/
sudo rm /usr/local/bin/protoc
下载并解压缩之后,按照 readme.txt 文件的提示,复制bin文件和clude目录到合适的位置:
$ wget https://github.com/protocolbuffers/protobuf/releases/download/v21.12/protoc-21.12-linux-x86_64.zip
$ unzip protoc-21.12-linux-x86_64.zip
$ sudo cp -r include/google/ /usr/local/include/
# 需要设置权限可读和可执行,755
$ sudo chmod -R 755 /usr/local/include/google
$ sudo cp bin/protoc /usr/local/bin/
$ sudo chmod +x /usr/local/bin/protoc
验证安装结果:
$ protoc --version
libprotoc 3.21.12
Macos-amd64 安装
备注:不再更新,我已经没有intel cpu的macos了。
Macos-arm64 安装
如果之前安装过其他,则需要删除已经安装的版本:
sudo rm -rf /usr/local/include/google/protobuf/
sudo rm /usr/local/bin/protoc
下载 pr
$ wget https://github.com/protocolbuffers/protobuf/releases/download/v21.12/protoc-21.12-osx-aarch_64.zip
$ unzip protoc-21.12-osx-aarch_64.zip
$ sudo cp -r include/ /usr/local/include/
# 需要设置权限可读和可执行,755
$ sudo chmod -R 755 /usr/local/include/google
$ sudo cp bin/protoc /usr/local/bin/
$ sudo chmod +x /usr/local/bin/protoc
如果遇到macos禁止protoc运行,在设置中找到 “security & Privacy”,会有 protoc 运行的提示,点击容许即可。
protoc 安装完成之后,验证一下版本:
$ protoc --version
libprotoc 3.21.12
步骤二:初始化proto工具
安装 protoc-gen-go 和 protoc-gen-go,dapr的 make file 为此准备了专门的命令 init-proto
:
# 进入 dapr/dapr 仓库
$ cd dapr
$ make init-proto
go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.28.1
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.2.0
步骤三:从proto生成代码
终于可以开始正式的代码生成了,dapr的 make file 也为此准备了专门的命令 gen-proto
:
# 进入 dapr/dapr 仓库
$ cd dapr
$ make gen-proto
protoc --go_out=. --go_opt=module=github.com/dapr/dapr --go-grpc_out=. --go-grpc_opt=require_unimplemented_servers=false,module=github.com/dapr/dapr ./dapr/proto/common/v1/*.proto
protoc --go_out=. --go_opt=module=github.com/dapr/dapr --go-grpc_out=. --go-grpc_opt=require_unimplemented_servers=false,module=github.com/dapr/dapr ./dapr/proto/internals/v1/*.proto
protoc --go_out=. --go_opt=module=github.com/dapr/dapr --go-grpc_out=. --go-grpc_opt=require_unimplemented_servers=false,module=github.com/dapr/dapr ./dapr/proto/operator/v1/*.proto
protoc --go_out=. --go_opt=module=github.com/dapr/dapr --go-grpc_out=. --go-grpc_opt=require_unimplemented_servers=false,module=github.com/dapr/dapr ./dapr/proto/placement/v1/*.proto
protoc --go_out=. --go_opt=module=github.com/dapr/dapr --go-grpc_out=. --go-grpc_opt=require_unimplemented_servers=false,module=github.com/dapr/dapr ./dapr/proto/runtime/v1/*.proto
protoc --go_out=. --go_opt=module=github.com/dapr/dapr --go-grpc_out=. --go-grpc_opt=require_unimplemented_servers=false,module=github.com/dapr/dapr ./dapr/proto/sentry/v1/*.proto
go mod tidy
执行 git status
命令,对比一下新生成的代码和dapr 仓库中已经保存的代码,如果代码没有改动说明我们的protoc代码生成和dapr项目保持一致了。
常见错误
找不到共享文件
报错如下:
$ make gen-proto
protoc --go_out=. --go_opt=module=github.com/dapr/dapr --go-grpc_out=. --go-grpc_opt=require_unimplemented_servers=false,module=github.com/dapr/dapr ./dapr/proto/common/v1/*.proto
google/protobuf/any.proto: File not found.
dapr/proto/common/v1/common.proto:10:1: Import "google/protobuf/any.proto" was not found or had errors.
dapr/proto/common/v1/common.proto:55:3: "google.protobuf.Any" is not defined.
dapr/proto/common/v1/common.proto:76:3: "google.protobuf.Any" is not defined.
make: *** [Makefile:260:gen-proto-common] 错误 1
这个错误发生的原因通常是 protoc 安装时的 include 文件未能放置好,或者是相关的目录没有权限。经测试验证需要读和可执行权限,因此设置755:
# 需要设置权限可读和可执行,755
$ sudo chmod -R 755 /usr/local/include/google