private void OnGUI()
        {
            GUILayout.BeginHorizontal();
            {
#if !ODIN_INSPECTOR
                GUILayout.Label("缺少Odin!");
#endif

#if ODIN_INSPECTOR
                EXPORT_PATH = BApplication.DevOpsPublishAssetsPath;
                if (editorScript != null)
                {
                    //GUILayout.BeginVertical();
                    SirenixEditorGUI.BeginBox("脚本", true, GUILayout.Width(220), GUILayout.Height(450));
                    editorScript.OnGUI();
                    SirenixEditorGUI.EndBox();
                    //GUILayout.EndVertical();
                }

                // Layout_DrawLineV(Color.white);

                if (editorAsset != null)
                {
                    SirenixEditorGUI.BeginBox("资源", true, GUILayout.Width(220), GUILayout.Height(450));
                    editorAsset.OnGUI();
                    SirenixEditorGUI.EndBox();
                }

                // Layout_DrawLineV(Color.white);
                if (editorTable != null)
                {
                    SirenixEditorGUI.BeginBox("表格", true, GUILayout.Width(200), GUILayout.Height(450));
                    editorTable.OnGUI();
                    SirenixEditorGUI.EndBox();
                    //Layout_DrawLineV(Color.white);
                }
#endif
            }
            GUILayout.EndHorizontal();


            EditorGUILayoutEx.Layout_DrawLineH(Color.white);
            //绘制一键导出和构建Editor WebServer
            GUILayout.BeginHorizontal();
            OnGUI_OneKeyExprot();
            EditorGUILayoutEx.Layout_DrawLineV(Color.white);
            OnGUI_PublishEditorService();
            GUILayout.EndHorizontal();
        }
        private void OnGUI()
        {
            var allconfigs = HotfixPipelineTools.HotfixFileConfig.GetAllConfig();

            if (curSlectConfigItem == null && allconfigs.Length > 0)
            {
                curSlectConfigItem = allconfigs[0];
            }

            //绘制config
            ONGUI_DrawAllConfig();
            //排版
            EditorGUILayoutEx.Layout_DrawLineH(new Color(1, 1, 1, 0.5f), 2);
            GUILayout.BeginVertical();
            ONGUI_DrawFileList();
            GUILayout.EndVertical();
        }
        private void ONGUI_DrawAllConfig()
        {
            GUILayout.BeginVertical();
            //渲染所有的配置
            EditorGUILayout.LabelField("热更文件配置:");


            //添加配置
            GUILayout.BeginHorizontal(GUILayout.Width(w));
            {
                // Tag
                addTag = EditorGUILayout.TextField(addTag, GUILayout.Width(100));
                GUILayout.Space(20);
                //添加
                if (GUILayout.Button("添加", GUILayout.Width(40)))
                {
                    var ret = HotfixPipelineTools.HotfixFileConfig.AddConfigItem(addTag);
                    if (ret)
                    {
                        var config = HotfixPipelineTools.HotfixFileConfig.GetConfig(addTag);
                        config.AddFolderFilter("Assets", ".xxx");
                    }

                    EditorUtility.DisplayDialog("提示", "添加:" + (ret ? "成功" : "失败"), "OK");
                }
            }
            GUILayout.EndHorizontal();

            //渲染所有的配置
            EditorGUILayoutEx.Layout_DrawLineH(Color.white, 2f);
            GUILayout.BeginHorizontal();
            {
                GUILayout.Label("已存在配置", GUILayout.Width(200));
                GUILayout.Label("默认配置类型", GUILayout.Width(200));
            }
            GUILayout.EndHorizontal();
            var configs = HotfixPipelineTools.HotfixFileConfig.GetAllConfig();

            GUILayout.BeginHorizontal();
            {
                var tags = configs.Select((con) => con.Tag).ToArray();
                //
                if (tags.Length > 0)
                {
                    curSelectTagIdx = EditorGUILayout.Popup(curSelectTagIdx, tags, GUILayout.Width(200));
                }
                else
                {
                    GUILayout.Label("无配置", GUILayout.Width(200));
                }

                this.curSlectConfigItem = configs.FirstOrDefault((c) => c.Tag == tags[curSelectTagIdx]);
                if (curSlectConfigItem == null)
                {
                    this.curSlectConfigItem = new HotfixFileConfigLogic.HotfixFileConfigItem();
                }

                this.curSlectConfigItem.DefeaultConfigType = (HotfixFileConfigLogic.HotfixFileConfigItem.DefeaultConfigTypeEnum)EditorGUILayout.EnumPopup(this.curSlectConfigItem.DefeaultConfigType, GUILayout.Width(200));
                //添加按钮
                GUILayout.Space(20);

                GUI.color = Color.green;
                if (GUILayout.Button("添加目录", GUILayout.Width(75)))
                {
                    curSlectConfigItem.AddFolderFilter("null", "xx");
                }

                GUI.color = GUI.backgroundColor;

                GUILayout.Space(20);
                GUI.color = Color.red;
                if (GUILayout.Button("删除", GUILayout.Width(75)))
                {
                    var ret = EditorUtility.DisplayDialog("提示", "是否删除该配置?", "OK", "Cancel");
                    if (ret)
                    {
                        HotfixPipelineTools.HotfixFileConfig.RemoveConfigItem(this.curSlectConfigItem.Tag);
                    }
                }

                GUI.color = GUI.backgroundColor;
            }
            GUILayout.EndHorizontal();
            //开始排版
            GUILayout.BeginHorizontal(GUILayout.Width(w));
            {
                GUILayout.Label("路径", GUILayout.Width(400));
                GUILayout.Space(10);
                GUILayout.Label("后缀", GUILayout.Width(100));
            }
            GUILayout.EndHorizontal();


            //显示所有的floder
            foreach (var floderFilter in this.curSlectConfigItem.GetFloderFilters())
            {
                GUILayout.BeginHorizontal(GUILayout.Width(w));
                {
                    //添加目录
                    GUILayout.Label(floderFilter.FloderPath, GUILayout.Width(380));
                    if (GUILayout.Button("...", GUILayout.Width(20)))
                    {
                        var folder = EditorUtility.OpenFolderPanel("选择文件夹", Application.dataPath, "");
                        floderFilter.FloderPath = folder.Replace(BApplication.ProjectRoot + "/", "");

                        var files = Directory.GetFiles(floderFilter.FloderPath, "*", SearchOption.AllDirectories);

                        if (files.Length > 0)
                        {
                            floderFilter.FileExtensionName = Path.GetExtension(files[0]);
                        }
                    }

                    GUILayout.Space(10);
                    //添加的后缀名
                    floderFilter.FileExtensionName = EditorGUILayout.TextField(floderFilter.FileExtensionName, GUILayout.Width(80));
                    if (!floderFilter.FileExtensionName.StartsWith("."))
                    {
                        floderFilter.FileExtensionName = ("." + floderFilter.FileExtensionName);
                    }

                    GUILayout.Space(20);

                    GUI.color = Color.red;
                    if (GUILayout.Button("-", GUILayout.Width(20)))
                    {
                        var ret = EditorUtility.DisplayDialog("提示", "是否删除该目录?", "OK", "Cancel");
                        if (ret)
                        {
                            this.curSlectConfigItem.RemoveFloderFilter(floderFilter.FloderPath);
                            return;
                        }
                    }

                    GUI.color = GUI.backgroundColor;
                }
                GUILayout.EndHorizontal();
            }


            if (configs.Length < 10)
            {
                GUILayout.Space(20 * (10 - configs.Length));
            }

            GUILayout.EndVertical();
        }
        /// <summary>
        /// 绘制文件列表
        /// </summary>
        private void ONGUI_DrawFileList()
        {
            if (curSlectConfigItem == null)
            {
                return;
            }

            GUILayout.BeginHorizontal();
            GUILayout.Label("非热更文件:", GUILayout.Width(395));
            EditorGUILayoutEx.Layout_DrawLineV(Color.white, 2f);
            GUILayout.Label("热更文件:", GUILayout.Width(400));
            GUILayout.EndHorizontal();

            EditorGUILayoutEx.Layout_DrawLineH(Color.white, 2f);
            GUILayout.BeginHorizontal();
            //左边
            pos1 = EditorGUILayout.BeginScrollView(pos1, false, false, GUILayout.Width(398), GUILayout.Height(700));
            {
                var hotfixfiles = curSlectConfigItem.GetNotHotfixFiles();
                foreach (var file in hotfixfiles)
                {
                    GUILayout.BeginHorizontal(GUILayout.Width(398));
                    {
                        GUILayout.Label(file, GUILayout.Width(370));
                        if (GUILayout.Button(">"))
                        {
                            var ret = EditorUtility.DisplayDialog("提示", "是否添加热更文件?", "OK", "Cancel");
                            if (ret)
                            {
                                curSlectConfigItem.AddHotfixFile(file);
                            }
                        }
                    }
                    GUILayout.EndHorizontal();
                    EditorGUILayoutEx.Layout_DrawLineH(Color.grey, 1f);
                }
            }
            EditorGUILayout.EndScrollView();


            EditorGUILayoutEx.Layout_DrawLineV(Color.white, 2f);
            //右边
            pos2 = EditorGUILayout.BeginScrollView(pos2, false, false, GUILayout.Width(398), GUILayout.Height(700));
            {
                var nothotfixFiles = curSlectConfigItem.GetHotfixFiles();
                for (int i = 0; i < nothotfixFiles.Length; i++)
                {
                    var file = nothotfixFiles[i];

                    GUILayout.BeginHorizontal();
                    {
                        if (GUILayout.Button("<"))
                        {
                            var ret = EditorUtility.DisplayDialog("提示", "是否移除热更列表?", "OK", "Cancel");
                            if (ret)
                            {
                                curSlectConfigItem.RemoveHotfixFile(file);
                                break;
                            }
                        }

                        GUILayout.Label(file, GUILayout.Width(370));
                    }
                    GUILayout.EndHorizontal();
                    EditorGUILayoutEx.Layout_DrawLineH(Color.grey, 1f);
                }
            }
            EditorGUILayout.EndScrollView();

            GUILayout.EndHorizontal();
        }
        /// <summary>
        /// CI 相关
        /// </summary>
        public void OnGUI_BuildpipelineCI()
        {
            GUILayout.BeginVertical();
            {
                var devops_setting = BDEditorApplication.BDFrameWorkFrameEditorSetting.BuildSetting;
                GUILayout.BeginHorizontal();
                {
                    GUILayout.BeginVertical();
                    GUILayout.Label("资源仓库地址:");

                    devops_setting.AssetServiceVCSData.Url      = EditorGUILayout.TextField("地址", devops_setting.AssetServiceVCSData.Url, GUILayout.Width(350));
                    devops_setting.AssetServiceVCSData.UserName = EditorGUILayout.TextField("账号", devops_setting.AssetServiceVCSData.UserName, GUILayout.Width(350));
                    devops_setting.AssetServiceVCSData.Psw      = EditorGUILayout.TextField("密码", devops_setting.AssetServiceVCSData.Psw, GUILayout.Width(350));
                    GUILayout.EndHorizontal();

                    GUILayout.BeginVertical();
                    GUILayout.Label("母包仓库地址:");
                    devops_setting.PackageServiceVCSData.Url      = EditorGUILayout.TextField("地址", devops_setting.PackageServiceVCSData.Url, GUILayout.Width(350));
                    devops_setting.PackageServiceVCSData.UserName = EditorGUILayout.TextField("账号", devops_setting.PackageServiceVCSData.UserName, GUILayout.Width(350));
                    devops_setting.PackageServiceVCSData.Psw      = EditorGUILayout.TextField("密码", devops_setting.PackageServiceVCSData.Psw, GUILayout.Width(350));
                    GUILayout.EndHorizontal();
                }
                GUILayout.EndHorizontal();

                GUILayout.Space(20);

                GUILayout.Label("支持CI列表:");
                EditorGUILayoutEx.Layout_DrawLineH(Color.white, 2f);
                //获取所有ciapi
                var ciMethods = DevOpsTools.GetCIApis();
                pos = EditorGUILayout.BeginScrollView(pos, GUILayout.Width(850), GUILayout.Height(500));
                {
                    foreach (var cim in ciMethods)
                    {
                        var attrs  = cim.GetCustomAttributes(false);
                        var ciAttr = attrs[0] as CIAttribute;
                        GUILayout.BeginHorizontal();
                        {
                            //描述
                            GUILayout.Label(ciAttr.Des + ":", GUILayout.Width(150));
                            //函数
                            var ciName = cim.ReflectedType.FullName + "." + cim.Name;
                            GUILayout.Label(ciName, GUILayout.Width(580));
                            //按钮
                            if (GUILayout.Button("复制", GUILayout.Width(50)))
                            {
                                GUIUtility.systemCopyBuffer = ciName;
                                EditorUtility.DisplayDialog("提示", "复制成功!\n" + cim.Name, "OK");
                            }

                            if (GUILayout.Button("执行", GUILayout.Width(50)))
                            {
                                var ret = EditorUtility.DisplayDialog("提示", "是否执行:" + cim.Name, "OK", "Cancel");
                                if (ret)
                                {
                                    //执行
                                    cim.Invoke(null, new object[] { });
                                }
                            }
                        }
                        GUILayout.EndHorizontal();
                    }
                }
                EditorGUILayout.EndScrollView();
                EditorGUILayoutEx.Layout_DrawLineH(Color.white);


                GUILayout.Space(10);
                EditorGUILayoutEx.Layout_DrawLineH(Color.white);

                GUILayout.Label(@"服务器CI流程:
一般Git管理代码,SVN或P4管理美术资产。
Git master分支作为稳定发布版本分支,工作都在子分支,测试通过后会合并到主分支。
SVN资产也会用hook实现同步到Git assets分支,供程序使用. 程序也会将测试通过的资产随着code提交到主分支.
CI一般监听Git Master分支,定时一键构建所有资产:AB包、脚本、Sql

1.资源流程: master提交=>生成AB、热更脚本、sql=>AB性能测试=>WebHook通知到内部=>提交到资产SVN
2.母包流程: 更新资产SVN、更新Git master=>构建母包=>自动包体测试=>通知测试结果
3.资源发布: 更新资产SVN=>发布到资源服务器
");
            }
            GUILayout.EndVertical();
        }