public void Execute(TaskContext context, TaskAction action) { if (action.Items == null) { return; } TotalResult totalResult = context.TotalResult; List <AssemblyScanResult> resultList = new List <AssemblyScanResult>(); try { foreach (string line in action.Items) { AssemblyScaner scaner = new AssemblyScaner(); TextLineSerializer serializer = new TextLineSerializer(); AssemblyScanOption option = serializer.Deserialize <AssemblyScanOption>(line); if (string.IsNullOrEmpty(option.Bin)) { throw new ArgumentException("AssemblyScan任务的参数不正确,没有指定 bin 参数"); } if (string.IsNullOrEmpty(option.Sln)) { if (context.JobOption.SlnFiles != null && context.JobOption.SlnFiles.Length == 1) { option.Sln = context.JobOption.SlnFiles[0]; } else { throw new ArgumentException("AssemblyScan任务的参数不正确,没有指定 sln 参数"); } } List <AssemblyScanResult> list = scaner.Execute(context.Branch, option); resultList.AddRange(list); } totalResult.RuntimeScanResults.AddRange(resultList); context.ConsoleWrite("AssemblyScanTask OK"); } catch (Exception ex) { totalResult.RuntimeScanException = ex.ToString(); context.ProcessException(ex); } }
/// <summary> /// 填充配置中的路径 /// </summary> /// <param name="job"></param> private void PaddingPath(JobOption job) { // 对于大多数项目来说,都有一个根目录 // 而在具体配置文件中,同样的目录会出现在 CodePath,SlnFiles,AssemblyScan 中重复配置 // 这样既不方便,看起来也不美观, // 这里允许 SlnFiles,AssemblyScan 引用 CodePath 路径,而不需要显式指定 // 例如:CodePath : G:\my-github\SpecChecker\demo-code\SpeChecker.DEMO // 那么可以这样配置 SlnFiles : \SpeChecker.DEMO.sln // 只适合配置一个路径时启用 if (job.CodePath != null && job.CodePath.Length == 1) { string basePath = job.CodePath[0].TrimEnd('\\'); if (job.SlnFiles != null) { for (int i = 0; i < job.SlnFiles.Length; i++) { if (job.SlnFiles[i].Length > 0 && job.SlnFiles[i][0] == '\\') { job.SlnFiles[i] = basePath + job.SlnFiles[i]; } } } foreach (var action in job.Actions) { // 只处理 AssemblyScan 节点 if (action.Type == "AssemblyScan" && action.Items != null) { for (int i = 0; i < action.Items.Length; i++) { // 先反序列化,用于获取路径 string line = action.Items[i]; bool changed = false; TextLineSerializer serializer = new TextLineSerializer(); AssemblyScanOption option = serializer.Deserialize <AssemblyScanOption>(line); if (string.IsNullOrEmpty(option.Sln) == false) { if (option.Sln[0] == '\\') { option.Sln = basePath = option.Sln; changed = true; } } if (string.IsNullOrEmpty(option.Bin) == false) { if (option.Bin[0] == '\\') { option.Bin = basePath + option.Bin; changed = true; } } // 如果有变化,就替换配置中的参数 if (changed) { action.Items[i] = serializer.Serialize(option); } } } } } }