一键导入
go-project-proto
Protocol buffer configuration for Connect RPC + gRPC-Gateway using buf, including plugins, imports, annotations, and code generation
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Protocol buffer configuration for Connect RPC + gRPC-Gateway using buf, including plugins, imports, annotations, and code generation
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
This skill should be used when the user asks to analyze a project and generate development documentation from a "re-implementation" perspective. Activates with phrases like analyze project, generate development docs, understand project, create project documentation, project analysis. Provides step-by-step evolutionary development documentation that explains how to rebuild the project from scratch.
This skill should be used when user asks to migrate from JProtobuf to standard Protobuf. Activates with phrases like migrate JProtobuf to Protobuf, convert JProtobuf to standard Protobuf, JProtobuf migration, JProtobuf to proto conversion, batch migration of JProtobuf. Provides structured guidance for incremental migration process including analysis, mapping, code generation, testing, and experience documentation.
This skill should be used when user asks to generate protobuf protocol files from Java .class files or reverse engineer protobuf from compiled bytecode. Activates with phrases like class to protobuf, convert class to proto, generate protobuf from class, reverse engineer protobuf from class, class protobuf conversion, bytecode to protobuf. Provides comprehensive guidance for parsing Java @Protobuf annotations from .class files using javap and generating .proto files.
This skill should be used when user asks to convert Java files to protobuf protocol files or reverse engineer protobuf from Java code. Activates with phrases like java to protobuf, convert java to proto, generate protobuf from java, reverse engineer protobuf from java, java protobuf conversion. Provides comprehensive guidance for parsing Java @Protobuf annotations and generating .proto files.
This skill should be used when the user asks to create a new agent skill. Activates with phrases like create skill, build agent, develop skill, make skill, generate agent, create agent skill. Provides structured guidance for creating complete agent skills following Trae Skills architecture, including SKILL.md format, activation patterns, and implementation best practices.
| name | go-project-proto |
| description | Protocol buffer configuration for Connect RPC + gRPC-Gateway using buf, including plugins, imports, annotations, and code generation |
Before creating any server code, you MUST create proto definitions!
# 1. Create proto directory
mkdir -p proto/api/v1
# 2. Create buf configuration files
touch proto/buf.yaml
touch proto/buf.gen.yaml
# 3. Create service definition
touch proto/api/v1/auth_service.proto
# 4. Generate code
cd proto && buf generate
Without proto files, server implementations cannot import generated types and will fail to compile!
proto/
├── buf.gen.yaml # Code generation configuration
├── buf.yaml # Lint and breaking change rules
├── buf.lock # Dependency lock file (auto-generated)
├── api/v1/ # API service definitions
│ ├── auth_service.proto
│ ├── user_service.proto
│ ├── memo_service.proto
│ └── common.proto # Shared enums
└── gen/ # Generated code (auto-generated)
├── api/v1/
│ ├── *_pb.go # Protobuf messages
│ ├── *_connect.go # Connect RPC handlers
│ ├── *_grpc.go # gRPC stubs
│ └── openapi.yaml # OpenAPI spec
version: v2
managed:
enabled: true
disable:
- file_option: go_package
module: buf.build/googleapis/googleapis
override:
- file_option: java_package
value: "com.dnfm.mina.protobuf.generated"
- file_option: go_package_prefix
value: gen
plugins:
# Java Protobuf代码生成
- remote: buf.build/protocolbuffers/java
out: gen/java
# Go代码生成
- remote: buf.build/protocolbuffers/go
out: gen
opt: paths=source_relative
- remote: buf.build/grpc/go
out: gen
opt: paths=source_relative
- remote: buf.build/connectrpc/go
out: gen
opt: paths=source_relative
- remote: buf.build/grpc-ecosystem/gateway
out: gen
opt: paths=source_relative
- remote: buf.build/community/google-gnostic-openapi
out: gen
opt: enum_type=string
- remote: buf.build/bufbuild/es
out: ../web/src/types/proto
opt: target=ts
include_imports: true
重要: 使用override配置统一管理Java的package,避免在每个proto文件中重复设置java_package选项。
managed:
enabled: true
disable:
- file_option: go_package
module: buf.build/googleapis/googleapis
override:
- file_option: java_package
value: "com.dnfm.mina.protobuf.generated"
- file_option: go_package_prefix
value: gen
配置说明:
managed.enabled: true: 启用buf的managed模式,自动管理文件选项override: 覆盖proto文件中的文件选项,统一设置file_option: java_package: 统一设置Java代码的package为com.dnfm.mina.protobuf.generatedfile_option: go_package_prefix: 统一设置Go代码的package前缀为gen优势:
java_package选项注意事项:
package声明仍然需要,用于protobuf的命名空间java_package选项会被override配置覆盖,无需在proto文件中设置java_outer_classname选项需要在proto文件中单独设置version: v2
deps:
- buf.build/googleapis/googleapis
lint:
use:
- BASIC
except:
- ENUM_VALUE_PREFIX
- FIELD_NOT_REQUIRED
- PACKAGE_DIRECTORY_MATCH
- PACKAGE_NO_IMPORT_CYCLE
- PACKAGE_VERSION_SUFFIX
disallow_comment_ignores: true
breaking:
use:
- FILE
except:
- EXTENSION_NO_DELETE
- FIELD_SAME_DEFAULT
syntax = "proto3";
package memos.api.v1;
import "google/api/annotations.proto";
import "google/api/client.proto";
import "google/api/field_behavior.proto";
import "google/api/resource.proto";
import "google/protobuf/empty.proto";
import "google/protobuf/timestamp.proto";
option go_package = "gen/api/v1";
service MemoService {
rpc CreateMemo(CreateMemoRequest) returns (Memo) {
option (google.api.http) = {
post: "/api/v1/memos"
body: "memo"
};
option (google.api.method_signature) = "memo";
}
rpc ListMemos(ListMemosRequest) returns (ListMemosResponse) {
option (google.api.http) = {get: "/api/v1/memos"};
option (google.api.method_signature) = "";
}
rpc GetMemo(GetMemoRequest) returns (Memo) {
option (google.api.http) = {get: "/api/v1/{name=memos/*}"};
option (google.api.method_signature) = "name";
}
rpc UpdateMemo(UpdateMemoRequest) returns (Memo) {
option (google.api.http) = {
patch: "/api/v1/{memo.name=memos/*}"
body: "memo"
};
option (google.api.method_signature) = "memo,update_mask";
}
rpc DeleteMemo(DeleteMemoRequest) returns (google.protobuf.Empty) {
option (google.api.http) = {delete: "/api/v1/{name=memos/*}"};
option (google.api.method_signature) = "name";
}
}
message Memo {
option (google.api.resource) = {
type: "memos.api.v1/Memo"
pattern: "memos/{memo}"
name_field: "name"
singular: "memo"
plural: "memos"
};
string name = 1 [(google.api.field_behavior) = IDENTIFIER];
State state = 2 [(google.api.field_behavior) = REQUIRED];
string creator = 3 [
(google.api.field_behavior) = OUTPUT_ONLY,
(google.api.resource_reference) = {type: "memos.api.v1/User"}
];
google.protobuf.Timestamp create_time = 4 [(google.api.field_behavior) = OUTPUT_ONLY];
string content = 7 [(google.api.field_behavior) = REQUIRED];
}
enum State {
STATE_UNSPECIFIED = 0;
NORMAL = 1;
ARCHIVED = 2;
}
message ListMemosRequest {
int32 page_size = 1 [(google.api.field_behavior) = OPTIONAL];
string page_token = 2 [(google.api.field_behavior) = OPTIONAL];
string order_by = 4 [(google.api.field_behavior) = OPTIONAL];
string filter = 5 [(google.api.field_behavior) = OPTIONAL];
}
message ListMemosResponse {
repeated Memo memos = 1;
string next_page_token = 2;
}
| Annotation | Usage |
|---|---|
REQUIRED | Field is required |
OPTIONAL | Field is optional |
OUTPUT_ONLY | Field is server-generated |
IDENTIFIER | Field is resource identifier |
// common.proto
syntax = "proto3";
package memos.api.v1;
option go_package = "gen/api/v1";
enum State {
STATE_UNSPECIFIED = 0;
NORMAL = 1;
ARCHIVED = 2;
}
message PageToken {
int32 limit = 1;
int32 offset = 2;
}
# Install dependencies
cd proto && buf dep update
# Generate code
cd proto && buf generate
# Lint proto files
cd proto && buf lint
# Check breaking changes
cd proto && buf breaking --against .git#main
gen/
└── api/v1/
├── auth_service.pb.go
├── auth_service.connect.go
├── auth_service_grpc.go
├── memo_service.pb.go
├── memo_service.connect.go
└── openapi.yaml
Import path:
import v1pb "github.com/usememos/memos/gen/api/v1"
*_service.protocommon.proto for enumsgoogle.api.resource for REST resourcesgoogle.api.method_signaturebuf.gen.yaml中的override配置统一管理Java package,避免在每个proto文件中重复设置