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);
            }
        }
Esempio n. 2
0
        /// <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);
                            }
                        }
                    }
                }
            }
        }