これは、BufpluginフレームワークのGo SDKです。 bufplugin-go
現在、Check、Checkutil、およびChecktestパッケージを提供して、カスタムリントとBreaking Changeプラグインを簡単に作成およびテストすることができます。 bufplugin
APIは、GO Protobufエコシステムの大部分を駆動する標準プロトレフレクトAPIを整理する使いやすいインターフェイスと概念でPlugINRPC-GOでラップします。 bufplugin-go
、BUFチームがBUF CLI内のすべてのビルトインリントとBreaking Changeルールを作成するために使用するフレームワークでもあります。Bufplugin- 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
すべての構成は、予想use
に機能します。 except
、Builtinルールの場合と同じように、 ignore
、 ignore_only
、および// buf:lint:ignore
lint:lint:lint:ling:ling:ling:agrute。
プラグインは、あなたが望むものは何でも名前を付けることができますが、明確にするために、 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)
この場合、例は千の言葉の価値があります。recking/internal/example/cmdの例を読むには、開始することをお勧めします。
google.protobuf.Timestamp
フィールドには、フィールド名の一貫したサフィックスがあることをチェックするTIMESTAMP_SUFFIX
単一のリントルールを実装する単純なプラグイン。この接尾辞は、プラグインオプションで構成できます。lower_snake_case
であることをチェックする単一の糸くずのルール、 PLUGIN_FIELD_LOWER_SNAKE_CASE
を実装する簡単なプラグイン。FIELD_OPTION_SAFE_FOR_ML_SET
を実装するプラグインと壊れた変更ルールFIELD_OPTION_SAFE_FOR_ML_STAYS_TRUE
、どちらもFIELD_OPTION_SAFE_FOR_ML
カテゴリに属します。これにより、カスタムオプションacme.option.v1.safe_for_ml
の例をめぐるプロパティが実施されます。これは、フィールドがMLモデルで安全に使用できるかどうかを示すためのものです。組織は、すべてのフィールドは、すべてのスキーマで安全または安全でないと明示的にマークされている必要があり、安全性から安全でないものへの分野の変化はないと言いたい場合があります。このプラグインは、この組織側を強制します。この例では、複数のルールを実装し、それらを分類し、カスタムオプション値を考慮に入れていることを示しています。syntax
宣言を持っていることをチェックする単一のLintルール、 PLUGIN_SYNTAX_SPECIFIED
を実装する単純なプラグイン。これは、 FileDescriptorProto
が提供するものを超えて、 bufplugin
APIに存在する追加のメタデータを使用することを示しています。これらのすべての例には、 main.go
プラグインの実装と、 checktest
パッケージを使用してプラグインの動作をテストするmain_test.go
テストファイルがあります。 checktest
パッケージでは、プロトコンパイルを使用してテストをコンパイルし、その場で.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ライセンスの下で提供されます。