解決Protobuf生成的C#代碼命名不規範問題

原由

一般使用Protobuf的步驟爲linux

  1. 定義 .proto 文件
  2. 使用 protoc 生成對應語言的代碼

以生成C#代碼爲例,使用以下命令:shell

protoc -I ../protos --csharp_out ../Generated --grpc_out ../Generated \
--plugin=protoc-gen-grpc=grpc_csharp_plugin ../protos/ExportOffice.proto

其生成的C#代碼像這樣:bash

public const int TemplatePathFieldNumber = 1;
private string templatePath_ = "";
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
public string TemplatePath {
    get { return templatePath_; }
    set {
    templatePath_ = pb::ProtoPreconditions.CheckNotNull(value, value")
    }
}

C#開發一般使用Pascal、Camel二種命名規範工具

  • 用Pascal規則來命名類名、屬性、方法和事件
  • 用Camel規則來命名成員變量、局部變量和方法的參數

上面代碼中成員變量 templatePath_ 應該是 Camel 命名規則,但 Camel 命名規則沒有以_結尾的。code

個人項目中爲規範化代碼我使用了 StyleCop 自動代碼審查工具,它會將不符合命名規範的代碼視爲編譯錯誤,這種命名的代碼是編譯不過的,而且 StyleCop 並無提供忽略指定類文件的功能,只能改代碼使其符合命名規範了。事件

解決

代碼是自動生成的手動確定確定不現實的,那麼就自動改。能夠用正匹配到這種命名的變量而後替換便可,因而我寫了個shell腳本能夠作這件事,代碼以下:ip

#!/usr/bin/env bash

#Usage: xxx.sh

TOOLS_DIR=/mnt/d/Program_Code/Package/gRPC/Tools/linux_x64

BASH_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
cd $BASH_DIR

rm ../Generated/*.cs

$TOOLS_DIR/protoc -I ../protos --csharp_out ../Generated --grpc_out ../Generated \
--plugin=protoc-gen-grpc=$TOOLS_DIR/grpc_csharp_plugin ../protos/ExportOffice.proto

sed -ri -e 's/\b([a-zA-Z0-9_]+)_\b/_\1/g' \
-e 's/\b(descriptor)\b/_\1/g' \
-e '1s/^/\xef\xbb\xbf/' ../Generated/*.cs

這個腳本作了3件事開發

  1. 生成C#代碼
  2. 替換不符合命名規範的成員變量
  3. 添加UTF8 BOM頭

使用時須要將 TOOLS_DIR 變量修改成 protoc 所在目錄rpc

相關文章
相關標籤/搜索