zoukankan      html  css  js  c++  java
  • 解决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/([a-zA-Z0-9_]+)_/_1/g' 
    -e 's/(descriptor)/_1/g' 
    -e '1s/^/xefxbbxbf/' ../Generated/*.cs
    

    这个脚本做了3件事

    1. 生成C#代码
    2. 替换不符合命名规范的成员变量
    3. 添加UTF8 BOM头

    使用时需要将 TOOLS_DIR 变量修改为 protoc 所在目录

  • 相关阅读:
    POJ 3304 计算几何 直线与线段相交
    POJ 2653 计算几何 判断线段相交
    POJ 1066 计算几何 线段相交
    关于git的一些有用的链接
    Cloudera是个什么东西
    Data Structure for phone book
    向大家推荐一个C/C++通用Makefile
    关于gcc/g++的include路径和其他一些路径问题
    volatile 和 sig_atomic_t
    分布式文件系统虚拟目录及命名空间的实现方法
  • 原文地址:https://www.cnblogs.com/mondol/p/6600119.html
Copyright © 2011-2022 走看看