jzero-io / jzero Goto Github PK
View Code? Open in Web Editor NEWUsed to create project from templates and generate Server/Client/Model code by proto/api/sql file.
Home Page: https://jzero.jaronnie.com/
License: MIT License
Used to create project from templates and generate Server/Client/Model code by proto/api/sql file.
Home Page: https://jzero.jaronnie.com/
License: MIT License
Error: Error: unknown shorthand flag: 'f' in -filename
// API /api/v1/network/dns/edit "DNS 设置"
EditHandler(ctx context.Context,param *types.EditNetworkDNSRequest) ([]*types.string, error)
期望 :
EditHandler(ctx context.Context,param *types.EditNetworkDNSRequest) (string, error)
如题,我也魔改了一版本zero,一直在用,因为zero中redis不支持设置db,因为采用的是在生成代码的时候,加入一个业务key进去做了区分;
另外有交流微信群吗
Hey,
Really liking this approach fro code gen...
I cant seem to get a docker build working on may Mac m2.
I followed the docs: https://github.com/jzero-io/jzero/blob/main/README-EN.md
export ORGANIZATION=gedw99
I am running off main version btw.
At the bottom is the error, but I include all the steps here just in case.
I am using the Makefile that is inside the example project btw. Not my Makefile.
# crreate the test project...
mkdir -p /Users/apple/workspace/go/src/junk/jzero/.data
mkdir -p /Users/apple/workspace/go/src/junk/jzero/.data/workspace
cd /Users/apple/workspace/go/src/junk/jzero/.data/workspace && jzero new test-proj
cd /Users/apple/workspace/go/src/junk/jzero/.data/workspace && touch go.work
cd /Users/apple/workspace/go/src/junk/jzero/.data/workspace && go work use test-proj
# gen
# generate server code ...
cd /Users/apple/workspace/go/src/junk/jzero/.data/workspace/test-proj && jzero gen
Enter working dir /Users/apple/workspace/go/src/junk/jzero/.data/workspace/test-proj
Start to generate proto code.
Using proto file desc/proto/v1/hello.proto
Done
Start to generate internal/server/server.go
Done
Start to generate api code.
Using api file desc/api/3954155950.api
Done
cd /Users/apple/workspace/go/src/junk/jzero/.data/workspace/test-proj && go mod tidy
go: finding module for package github.com/common-nighthawk/go-figure
go: finding module for package github.com/spf13/cobra
go: finding module for package github.com/zeromicro/go-zero/core/conf
go: finding module for package github.com/zeromicro/go-zero/rest/httpx
go: finding module for package github.com/jzero-io/jzero-contrib/gwx
go: finding module for package github.com/zeromicro/go-zero/gateway
go: finding module for package github.com/zeromicro/go-zero/core/proc
go: finding module for package github.com/zeromicro/go-zero/core/logx
go: finding module for package github.com/jzero-io/jzero-contrib/swaggerv2
go: finding module for package github.com/zeromicro/go-zero/zrpc
go: finding module for package github.com/zeromicro/go-zero/rest
go: finding module for package github.com/zeromicro/go-zero/core/service
go: finding module for package github.com/zeromicro/go-zero/core/logc
go: finding module for package github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options
go: found github.com/common-nighthawk/go-figure in github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be
go: found github.com/jzero-io/jzero-contrib/gwx in github.com/jzero-io/jzero-contrib v0.5.0
go: found github.com/spf13/cobra in github.com/spf13/cobra v1.8.1
go: found github.com/zeromicro/go-zero/core/conf in github.com/zeromicro/go-zero v1.7.0
go: found github.com/zeromicro/go-zero/core/logx in github.com/zeromicro/go-zero v1.7.0
go: found github.com/zeromicro/go-zero/core/proc in github.com/zeromicro/go-zero v1.7.0
go: found github.com/zeromicro/go-zero/core/service in github.com/zeromicro/go-zero v1.7.0
go: found github.com/zeromicro/go-zero/gateway in github.com/zeromicro/go-zero v1.7.0
go: found github.com/zeromicro/go-zero/zrpc in github.com/zeromicro/go-zero v1.7.0
go: found github.com/jzero-io/jzero-contrib/swaggerv2 in github.com/jzero-io/jzero-contrib v0.5.0
go: found github.com/zeromicro/go-zero/rest in github.com/zeromicro/go-zero v1.7.0
go: found github.com/zeromicro/go-zero/rest/httpx in github.com/zeromicro/go-zero v1.7.0
go: found github.com/zeromicro/go-zero/core/logc in github.com/zeromicro/go-zero v1.7.0
go: found github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options in github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0
# generate swagger json
cd /Users/apple/workspace/go/src/junk/jzero/.data/workspace/test-proj && jzero gen swagger
# generate http sdk
cd /Users/apple/workspace/go/src/junk/jzero/.data/workspace/test-proj && jzero gen sdk
# generate zrpcclient
cd /Users/apple/workspace/go/src/junk/jzero/.data/workspace/test-proj && jzero gen zrpcclient
# gen docs
#cd /Users/apple/workspace/go/src/junk/jzero/.data/workspace/test-proj && jzero gen doc
apple@apples-MacBook-Pro jzero %
# run server to check it compiles, etc
# Starting rpc server: http://localhost:8000
# Starting gateway server: http://localhost:8001/swagger
cd /Users/apple/workspace/go/src/junk/jzero/.data/workspace/test-proj && go run main.go server
__ ________ _______ .______ ______
| | | / | ____|| _ \ / __ \
| | `---/ / | |__ | |_) | | | | |
.--. | | / / | __| | / | | | |
| `--' | / /----.| |____ | |\ \----.| `--' |
\______/ /________||_______|| _| `._____| \______/
2024-08-23T14:31:54.968+10:00 info Starting rpc server at 0.0.0.0:8000... caller=cmd/server.go:80
2024-08-23T14:31:54.968+10:00 info Starting gateway server at 0.0.0.0:8001... caller=cmd/server.go:81
# build binary in place
cd /Users/apple/workspace/go/src/junk/jzero/.data/workspace/test-proj && make build
make[1]: Entering directory '/Users/apple/workspace/go/src/junk/jzero/.data/workspace/test-proj'
make[1]: Leaving directory '/Users/apple/workspace/go/src/junk/jzero/.data/workspace/test-proj'
# FAILS: Something to do with §TARGETARCH i think. !
# build docker in place
cd /Users/apple/workspace/go/src/junk/jzero/.data/workspace/test-proj && make docker
make[1]: Entering directory '/Users/apple/workspace/go/src/junk/jzero/.data/workspace/test-proj'
#0 building with "galene" instance using docker-container driver
#1 [internal] load build definition from Dockerfile
#1 transferring dockerfile: 609B done
#1 WARN: FromAsCasing: 'as' and 'FROM' keywords' casing do not match (line 1)
#1 WARN: RedundantTargetPlatform: Setting platform to predefined $TARGETPLATFORM in FROM is redundant as this is the default behavior (line 18)
#1 DONE 0.0s
#2 [auth] jzero-io/jzero:pull token for ghcr.io
#2 DONE 0.0s
#3 [internal] load metadata for ghcr.io/jzero-io/jzero:latest
#3 ...
#4 [internal] load metadata for docker.io/library/alpine:latest
#4 DONE 1.0s
#3 [internal] load metadata for ghcr.io/jzero-io/jzero:latest
#3 DONE 1.3s
#5 [internal] load .dockerignore
#5 transferring context: 2B done
#5 DONE 0.0s
#6 [builder 1/4] FROM ghcr.io/jzero-io/jzero:latest@sha256:f390d5f7b0032dde06a84dc4056d53d4df8c4d36e9dcc1c560ee611950811963
#6 resolve ghcr.io/jzero-io/jzero:latest@sha256:f390d5f7b0032dde06a84dc4056d53d4df8c4d36e9dcc1c560ee611950811963 0.0s done
#6 DONE 0.0s
#7 [stage-1 1/3] FROM docker.io/library/alpine:latest@sha256:0a4eaa0eecf5f8c050e5bba433f58c052be7587ee8af3e8b3910ef9ab5fbe9f5
#7 resolve docker.io/library/alpine:latest@sha256:0a4eaa0eecf5f8c050e5bba433f58c052be7587ee8af3e8b3910ef9ab5fbe9f5 0.0s done
#7 DONE 0.0s
#8 [stage-1 2/3] WORKDIR /dist
#8 CACHED
#9 [internal] load build context
#9 transferring context: 77.81MB 0.5s done
#9 DONE 0.5s
#10 [builder 2/4] WORKDIR /usr/local/go/src/app
#10 CACHED
#11 [builder 3/4] COPY ./ ./
#11 DONE 0.2s
#12 [builder 4/4] RUN --mount=type=cache,target=/go/pkg CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -a -ldflags="$LDFLAGS" -o /dist/app main.go && jzero gen swagger && cp -r etc /dist/etc && mkdir -p /dist/desc && cp -r desc/swagger /dist/desc
#12 0.054 go: downloading github.com/fullstorydev/grpcurl v1.9.1
#12 0.054 go: downloading github.com/jhump/protoreflect v1.16.0
#12 0.070 go: downloading google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142
#12 0.086 go: downloading go.etcd.io/etcd/client/v3 v3.5.15
#12 0.157 go: downloading k8s.io/utils v0.0.0-20240711033017-18e509b52bc8
#12 4.149 /go/pkg/mod/github.com/grpc-ecosystem/grpc-gateway/[email protected]/runtime/handler.go:13:2: google.golang.org/genproto/googleapis/[email protected]: read "https://goproxy.cn/google.golang.org/genproto/googleapis/api/@v/v0.0.0-20240814211410-ddb44dafa142.zip": stream error: stream ID 9; INTERNAL_ERROR; received from peer
#12 4.149 /go/pkg/mod/github.com/zeromicro/[email protected]/gateway/server.go:9:2: github.com/fullstorydev/[email protected]: read "https://goproxy.cn/github.com/fullstorydev/grpcurl/@v/v1.9.1.zip": stream error: stream ID 7; INTERNAL_ERROR; received from peer
#12 4.149 /go/pkg/mod/github.com/zeromicro/[email protected]/gateway/server.go:11:2: github.com/jhump/[email protected]: read "https://goproxy.cn/github.com/jhump/protoreflect/@v/v1.16.0.zip": stream error: stream ID 5; INTERNAL_ERROR; received from peer
#12 4.149 /go/pkg/mod/github.com/zeromicro/[email protected]/gateway/internal/descriptorsource.go:9:2: github.com/jhump/[email protected]: read "https://goproxy.cn/github.com/jhump/protoreflect/@v/v1.16.0.zip": stream error: stream ID 5; INTERNAL_ERROR; received from peer
#12 4.149 /go/pkg/mod/github.com/zeromicro/[email protected]/gateway/internal/descriptorsource.go:10:2: google.golang.org/genproto/googleapis/[email protected]: read "https://goproxy.cn/google.golang.org/genproto/googleapis/api/@v/v0.0.0-20240814211410-ddb44dafa142.zip": stream error: stream ID 9; INTERNAL_ERROR; received from peer
#12 4.149 /go/pkg/mod/github.com/zeromicro/[email protected]/core/discov/internal/etcdclient.go:8:2: go.etcd.io/etcd/client/[email protected]: read "https://goproxy.cn/go.etcd.io/etcd/client/v3/@v/v3.5.15.zip": stream error: stream ID 1; INTERNAL_ERROR; received from peer
#12 4.149 /go/pkg/mod/k8s.io/[email protected]/pkg/util/validation/validation.go:28:2: k8s.io/[email protected]: read "https://goproxy.cn/k8s.io/utils/@v/v0.0.0-20240711033017-18e509b52bc8.zip": stream error: stream ID 3; INTERNAL_ERROR; received from peer
#12 4.149 /go/pkg/mod/k8s.io/[email protected]/pkg/labels/selector.go:30:2: k8s.io/[email protected]: read "https://goproxy.cn/k8s.io/utils/@v/v0.0.0-20240711033017-18e509b52bc8.zip": stream error: stream ID 3; INTERNAL_ERROR; received from peer
#12 4.149 /go/pkg/mod/k8s.io/[email protected]/pkg/util/cache/expiring.go:24:2: k8s.io/[email protected]: read "https://goproxy.cn/k8s.io/utils/@v/v0.0.0-20240711033017-18e509b52bc8.zip": stream error: stream ID 3; INTERNAL_ERROR; received from peer
#12 4.149 /go/pkg/mod/k8s.io/[email protected]/util/flowcontrol/backoff.go:25:2: k8s.io/[email protected]: read "https://goproxy.cn/k8s.io/utils/@v/v0.0.0-20240711033017-18e509b52bc8.zip": stream error: stream ID 3; INTERNAL_ERROR; received from peer
#12 4.149 /go/pkg/mod/k8s.io/[email protected]/util/flowcontrol/backoff.go:26:2: k8s.io/[email protected]: read "https://goproxy.cn/k8s.io/utils/@v/v0.0.0-20240711033017-18e509b52bc8.zip": stream error: stream ID 3; INTERNAL_ERROR; received from peer
#12 4.149 /go/pkg/mod/k8s.io/[email protected]/tools/cache/shared_informer.go:30:2: k8s.io/[email protected]: read "https://goproxy.cn/k8s.io/utils/@v/v0.0.0-20240711033017-18e509b52bc8.zip": stream error: stream ID 3; INTERNAL_ERROR; received from peer
#12 4.149 /go/pkg/mod/k8s.io/[email protected]/tools/cache/reflector.go:45:2: k8s.io/[email protected]: read "https://goproxy.cn/k8s.io/utils/@v/v0.0.0-20240711033017-18e509b52bc8.zip": stream error: stream ID 3; INTERNAL_ERROR; received from peer
#12 4.149 /go/pkg/mod/k8s.io/[email protected]/tools/cache/delta_fifo.go:28:2: k8s.io/[email protected]: read "https://goproxy.cn/k8s.io/utils/@v/v0.0.0-20240711033017-18e509b52bc8.zip": stream error: stream ID 3; INTERNAL_ERROR; received from peer
#12 ERROR: process "/bin/sh -c CGO_ENABLED=0 GOOS=linux GOARCH=$TARGETARCH go build -a -ldflags=\"$LDFLAGS\" -o /dist/app main.go && jzero gen swagger && cp -r etc /dist/etc && mkdir -p /dist/desc && cp -r desc/swagger /dist/desc" did not complete successfully: exit code: 1
------
> [builder 4/4] RUN --mount=type=cache,target=/go/pkg CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -a -ldflags="$LDFLAGS" -o /dist/app main.go && jzero gen swagger && cp -r etc /dist/etc && mkdir -p /dist/desc && cp -r desc/swagger /dist/desc:
4.149 /go/pkg/mod/github.com/zeromicro/[email protected]/gateway/internal/descriptorsource.go:10:2: google.golang.org/genproto/googleapis/[email protected]: read "https://goproxy.cn/google.golang.org/genproto/googleapis/api/@v/v0.0.0-20240814211410-ddb44dafa142.zip": stream error: stream ID 9; INTERNAL_ERROR; received from peer
4.149 /go/pkg/mod/github.com/zeromicro/[email protected]/core/discov/internal/etcdclient.go:8:2: go.etcd.io/etcd/client/[email protected]: read "https://goproxy.cn/go.etcd.io/etcd/client/v3/@v/v3.5.15.zip": stream error: stream ID 1; INTERNAL_ERROR; received from peer
4.149 /go/pkg/mod/k8s.io/[email protected]/pkg/util/validation/validation.go:28:2: k8s.io/[email protected]: read "https://goproxy.cn/k8s.io/utils/@v/v0.0.0-20240711033017-18e509b52bc8.zip": stream error: stream ID 3; INTERNAL_ERROR; received from peer
4.149 /go/pkg/mod/k8s.io/[email protected]/pkg/labels/selector.go:30:2: k8s.io/[email protected]: read "https://goproxy.cn/k8s.io/utils/@v/v0.0.0-20240711033017-18e509b52bc8.zip": stream error: stream ID 3; INTERNAL_ERROR; received from peer
4.149 /go/pkg/mod/k8s.io/[email protected]/pkg/util/cache/expiring.go:24:2: k8s.io/[email protected]: read "https://goproxy.cn/k8s.io/utils/@v/v0.0.0-20240711033017-18e509b52bc8.zip": stream error: stream ID 3; INTERNAL_ERROR; received from peer
4.149 /go/pkg/mod/k8s.io/[email protected]/util/flowcontrol/backoff.go:25:2: k8s.io/[email protected]: read "https://goproxy.cn/k8s.io/utils/@v/v0.0.0-20240711033017-18e509b52bc8.zip": stream error: stream ID 3; INTERNAL_ERROR; received from peer
4.149 /go/pkg/mod/k8s.io/[email protected]/util/flowcontrol/backoff.go:26:2: k8s.io/[email protected]: read "https://goproxy.cn/k8s.io/utils/@v/v0.0.0-20240711033017-18e509b52bc8.zip": stream error: stream ID 3; INTERNAL_ERROR; received from peer
4.149 /go/pkg/mod/k8s.io/[email protected]/tools/cache/shared_informer.go:30:2: k8s.io/[email protected]: read "https://goproxy.cn/k8s.io/utils/@v/v0.0.0-20240711033017-18e509b52bc8.zip": stream error: stream ID 3; INTERNAL_ERROR; received from peer
4.149 /go/pkg/mod/k8s.io/[email protected]/tools/cache/reflector.go:45:2: k8s.io/[email protected]: read "https://goproxy.cn/k8s.io/utils/@v/v0.0.0-20240711033017-18e509b52bc8.zip": stream error: stream ID 3; INTERNAL_ERROR; received from peer
4.149 /go/pkg/mod/k8s.io/[email protected]/tools/cache/delta_fifo.go:28:2: k8s.io/[email protected]: read "https://goproxy.cn/k8s.io/utils/@v/v0.0.0-20240711033017-18e509b52bc8.zip": stream error: stream ID 3; INTERNAL_ERROR; received from peer
------
3 warnings found (use docker --debug to expand):
- FromAsCasing: 'as' and 'FROM' keywords' casing do not match (line 1)
- RedundantTargetPlatform: Setting platform to predefined $TARGETPLATFORM in FROM is redundant as this is the default behavior (line 18)
- LegacyKeyValueFormat: "ENV key=value" should be used instead of legacy "ENV key value" format (line 6)
Dockerfile:12
--------------------
11 |
12 | >>> RUN --mount=type=cache,target=/go/pkg CGO_ENABLED=0 GOOS=linux GOARCH=$TARGETARCH go build -a -ldflags="$LDFLAGS" -o /dist/app main.go \
13 | >>> && jzero gen swagger \
14 | >>> && cp -r etc /dist/etc \
15 | >>> && mkdir -p /dist/desc && cp -r desc/swagger /dist/desc
16 |
--------------------
ERROR: failed to solve: process "/bin/sh -c CGO_ENABLED=0 GOOS=linux GOARCH=$TARGETARCH go build -a -ldflags=\"$LDFLAGS\" -o /dist/app main.go && jzero gen swagger && cp -r etc /dist/etc && mkdir -p /dist/desc && cp -r desc/swagger /dist/desc" did not complete successfully: exit code: 1
make[1]: *** [Makefile:23: docker] Error 1
make[1]: Leaving directory '/Users/apple/workspace/go/src/junk/jzero/.data/workspace/test-proj'
make: *** [Makefile:130: run-6-build] Error 2
apple@apples-MacBook-Pro jzero %
``
syntax = "proto3";
package hellopb;
import "google/api/annotations.proto";
option go_package = "./pb/hellopb";
message Empty {}
message SayHelloResponse {
string message = 1;
}
service hello {
rpc SayHello(Empty) returns(SayHelloResponse) {
option (google.api.http) = {
get: "/api/v1/hello"
};
};
}
service helloV2 {
rpc SayHelloV2(Empty) returns(SayHelloResponse) {
option (google.api.http) = {
get: "/api/v2/hello"
};
};
}
error:
Error: open /Users/jaronnie/Desktop/jaronnie/github/jzero-io/examples/simplegateway/internal/server/hellov2/hellov2.go: no such file or directory
目前默认option go_package 路径在internal下面,如果想指定到其他路径生成代码会报错
2024/05/20 17:30:08 gopathwalk: scanning directory /Users/jaronnie: open /Users/jaronnie/Library/IntelligencePlatform: operation not permitted
2024/05/20 17:30:13 gopathwalk: scanning directory /Users/jaronnie: open /Users/jaronnie/Library/Weather: operation not permitted
2024/05/20 17:30:20 gopathwalk: scanning directory /Users/jaronnie: open /Users/jaronnie/Library/DoNotDisturb: operation not permitted
Hey @jaronnie
what do you think about this...
Update docker file to:
ORGANIZATION = "organization"
APP = "test-proj"
VERSION := $(shell git describe --tags --always --match='v*' 2>/dev/null)
ifeq ($(VERSION),)
VERSION = "latest"
endif
COMMIT = $(shell git rev-parse --short HEAD 2>/dev/null)
ifeq ($(COMMIT),)
COMMIT = ""
endif
DATE = `date "+%Y-%m-%d %H:%M:%S"`
ARCH = `go env GOARCH`
.PHONY: print
print:
@echo ""
@echo "ORGANIZATION: $(ORGANIZATION)"
@echo "APP: $(APP)"
@echo "VERSION: $(VERSION)"
@echo "COMMIT: $(COMMIT)"
@echo "DATE: $(DATE)"
@echo "ARCH: $(ARCH)"
@echo ""
.PHONY: go-build
go-build:
@go build -ldflags "-X 'test-proj/cmd.Date=$(DATE)' -X 'test-proj/cmd.Version=$(VERSION)' -X 'test-proj/cmd.Commit=$(COMMIT)'" -o $(APP) main.go
.PHONY: go-run
go-run:
./$(APP) server
.PHONY: docker-build
docker-build:
@docker buildx build --platform linux/$(ARCH) --progress=plain -t $(ORGANIZATION)/$(APP):$(VERSION) . --load
.PHONY: docker-run
docker-run:
# TODO...
#@docker ...
.PHONY: docker-push
push:
@docker buildx create --use --name=mybuilder --driver docker-container --driver-opt image=dockerpracticesig/buildkit:master 2> /dev/null || true
@docker buildx build --platform linux/amd64,linux/arm64 --progress=plain -t $(ORGANIZATION)/$(APP):$(VERSION) . --push
Then devs can wrap this make file easily on top. This keeps the code generated docker file generic.
# extra variables for makefile
MK=ORGANIZATION=gedw99 APP=test
run-6-build:
# check values
$(RUN_PROJ) $(MAKE) $(MK) print
# build binary in place
$(RUN_PROJ) $(MAKE) $(MK) go-build
# build dockerin place
$(RUN_PROJ) $(MAKE) $(MK) docker-build
run-7-run:
# run binary in place
$(RUN_PROJ) $(MAKE) $(MK) go-run
run-8-push:
# push docker to
$(RUN_PROJ) $(MAKE) docker-push
``
I think it would be great to have an example that use the queue from https://github.com/zeromicro/go-queue/blob/master/natsq/consumer.go
I looked in https://github.com/jzero-io/examples, but found now.
NATS is much better than Kafka, because you can embed the server or not. SO it's much easier for a golang team to run.
It has lot of other advantages.
目前 gateway 框架添加的 middleware 是全局的, 不能针对某个方法或者某个组控制 middleware
比如lte:1000,目前不能自己定义当发生这个错误时的message
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.