前言
在工作中,发现有时会因为一些原因using了一些不适用于打包apk的命名空间导致打包失败,为项目的开发造成了不便,因此为项目做了一个小功能:在每次编译完成后自动进行命名空间的检查,根据设置的筛选条件检查是否存在不合理的命名空间引用
PS:最后会附上完整代码
整体思路
- 首先需要两个类,一个为Util类:具体功能类,一个为Env类:存放一些设置好的过滤条件
- 对目录进行设置好的过滤
- 得到目录内的所有cs后缀的文件
- 对文件进行设置好的过滤
- 逐个遍历cs文件,以文本的方式获得前多少行的内容(或者可以自己设置一些条件如:读取到class声明就暂停之类的)
- 对内容进行设置好的过滤
- 检查每行的内容返回符合条件的文件信息统一存放
- 完成检查,将所有信息打印
- 最后可以用Stopwatch类的方法进行一层包装来计算整体步骤的耗时
正题内容
-
首先是Env数据类:其中存放了几种过滤信息如下
- 最顶级目录指定检查的目录(只检查这些,可以根据自己的项目自行规划)
- 过滤的目录名(这里是满足局部匹配就过滤)
- 过滤的宏定义(遇到这些宏定义时跳过)
- 需要检查的命名空间(这里的内容就是你要查找的符合条件的命名空间)
-
接下来是Util工具类,具体的功能实现都在这里面:
- 首先我们先把过滤的方法实现:这里重载了一个方法用来获得目标含有的过滤字段
private static bool CheckHasFilter(List<string> filterData,string fileName) { //...... } private static bool CheckHasFilter(List<string> filterData,string fileName,out List<string> hasFilterName) { //...... }
- 实现对FileInfo类型文件进行命名空间检查的方法
/// <summary> /// 对传入的文件信息FileInfo类型 进行内容检查 /// </summary> /// <returns></returns> private static List<string> CheckFileInfo(FileInfo fileInfo) { //1.文件名过滤 //2.获取内容 //3.宏定义过滤 //4.内容检查并存放数据 //5.返回 //...... }
- 接下来实现递归查找所有文件夹下的c#文件的方法并检查命名空间
/// <summary> /// 主方法 /// </summary> /// <param name="checkFolderPath">检查的根目录</param> /// <returns></returns> public static Dictionary<string,List<string>> CheckHasErrorNamespace(string checkFolderPath) { //1.得到目录下的C#文件,进行命名空间检查 //2.得到目录下的子目录,递归调用该方法获得子目录的检查信息 //3.返回得到的检查信息 //......
- 首先我们先把过滤的方法实现:这里重载了一个方法用来获得目标含有的过滤字段