이것은 Bufplugin 프레임 워크의 GO SDK입니다. bufplugin-go
현재 확인, CheckUtil 및 CheckTest 패키지를 제공하여 사용자 정의 보풀을 간단하게 작성 하고 변경 플러그인을 깨뜨릴 수 있도록합니다. bufplugin
API를 PlugInRPC-Go로 랩핑하여 사용하기 쉬운 인터페이스 및 개념으로 대부분의 GO 프로토 부프 생태계에 전력을 공급하는 표준 ProtoreFlect API를 중심으로 구성됩니다. bufplugin-go
는 BUF 팀이 BUF CLI 내에서 내장 된 모든 보풀 및 깨진 변경 규칙을 작성하기 위해 사용하는 프레임 워크입니다. bufplugin-go
가장 복잡한 보도 및 중단 변경 규칙을 대표 할만 큼 강력한 지 확인했습니다. 가능한 한 간단하게 사용할 수 있습니다. 오늘 보풀 또는 Breaking Change 플러그인을 작성하려면 bufplugin-go
사용해야합니다.
플러그인은 Bufplugin API를 구현하는 시스템의 이진 일뿐입니다. 플러그인을 설치 한 후에는 buf.yaml
내의 규칙에 대한 참조를 추가하기 만하면됩니다. 예를 들어, $PATH
에 BUF-PLUGIN-TIMESTAMP-SUFFIX 예제 플러그인을 설치 한 경우 :
version : v2
lint :
use :
- TIMESTAMP_SUFFIX
plugins :
- plugin : buf-plugin-timestamp-suffix
options :
timestamp_suffix : _time # set to the suffix you'd like to enforce
모든 구성은 예상대로 작동합니다. 내장 규칙과 마찬가지로 // buf:lint:ignore
Lint ignore_only
ignore
except
는 use
계속 구성 할 수 있습니다.
플러그인은 원하는대로 명명 될 수 있지만, buf-plugin-
사용하여 바이너리 이름을 접두사를 정리하는 것이 좋습니다.
다음 파일이 주어지면 :
# foo.proto
syntax = "proto3" ;
package foo ;
import "google/protobuf/timestamp.proto" ;
message Foo {
google.protobuf.Timestamp start = 1 ;
google.protobuf.Timestamp end_time = 2 ;
}
다음 오류는 buf lint
에서 반환됩니다.
foo.proto:8:3:Fields of type google.protobuf.Timestamp must end in "_time" but field name was "start". (buf-plugin-timestamp-suffix)
이 경우 예제는 천 단어의 가치가 있으며, 예제를 확인/내부/예/CMD에서 읽는 것이 좋습니다.
google.protobuf.Timestamp
필드가 필드 이름에 대한 일관된 접미사를 가지고 있는지 확인하는 단일 보풀 규칙 TIMESTAMP_SUFFIX
를 구현하는 간단한 플러그인. 이 접미사는 플러그인 옵션을 통해 구성 가능합니다.lower_snake_case
인지 확인하는 단일 보도 규칙 인 PLUGIN_FIELD_LOWER_SNAKE_CASE
를 구현하는 간단한 플러그인.FIELD_OPTION_SAFE_FOR_ML_SET
구현하고 Breaking 변경 규칙 FIELD_OPTION_SAFE_FOR_ML_STAYS_TRUE
, 모두 FIELD_OPTION_SAFE_FOR_ML
카테고리에 속하는 플러그인입니다. 이것은 예제 옵션 acme.option.v1.safe_for_ml
주위의 속성을 시행합니다. 조직은 모든 분야가 모든 스키마에서 안전하거나 안전하지 않은 것으로 명시 적으로 표시되어야하며 안전에서 안전하지 않은 현장으로 바뀌지 않아야한다고 말할 수 있습니다. 이 플러그인은이 조직 측을 시행합니다. 이 예제는 여러 규칙을 구현하고, 분류하고, 사용자 정의 옵션 값을 고려한 것을 보여줍니다.PLUGIN_SYNTAX_SPECIFIED
구현하는 간단한 플러그인은 모든 파일에 명시 syntax
선언이 있는지 확인합니다. 이것은 bufplugin
API에 존재하는 추가 메타 데이터를 제출 FileDescriptorProto
제공하는 것 이상으로 사용합니다. 이 모든 예제에는 main.go
플러그인 구현과 checktest
패키지를 사용하여 플러그인 동작을 테스트하는 main_test.go
테스트 파일이 있습니다. checktest
패키지는 ProtoCompile을 사용하여 .proto
를 즉시 컴파일하고 규칙에 따라 실행하며 결과 주석을 기대와 비교합니다.
다음은 플러그인 구현의 짧은 예입니다. 이것이 전부입니다.
package main
import (
"context"
"buf.build/go/bufplugin/check"
"buf.build/go/bufplugin/check/checkutil"
"google.golang.org/protobuf/reflect/protoreflect"
)
func main () {
check . Main (
& check. Spec {
Rules : [] * check. RuleSpec {
{
ID : "PLUGIN_FIELD_LOWER_SNAKE_CASE" ,
Default : true ,
Purpose : "Checks that all field names are lower_snake_case." ,
Type : check . RuleTypeLint ,
Handler : checkutil . NewFieldRuleHandler ( checkFieldLowerSnakeCase , checkutil . WithoutImports ()),
},
},
},
)
}
func checkFieldLowerSnakeCase (
_ context. Context ,
responseWriter check. ResponseWriter ,
_ check. Request ,
fieldDescriptor protoreflect. FieldDescriptor ,
) error {
fieldName := string ( fieldDescriptor . Name ())
fieldNameToLowerSnakeCase := toLowerSnakeCase ( fieldName )
if fieldName != fieldNameToLowerSnakeCase {
responseWriter . AddAnnotation (
check . WithMessagef (
"Field name %q should be lower_snake_case, such as %q." ,
fieldName ,
fieldNameToLowerSnakeCase ,
),
check . WithDescriptor ( fieldDescriptor ),
)
}
return nil
}
func toLowerSnakeCase ( fieldName string ) string {
// The actual logic for toLowerSnakeCase would go here.
return "TODO"
}
Bufplugin은 현재 베타 버전에 있으며 얼리 어답터와 함께 일할 때 변경 될 수 있습니다. 우리는 2024 년 말까지 안정적인 v1.0을 배송하려고합니다. 그러나 우리는 API가 최종 모양에 가깝다고 생각합니다.
Apache 2 라이센스에 따라 제공됩니다.