static async Task Main(string[] args) { Console.Title = "WEB发布工具"; string configPath = System.Environment.CurrentDirectory + @"\config.json"; Config config = null; if (!File.Exists(configPath)) { Console.WriteLine("缺少配置文件config.json"); goto lbWhile; } string strConfig = File.ReadAllText(configPath); config = JsonConvert.DeserializeObject <Config>(strConfig); if (config == null) { Console.WriteLine("缺少配置"); goto lbWhile; } Console.WriteLine("欢迎使用WEB程序发布工具,致力于一键发布WEB程序"); Console.WriteLine("----------------------------------------------------"); Console.WriteLine("执行配置的CMD命令: run cmd"); Console.WriteLine("打包Web文件: batch"); Console.WriteLine("退出: exit"); Console.WriteLine("----------------------------------------------------"); lbWhile: while (true) { string cmd = Console.ReadLine().ToLower(); if (cmd == "batch") { Console.WriteLine("请输入您版本文件存放地,值为native或remote,native为项目目录下,remote将通过Ftp远程获取"); string versionFileStore = ""; while (true) { versionFileStore = Console.ReadLine().ToLower(); if (versionFileStore == "native" || versionFileStore == "remote") { break; } Console.WriteLine("文件存放地不合法,请输入native或remote"); } Console.WriteLine("请输入您需要输出的类型,值为zip或ftp,zip为打包成zip压缩文件,ftp将自动上传至您配置的ftp目录"); string outType = ""; while (true) { outType = Console.ReadLine().ToLower(); if (outType == "zip" || outType == "ftp") { break; } Console.WriteLine("输出类型不合法,请输入zip或者ftp"); } Console.WriteLine("您需要执行配置的CMD命令吗?yes or no"); string isRunCmd = Console.ReadLine().ToLower(); if (isRunCmd == "yes") { BatchFrontFile(config.Projects); } PrintPrompt("开始文件版本比对,请稍后...."); string currentOutDir = config.OutDir + $@"\{DateTime.Now.ToString("yyyyMMdd")}"; int i = 1; while (Directory.Exists(currentOutDir)) { if (i > 1) { currentOutDir = currentOutDir.Substring(0, currentOutDir.LastIndexOf('-')); } currentOutDir += "-" + i; i++; } foreach (var item in config.Projects) { if (item.ProjectFtpConfig == null) { item.ProjectFtpConfig = config.PublicFtpConfig; } FileManage fileManage = new FileManage(item, versionFileStore); fileManage.IgnoreDir = config.IgnoreDir; fileManage.IgnoreFileName = config.IgnoreFileName; fileManage.IgnoreFileSuffix = config.IgnoreFileSuffix; string projectOutDir = currentOutDir + $@"\{item.ProjectName}"; fileManage.OutUpdateFile(item.ReleasePath, projectOutDir); fileManage.SaveVersionFile(projectOutDir); } PrintPrompt("文件版本比对完毕"); if (outType == "zip" && Directory.Exists(currentOutDir)) { PrintPrompt("开始压缩文件,请稍后...."); string zipName = string.Empty; if (i == 1) { zipName = $"Web更新包{DateTime.Now.ToString("yyyyMMdd")}.zip"; } else { zipName = $"Web更新包{DateTime.Now.ToString("yyyyMMdd")}-{i - 1}.zip"; } ZipFile.CreateFromDirectory(currentOutDir, config.OutDir + "\\" + zipName); PrintPrompt("开始压缩文件完毕,恭喜您,打包已全部完成"); } else { PrintPrompt("开始通过FTP上传文件,请稍后...."); DateTime statDT = DateTime.Now; foreach (var item in config.Projects) { string projectOutDir = currentOutDir + $@"\{item.ProjectName}"; if (!Directory.Exists(projectOutDir)) { continue; } List <string> allFile = FileManage.GetAllFile(projectOutDir); FtpConfig ftpConfig = config.PublicFtpConfig; if (item.ProjectFtpConfig != null) { ftpConfig = item.ProjectFtpConfig; } DirUploadState dirUploadState = new DirUploadState(); dirUploadState.FileCount = allFile.Count(); dirUploadState.FileIndex = 1; using (var ftp = new FtpClient(ftpConfig.Host, ftpConfig.Port, ftpConfig.User, ftpConfig.Pass)) { ftp.Connect(); Action <FtpProgress> progress = delegate(FtpProgress p) { if (p.Progress == 1) { } else { Console.WriteLine($"正在更新项目“{item.ProjectName}”,总共{dirUploadState.FileCount}个文件,正在上传第{dirUploadState.FileIndex + 1}个文件, {p.LocalPath}:{ (p.Progress).ToString("#0") }%"); } }; FileManage.UploadToFtp(ftp, projectOutDir, item.FtpDir, projectOutDir, progress, dirUploadState); } } PrintPrompt($"上传文件完成,FTP耗时{ (int)((DateTime.Now - statDT).TotalSeconds)}秒"); } PrintPrompt("batch 执行完毕"); } else if (cmd == "help") { Console.WriteLine("run cmd 执行配置的CMD命令"); Console.WriteLine("batch 输出需要更新的文件"); Console.WriteLine("exit 退出"); } else if (cmd == "exit") { break; } else { Console.WriteLine($"'{cmd}'无效命名 输入help查看命令"); } } }