解决Protobuf生成的C#代码命名不规范问题
起因
通常使用Protobuf的步骤为
- 定义
.proto
文件 - 使用
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件事
- 生成C#代码
- 替换不符合命名规范的成员变量
- 添加UTF8 BOM头
使用时需要将 TOOLS_DIR
变量修改为 protoc
所在目录
解决Protobuf生成的C#代码命名不规范问题的更多相关文章
- Derek解读Bytom源码-protobuf生成比原核心代码
作者:Derek 简介 Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockchain/bytom ...
- k.tt 研究下生成的逻辑代码:从壹开始前后端分离 [.netCore 填坑 ] 三十二║ 四种方法快速实现项目的半自动化搭建
更新 1.更新小伙伴 @大龄Giser 提出好点子:试试VS的插件扩展:VSIX.ItemProject等,将T4模板给制作插件,这里先记下,有懂的小伙伴可以自己先试试,我会在以后更新. 2.感谢小伙 ...
- 自动生成Code First代码
自动生成Code First代码 在前面的文章中我们提到Entity Framework的“Code First”模式也同样可以基于现有数据库进行开发.今天就让我们一起看一下使用Entity Fram ...
- mybatis自定义代码生成器(Generator)——自动生成model&dao代码
花了两天的时间研究了下mybatis的generator大体了解了其生成原理以及实现过程.感觉generator做的非常不错,给开发者也留足了空间.看完之后在generator的基础上实现了自定义的生 ...
- 【gRPC使用问题2】按照问题1操作生成出来的代码,import的proto内定义的message未生成出来
1.问题 其实元数据proto里是有定义message,但是 这个message的定义是在另一个 proto文件内,被 api.proto导入,事实上 我是对 api.proto 进行命令行生成代码的 ...
- 如何快速编写和调试 Emit 生成 IL 的代码
.NET Core/.NET Framework 的 System.Reflection.Emit 命名空间为我们提供了动态生成 IL 代码的能力.利用这项能力,我们能够在运行时生成一段代码/一个方法 ...
- 将excel中某列数据中,含有指定字符串的记录取出,并生成用这个字符串命名的txt文件
Python 一大重要的功能,就是可处理大量数据,那分不开的即是使用Excel表格了,这里我做下学习之后的总结,望对我,及广大同仁们是一个帮助Python处理Excel数据需要用到2个库:xlwt 和 ...
- 实战:一键生成前后端代码,Mybatis-Plus代码生成器让我舒服了
实战:一键生成前后端代码,Mybatis-Plus代码生成器让我舒服了 前言 在日常的软件开发中,程序员往往需要花费大量的时间写CRUD,不仅枯燥效率低,而且每个人的代码风格不统一.MyBatis-P ...
- [Java 开源项目]一款无需写任何代码,即可一键生成前后端代码的工具
作者:HelloGitHub-小鱼干 JeecgBoot 是一款基于代码生成器的低代码开发平台,零代码开发.JeecgBoot 采用开发模式:Online Coding 模式-> 代码生成器模式 ...
随机推荐
- 使用C#的is、as操作符来转型
is检查对象是否兼容于指定类型,返回Boolean值true或false.使用is永远不会抛出异常. 例:Object o=new Object(); bool b1=(o is Object);// ...
- [Python]Marshmallow 代码
schema.dump和schema.load schema.dump()方法返回一个MarshResult的对象,marshmallow官方API说dump和load方法返回的都是dict对象,但查 ...
- 第二章 STM32的结构和组成
2.5 芯片里面有什么 STM32F103采用的是Cortex-M3内核,内核即CPU,由ARM公司设计. ARM公司并不生产芯片,而是出售其芯片技术授权. 芯片生产厂商(SOC)如ST.TI.Fre ...
- 使用requests进行模拟登陆
import re import requests header = { 'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWe ...
- 修改mybatis plus Generator模板生成字段注释枚举常量
修改mybatis plus Generator模板生成字段注释枚举常量 本文基于最新的mybatis-plus 3.0.1版本源码修改,如果使用其它版本,处理方式也类似,主要是生成Entity的Fr ...
- [POJ3614]Sunscreen (贪心)
题意 (依然来自洛谷) 有C个奶牛去晒太阳 (1 <=C <= 2500),每个奶牛各自能够忍受的阳光强度有一个最小值和一个最大值,太大就晒伤了,太小奶牛没感觉. 而刚开始的阳光的强度非常 ...
- 3ds max学习笔记(十六)-- 摄像机
摄像机添加以及应用技巧:可以更改观察的视点和空间广阔,模拟景深和运动模糊效果: 1,添加:更改观察的角度和位置,增加场景透视感: 基本操作: 景深:
- R语言数据接口
R语言数据接口 R语言处理的数据一般从外部导入,因此需要数据接口来读取各种格式化的数据 CSV # 获得data是一个数据帧 data = read.csv("input.csv" ...
- java基础知识总结--多线程
1.扩展Java.lang.Thread类 1.1.进程和线程的区别: 进程:每个进程都有自己独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1~n个线程. 线程:同一类线 ...
- JS_高程3.基本概念(3)
1.ECMAScript数值的范围 由于内存的限制,在大多数浏览器中,ECMAScript能够拿保存的数据的范围是 5e-324 ~ 1.7976931348623157e+308,其中最小的数值保存 ...