解决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 模式-> 代码生成器模式 ...
随机推荐
- python 多线程和多进程
多线程与多进程 知识预览 一 进程与线程的概念 二 threading模块 三 multiprocessing模块 四 协程 五 IO模型 回到顶部 一 进程与线程的概念 1.1 进程 考虑一个场景: ...
- 如何做出一个更好的Machine Learning预测模型【转载】
作者:文兄链接:https://zhuanlan.zhihu.com/p/25013834来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 初衷 这篇文章主要从工程角度来 ...
- 366. Fibonacci
描述 查找斐波纳契数列中第 N 个数. 所谓的斐波纳契数列是指: 前2个数是 0 和 1 . 第 i 个数是第 i-1 个数和第i-2 个数的和. 斐波纳契数列的前10个数字是: 0, 1, 1, 2 ...
- ISP PIPLINE(零) 知识综述预热
本文为camera isp pipline概述 ISP,即image signal processing.为图像成型做的处理工作.适应不同光学环境下图像的还原. pipline流程如下: 光通过LEN ...
- LR特征维数特别大实时计算问题
美团 https://tech.meituan.com/machinelearning-data-feature-process.html 维数灾难 待续...
- php 获取读取文件内容
/* * 获取文件内容 * */ public function getLocalFileContents($file) { $handle = @ ...
- jQueryUI详解
引入文件下载地址:http://jqueryui.com/download/ dialog常见的参数: 常用参数: 属性 类型 说明 Boolean autoOpen 属性 设置该组件被调用时的打开状 ...
- ORM字段操作
django orm 建表字段 在django modle 中,我们定义的类,他的对象就是数据库表中的一行数据!!! django orm 基础 一:modle的各个字段: 在python中以code ...
- 学习 IOC 设计模式前必读:依赖注入的三种实现
一直以来就是越难的东西越值钱! 嘿嘿,这篇博文章转载自:http://www.cnblogs.com/liuhaorain/p/3747470.html 摘要 面向对象设计(OOD)有助于我们开发出高 ...
- jquery .stop()的用法
jquery的.stop()的用法: 目的:为了 了解stop()的用法,举个例子,直观的方式看看. 实物:一个id="animater"的div包含了一段文字.(以下用anima ...