惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

爱范儿
爱范儿
腾讯CDC
博客园 - 司徒正美
A
About on SuperTechFans
H
Help Net Security
J
Java Code Geeks
C
Check Point Blog
B
Blog RSS Feed
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
MongoDB | Blog
MongoDB | Blog
U
Unit 42
Hugging Face - Blog
Hugging Face - Blog
Last Week in AI
Last Week in AI
MyScale Blog
MyScale Blog
V
Visual Studio Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
I
InfoQ
H
Hackread – Cybersecurity News, Data Breaches, AI and More
F
Fortinet All Blogs
博客园 - 聂微东
酷 壳 – CoolShell
酷 壳 – CoolShell
GbyAI
GbyAI
博客园 - 【当耐特】
雷峰网
雷峰网

博客园 - Frank.Cui

Scriban语言手册中文版 开源文件服务器file-service介绍 记一次redis病毒分析笔记 推荐一个比FiddlerCore好用的HTTP(S)代理服务器 适用于 Windows 10 的触摸板手势 vi命令示例大全 Linux系统中的常用命令 使用Markdown写作 DapperPoco -- 基于Dapper的、轻量级的、高性能的、简单的、灵活的ORM框架 使用StyleCop.Analyzers进行代码审查 推荐一款好用的WSL终端模拟器 使用ssh公钥密钥自动登陆linux服务器 自动化CodeReview - ASP.NET Core请求参数验证 Fiddler插件开发 - 实现网站离线浏览功能 自动化CodeReview - ASP.NET Core依赖注入 10个有关RESTful API良好设计的最佳实践 ASP.NET Core 获取控制器上的自定义属性 [转] Autofac创建实例的方法总结 PetaPoco - 轻量级高性能的ORM框架(支持.NET Core)
解决Protobuf生成的C#代码命名不规范问题
Frank.Cui · 2017-03-22 · via 博客园 - Frank.Cui

起因

通常使用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 所在目录