zoukankan      html  css  js  c++  java
  • 使用MSBuild自动编译发布你的ASP.NET应用程序

    此文介绍如何使用MSBuild自动编译并发布你的ASP.NET应用程序. 比较适合每日编译.
    
    通常我们都使用IDE(Visual Studio)编译并发布ASP.NET程序, 需要手动操作, 如果步骤繁琐会很容易出错. 
    
    同样的工作可由MSBuild自动完成, MSBuild是一个Visual Studio编译工具, 随.NET Framework提供, 一般可在 %SystemDrive% WINDOWSMicrosoft.NETFrameworkv3.5 找到.
    
    有关MSBuild的详细介绍请看MSDN:  MSBuild Overview
    
    下面我们用一个例子来介绍一下MSBuild是如何做到这些的. 请从这里下载示例: MSBuildDemo
    解压示例文件到一个新的目录, 其中MSBuildDemo.sln是一个样板项目, 这个样板项目包括一个Class Library工程Ref, 一个Web Application工程WebApp和一个网站WebSite.
    
    而DailyBuildDailyBuild.sln是我们为MSBuild创建的, 它包含了MSBuild编译和发布的配置信息, 包括编译方案(Release), 网站发布设置等.
    
    现在试一下, 双击DailyBuildDailyBuild.bat, 看能否自动编译并发布WebApp到WebAppPublished, 编译并发布WebSite到WebSitePublished目录中?
     
    
    DailyBuild.bat中, 主要命令是: C:WINDOWSMicrosoft.NETFrameworkv3.5MSBuild.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<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
     2    <PropertyGroup>
     3        <SolutionRoot>..</SolutionRoot>
     4        <WebAppOutput>..WebAppPublished</WebAppOutput>
     5        <WebSiteOutput>..WebSitePublished</WebSiteOutput>
     6    </PropertyGroup>
     7
     8    <Target Name="GetLatest">
     9        <PropertyGroup>
    10            <TFServer>$/PO</TFServer>
    11            <WorkspacePath>D:WorkCopiesPOsrc	runk</WorkspacePath>
    12            <TFCommand>D:ProgramsVS9Common7IDE	f.exe</TFCommand>
    13        </PropertyGroup>
    14
    15        <Exec
    16            Command="$(TFCommand) history $(TFServer) /version:T /noprompt /recursive /stopafter:1 /format:detailed 1>DailyBuildMSBuildLatestChangeset.txt"
    17            WorkingDirectory="$(SolutionRoot)"
    18            ContinueOnError="true" />
    19
    20        <Exec
    21            Command="$(TFCommand) get"
    22            WorkingDirectory="$(WorkspacePath)"
    23            ContinueOnError="true" />
    24        
    25    </Target>
    26
    27    <Target Name="Build">
    28        <RemoveDir Directories="$(WebAppOutput)" ContinueOnError="false" />
    29        <MakeDir Directories="$(WebAppOutput)" ContinueOnError="false" />
    30        <RemoveDir Directories="$(WebSiteOutput)" ContinueOnError="false" />
    31        <MakeDir Directories="$(WebSiteOutput)" ContinueOnError="false" />
    32
    33        <MSBuild
    34            Projects="$(SolutionRoot)DailyBuildDailyBuild.sln"
    35            ContinueOnError="false"
    36            Targets="Rebuild"
    37            Properties="Configuration=Release">
    38        </MSBuild>
    39    </Target>
    40
    41    <Target Name="CleanupAfterBuild" DependsOnTargets="Build">
    42        <Delete Files="$(WebAppOutput)in*.pdb" ContinueOnError="true" />
    43        <Delete
    44            Condition="Exists('$(WebAppOutput)BFL.MSBuildDemo.WebApp.csproj')"
    45            Files="$(WebAppOutput)BFL.MSBuildDemo.WebApp.csproj"
    46            ContinueOnError ="true" />
    47        <Delete
    48            Condition="Exists('$(WebAppOutput)BFL.MSBuildDemo.WebApp.csproj.user')"
    49            Files="$(WebAppOutput)BFL.MSBuildDemo.WebApp.csproj.user"
    50            ContinueOnError ="true" />
    51        <Delete
    52            Condition="Exists('$(WebAppOutput)BFL.MSBuildDemo.WebApp.Publish.xml')"
    53            Files="$(WebAppOutput)BFL.MSBuildDemo.WebApp.Publish.xml"
    54            ContinueOnError ="true" />
    55        <RemoveDir
    56            Condition="Exists('$(WebAppOutput)obj')"
    57            Directories="$(WebAppOutput)obj"
    58            ContinueOnError ="true" />
    59
    60        <Delete Files="$(WebSiteOutput)in*.pdb" ContinueOnError="true" />
    61    </Target>
    62
    63    <Target Name="Main">
    64        <CallTarget Targets="GetLatest" ContinueOnError="false" />
    65        <CallTarget Targets="CleanupAfterBuild" />
    66    </Target>
    67</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添加更多种任务.
  • 相关阅读:
    [skill][c][ld][gcc] 明确指定gcc在链接时明确使用静态库
    [administrative][lvm] lvm 分区修改
    [administrative] windows 下制作USB启动盘的工具
    [administrative][archlinux][netctl][wpa_supplicant] 查看WIFI链接信息
    [skill][makefile] makefile 常用内容记录
    [security] security engine things
    [administrative][CentOS] 新装系统时如何正确精准的选择基础环境和软件包
    [filesystem][archlinux][disk encryption][btrfs] btrfs
    [cipher][archlinux][disk encryption][btrfs] 磁盘分区加密 + btrfs
    [administrative][archlinux][clonezilla][disk cloning] 一块 windows 10 硬盘的备份
  • 原文地址:https://www.cnblogs.com/quke123/p/4101908.html
Copyright © 2011-2022 走看看