解决Protobuf生成的C#代码命名不规范问题

起因

通常使用Protobuf的步骤为

  1. 定义 .proto 文件
  2. 使用 protoc 生成对应语言的代码

以生成C#代码为例,使用如下命令:

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

其生成的C#代码像这样:

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 命名规则没有以_结尾的。

我的项目中为规范化代码我使用了 StyleCop 自动代码审查工具,它会将不符合命名规范的代码视为编译错误,这种命名的代码是编译不过的,并且 StyleCop 并没有提供忽略指定类文件的功能,只能改代码使其符合命名规范了。

解决

代码是自动生成的手动肯定肯定不现实的,那么就自动改。可以用正匹配到这种命名的变量然后替换即可,于是我写了个shell脚本可以做这件事,代码如下:

#!/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 所在目录

posted on 2017-03-22 15:18  Frank.Cui  阅读(1106)  评论(0编辑  收藏  举报