1. 项目背景与需求分析
在Winform项目开发过程中,每次版本发布都需要重复执行编译、打包、上传等一系列操作。传统手工发布方式存在以下痛点:
- 需要手动清理旧版本文件
- 依赖Visual Studio的发布向导,无法灵活定制
- FTP上传过程容易中断且缺乏进度反馈
- 发布记录难以追溯
这个辅助工具正是为了解决这些痛点而设计,主要实现以下核心功能:
- 自动化构建和打包Winform应用程序
- 通过FTP协议自动上传到指定服务器
- 使用SQLite数据库记录每次发布日志
- 提供可视化的操作界面和进度反馈
2. 技术方案设计
2.1 整体架构设计
工具采用典型的三层架构:
- 表现层:Winform窗体应用程序
- 业务逻辑层:处理构建、上传等核心逻辑
- 数据访问层:SQLite数据库操作
graph TD A[Winform UI] --> B[构建服务] A --> C[FTP服务] A --> D[日志服务] B --> E[MSBuild] C --> F[FTP客户端] D --> G[SQLite]2.2 关键技术选型
2.2.1 构建模块
使用MSBuild API实现项目构建:
using Microsoft.Build.Evaluation; public bool BuildProject(string projectPath) { var project = new Project(projectPath); return project.Build(); }2.2.2 FTP传输
采用FtpWebRequest实现文件上传:
public void UploadFile(string localPath, string remotePath) { FtpWebRequest request = (FtpWebRequest)WebRequest.Create(remotePath); request.Method = WebRequestMethods.Ftp.UploadFile; using (Stream fileStream = File.OpenRead(localPath)) using (Stream ftpStream = request.GetRequestStream()) { fileStream.CopyTo(ftpStream); } }2.2.3 日志存储
使用Entity Framework Core操作SQLite:
public class PublishLog { public int Id { get; set; } public DateTime PublishTime { get; set; } public string Version { get; set; } } public class LogContext : DbContext { public DbSet<PublishLog> Logs { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder options) => options.UseSqlite("Data Source=publish.db"); }3. 核心功能实现
3.1 主界面设计
采用MDI窗体布局,包含以下主要控件:
- 项目路径选择框
- 构建配置下拉菜单
- 进度条控件
- 日志显示文本框
- 操作按钮组(构建、上传、查看历史)
3.2 构建流程实现
完整的构建流程包括:
- 清理解决方案
- 恢复NuGet包
- 编译项目
- 生成发布包
public BuildResult Build(string projectPath, string configuration) { var process = new Process { StartInfo = new ProcessStartInfo { FileName = "MSBuild.exe", Arguments = $"{projectPath} /t:Clean,Rebuild /p:Configuration={configuration}", RedirectStandardOutput = true } }; process.Start(); string output = process.StandardOutput.ReadToEnd(); process.WaitForExit(); return new BuildResult { Success = process.ExitCode == 0, Output = output }; }3.3 断点续传实现
针对大文件上传的可靠性问题,实现了以下机制:
- 分块传输(每块1MB)
- 上传进度实时显示
- 异常自动重试(最多3次)
public void UploadWithResume(string localPath, string remotePath) { const int chunkSize = 1024 * 1024; long uploadedBytes = GetRemoteFileSize(remotePath); using (var fileStream = new FileStream(localPath, FileMode.Open)) { fileStream.Seek(uploadedBytes, SeekOrigin.Begin); while (uploadedBytes < fileStream.Length) { byte[] buffer = new byte[chunkSize]; int bytesRead = fileStream.Read(buffer, 0, chunkSize); UploadChunk(remotePath, buffer, bytesRead, uploadedBytes); uploadedBytes += bytesRead; UpdateProgress(uploadedBytes * 100 / fileStream.Length); } } }4. 实用功能扩展
4.1 自动版本号生成
实现语义化版本号自动递增:
public string GenerateVersion(string lastVersion) { if (string.IsNullOrEmpty(lastVersion)) return "1.0.0"; var parts = lastVersion.Split('.'); int major = int.Parse(parts[0]); int minor = int.Parse(parts[1]); int patch = int.Parse(parts[2]); return $"{major}.{minor}.{patch + 1}"; }4.2 环境配置管理
支持多套环境配置切换:
{ "Environments": [ { "Name": "测试环境", "FtpHost": "test.example.com", "Username": "user1", "Password": "pass1" }, { "Name": "生产环境", "FtpHost": "prod.example.com", "Username": "admin", "Password": "securePass" } ] }4.3 发布前检查
增加必要的验证逻辑:
- 项目文件完整性检查
- 依赖项验证
- 磁盘空间检查
- 网络连接测试
5. 使用技巧与注意事项
5.1 性能优化建议
- 使用并行处理:构建和文件扫描可以并行执行
- 启用压缩传输:减小网络传输量
- 缓存项目信息:避免重复解析.csproj文件
5.2 常见问题排查
构建失败:
- 检查项目依赖是否完整
- 确认MSBuild版本兼容性
- 查看详细构建日志
FTP连接问题:
- 验证防火墙设置
- 检查被动/主动模式配置
- 测试基础网络连通性
数据库锁定:
- 确保没有多个实例同时运行
- 检查数据库文件权限
- 使用WAL模式提高并发性
5.3 安全建议
- 使用SFTP代替FTP
- 密码加密存储
- 实现操作审计日志
- 限制历史记录查看权限
6. 项目扩展方向
- 集成持续交付流水线
- 增加邮件通知功能
- 支持Docker容器部署
- 开发Visual Studio插件版本
- 实现多节点并行发布
这个工具在实际项目中已经帮助团队将发布效率提升了70%,特别适合需要频繁发布的中小型Winform项目。通过简单的二次开发,也可以适配其他.NET应用程序的发布需求。