此文介绍如何使用MSBuild自动编译并发布你的ASP.NET应用程序. 比较适合每日编译.
通常我们都使用IDE(Visual Studio)编译并发布ASP.NET程序, 需要手动操作, 如果步骤繁琐会很容易出错.
同样的工作可由MSBuild自动完成, MSBuild是一个Visual Studio编译工具, 随.NET Framework提供, 一般可在 %SystemDrive% \WINDOWS\Microsoft.NET\Framework\v3.5 找到.
有关MSBuild的详细介绍请看MSDN: MSBuild Overview
下面我们用一个例子来介绍一下MSBuild是如何做到这些的. 请从这里下载示例: MSBuildDemo
解压示例文件到一个新的目录, 其中MSBuildDemo.sln是一个样板项目, 这个样板项目包括一个Class Library工程Ref, 一个Web Application工程WebApp和一个网站WebSite.
而DailyBuild\DailyBuild.sln是我们为MSBuild创建的, 它包含了MSBuild编译和发布的配置信息, 包括编译方案(Release), 网站发布设置等.
现在试一下, 双击DailyBuild\DailyBuild.bat, 看能否自动编译并发布WebApp到WebAppPublished, 编译并发布WebSite到WebSitePublished目录中?
DailyBuild.bat中, 主要命令是: C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe DailyBuild.xml /t:Main @DailyBuild.rsp
其中DailyBuild.xml存储了一系列MSBuild的任务(有关MSBuild任务的相关信息, 请参考MSDN: MSBuild Task Reference), MSBuild就是通过执行一系列的任务来编译和发布你的程序的.
/t:Main 指定了MSBuild的入口点, 它说明了MSBuild应该从哪里开始(后面还会提到).
@DailyBuild.rsp为MSBuild指定了响应文件(为了避免重复输入相同的命令开关, 将这些开关每个一行放入响应文件中代替).
主要的部分就是DailyBuild.xml:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | <?xml version= "1.0" encoding= "utf-8" ?> <Project xmlns= "http://schemas.microsoft.com/developer/msbuild/2003" > <PropertyGroup> <SolutionRoot>..</SolutionRoot> <WebAppOutput>..\WebAppPublished</WebAppOutput> </PropertyGroup> <Target Name= "Build" > <RemoveDir Directories= "$(WebAppOutput)" ContinueOnError= "false" /> <MakeDir Directories= "$(WebAppOutput)" ContinueOnError= "false" /> <MSBuild Projects= "$(SolutionRoot)\DailyBuild\DailyBuild.sln" ContinueOnError= "false" Targets= "Rebuild" Properties= "Configuration=Release" > </MSBuild> </Target> <Target Name= "CleanupAfterBuild" DependsOnTargets= "Build" > <Delete Files= "$(WebAppOutput)\bin\*.pdb" ContinueOnError= "true" /> <Delete Condition= "Exists('$(WebAppOutput)\BFL.MSBuildDemo.WebApp.csproj')" Files= "$(WebAppOutput)\BFL.MSBuildDemo.WebApp.csproj" ContinueOnError = "true" /> <Delete Condition= "Exists('$(WebAppOutput)\BFL.MSBuildDemo.WebApp.csproj.user')" Files= "$(WebAppOutput)\BFL.MSBuildDemo.WebApp.csproj.user" ContinueOnError = "true" /> <Delete Condition= "Exists('$(WebAppOutput)\BFL.MSBuildDemo.WebApp.Publish.xml')" Files= "$(WebAppOutput)\BFL.MSBuildDemo.WebApp.Publish.xml" ContinueOnError = "true" /> <RemoveDir Condition= "Exists('$(WebAppOutput)\obj')" Directories= "$(WebAppOutput)\obj" ContinueOnError = "true" /> </Target> <Target Name= "Main" > <CallTarget Targets= "CleanupAfterBuild" /> </Target> </Project> |
其中 PropertyGroup 定义了一些全局变量, 你可以在这个文件中以$(变量名)的方式使用它. Target 相当于函数或方法, 我们在上面的命令中为MSBuild定义的入口点/t:Main就是一个Target.
Target由一组CallTarget或MSBuild任务组成, 可以为Target元素定义DependsOnTargets属性, 以确保在执行当前Target 前先调用DependsOnTargets指定的Target.
由 DailyBuild.xml的Target名称可以看出, 示例中我们首先执行的是GetLatest, 它确保在编译之前先获取最新版本的代码. 我们通过在GetLatest中执行两个Exec任务做到这点.
这里我使用了TFS(Team Foundation Server), 你完全可以根据你的实际情况替换成等价的VSS, CVS或SVN命令.
接下来执行的是Build, 我们调用MSBuild任务来编译DailyBuild.sln解决方案, 并根据解决方案中的设置, 发布WebApp和WebSite.
最后, 根据多次自动编译的经验, 我添加了CleanupAfterBuild, 以删除不必要的文件.
另外, 你可以参考这个链接MSBuild Community Tasks, 给MSBuild添加更多种任务.
如果你对MSBuild有兴趣, 或有什么疑问, 可以通过mailto:PeterLeePersonal@gmail.com 与我联系.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述