这是本节的多页打印视图。 点击此处打印.

返回本页常规视图.

准备工作

进行Dapr开发前的准备工作

1 - Fork Dapr相关的仓库

Fork Dapr相关的仓库,以便修改和提交PR

https://github.com/dapr/ 组织下的各个需要用到的仓库都 fork 一遍,如:

以及一些部分同学可能不需要关注的仓库:

如果已经 fork 了,注意 master 分支到最新(GitHub 页面上点 “Fetch upstream” 即可)。

注意:绝对不要在 master 分支上直接修改代码。

2 - 安装golang

安装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官方下载地址下载安装对应的版本即可。

https://golang.org/dl/

安装方式参考官方安装文档:

https://go.dev/doc/install

3 - 安装jdk/maven等

[可选]安装jdk/maven等Java开发工具

如果需要开发 dapr java-sdk,则需要安装 Java SDK。

为了方便在多个 JDK 版本中切换,建议采用 sdkman 来管理 JDK 版本。

安装 sdkman

参考:

判断需要的 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

安装配置用于dapr开发的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、gofumpt、goimports

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

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”

    goland

  • “Code Style” -> “Go” -> “Import” 中,“sorting by” 下拉框默认是 “gofmt”,修改为 “goimports”,然后勾选相关的选项

    goland2

  • “Code Style” -> “Go” -> “other” 中, 勾选 “add a leading space to comments”,这会在注释内容前加一个空格

goland3

配置vs code

参考: Formatting Go code with goimports (hyr.mn)

打开 File -> Preferences -> Settings, 搜索 “format on save”,勾选:

vscode-format-on-save

搜索 go:format,在 format tool 中选择 goimports:

vscode-goimports

注意:

  1. 如果 go:format 搜索时找不到 extends / go,则应该是没有安装 go extensin,或者安装之后没有重启 vs code
  2. 下拉框选 goimports 时如果报错没有安装 goimports,点安装即可

参考资料

6 - 安装Protoc

安装Protoc用于从proto文件生成代码

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