static IEnumerator Execute(bool showDialog)
        {
            if (showDialog)
            {
                //启用对话框,代码会停顿在此,等点击了才往下执行
                if (!EditorUtility.DisplayDialog("一键打包工具", "确定要执行吗?", "确定", "取消"))
                {
                    yield break;
                }
            }

            int count = 0;

            if (BuildSetting.instance.isExportToMainProject && (string.IsNullOrEmpty(BuildSetting.instance.streamingFolder)))// || !arg.StreamingFolder.EndsWith("StreamingAssets")))
            {
                if (showDialog)
                {
                    EditorUtility.DisplayDialog("错误", "导出目标项目StreamingAssets目录设置不正确...", "确定");
                }
                yield break;
            }

            // 计时
            System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch();
            stopwatch.Start();

            #region 流程

            // 打包
            if (BuildSetting.instance.isBuild)
            {
                count++;

                if (BuildSetting.instance.isForceRebuildAll && Directory.Exists(BuildConfig.buildingRootFolder))
                {
                    Directory.Delete(BuildConfig.buildingRootFolder, true);
                }

                IEnumerator buildEtor = Builder.Build();
                while (buildEtor.MoveNext())
                {
                    yield return(buildEtor.Current);
                }
            }

            // 导出到 streaming asset
            if (BuildSetting.instance.isExportToMainProject)
            {
                count++;

                Uploader.UploadToStreamingAssetsFolder(BuildSetting.instance.streamingFolder);
                yield return("导出到主项目的 StreamingAssets 目录完毕。");

                AssetDatabase.Refresh();
                yield return("刷新项目资源...");
            }

            // 导出到 ftp 服务器
            if (BuildSetting.instance.isUploadToFtp)
            {
                count++;

                string ftpRelativePath = "AssetBundle/" + BuildConfig.platformFolderName;
                string srcFolder       = BuildSetting.instance.isFtpUploadAll ? BuildConfig.buildingAssetBundlesFolder : BuildConfig.tempbuildingAssetBundlesFolder;
                Uploader.UploadToFtp(BuildSetting.instance.ftpUri, srcFolder, ftpRelativePath, BuildSetting.instance.ftpUserName, BuildSetting.instance.ftpPassword, BuildSetting.instance.isFtpPassive);
                yield return("已使用控制台程序上传ftp...");
            }

            #endregion

            BuildSetting.instance.Save();

            stopwatch.Stop();

            int    totalSeconds = (int)(stopwatch.ElapsedMilliseconds / 1000f);
            int    minutes      = Mathf.FloorToInt(totalSeconds / 60f);
            int    seconds      = totalSeconds % 60;
            string dialog       = count > 0 ? string.Format("执行结束!耗时: {0} 分 {1} 秒。", minutes, seconds) : "什么也没发生...";
            yield return(dialog);

            // 弹出结果框
            if (showDialog)
            {
                EditorUtility.DisplayDialog("完成", dialog, "确定");
            }
        }