`

利用Powershell自动部署asp.net mvc网站项目 (二)

阅读更多

简单来说,部署就是 “构建(Build)” –> “拷贝(打包)” –> “配置”。在前一篇中,我们介绍了“构建”,那么这一篇就说说拷贝(好像我们更习惯于说打包,那么以后我们就叫它打包吧)的事情。为什么要打包呢?在应用程序发布的时候我们当然只希望发布运行时需要的文件,而其他的文件,例如:工程文件,源代码等等是不需要进行发布的。因此我们需要将运行时所需的文件分离出来,做成一个干净的 Package。

打包 – 思路

只需要解决楚两个问题,打包就完成了:第一个问题是,我们打的包应该有怎样的目录结构;第二个问题是,应该拷贝哪些文件夹到包的哪些目录里去。

应该拷贝哪些文件

在回答第一个问题之前,我们先来看看有哪些文件需要进行拷贝。构建好的程序集(.dll 和 .exe)需要拷贝,没错,但是除了它们以外还有其他文件需要进行拷贝。如果在 Visual Studio 中打开 Web Project,并观察每一个文件的 Build Action 属性,你会发现几乎所有的文件都属于以下四种 Build Action

  • None:这意味着这个文件在构建过程中将不做任何处理。典型的例子是 Readme 或者 EULA(End User License Agreement) 文件。这种文件不会在打包中进行拷贝;
  • Compile:这类文件会在构建过程中进行编译,编译结果会嵌入到生成的程序集(dll 或者 exe)中。这类文件在打包的时候是不会进行拷贝的;
  • Content:这个文件不会在构建过程中进行编译。但是这个文件属于整个工程发布的一个部分。因此这类文件在打包的时候进行拷贝;
  • Embedded Resources:这个文件的内容将作为一种嵌入式资源在构建过程中嵌入到程序集中。这个文件在打包的过程中不会被拷贝;

因此,除了构建好的程序集之外,所有 Build Action 为 Content 的文件类型也会在打包的时候被拷贝。

以我们的工程为例:

FromZero.App
│  Global.asax [Content]
│  Global.asax.cs [Compile]
│  packages.config [Content]
│  Web.config [Content]
│  Web.Debug.config [None]
│  Web.Release.config [None]
├─bin
│  /* All build results are stored in this directory. */
├─Controllers
│   HomeController.cs [Compile]
├─Properties
│   AssemblyInfo.cs [Compile]
└─Views
    └─Home
          Index.cshtml [Content]

那么需要拷贝的文件为:

  • .\bin 文件夹下的所有文件;
  • 所有 Build Action 为 Content 属性的文件:Global.asax、packages.config、Web.config、Index.cshtml。

包的目录结构

在上一节我们介绍了,所有构建生成的程序集和 Build Action 为 Content 的文件都会在打包过程中进行拷贝。那么它们会拷贝到什么地方去呢?答案是拷贝到相应的目录下面去。以我们的工程为例,假设我们希望将构建好的工程拷贝到一个名为 Package 的目录下去,那么这个 Package 目录在打包完毕之后应该是这个样子的:

Package
│  Global.asax
│  packages.config
│  Web.config
├─bin
│  /* All build results. */
└─Views
    └─Home
          Index.cshtml

等一下,Controller 和 Properties 目录到哪里去了?由于这两个目录下面没有一个文件需要进行发布,因此这个目录也就不会创建。

假设你的确需要一个 Controller 目录进行发布,该怎么办呢?那么我们可以利用规则创建一个 0KB 的 placeholder 文件。并且将这个文件的 Build Action 属性设置为 Content

至此我们已经可以总结出打包的规则了:

  • 拷贝所有构建过程中生成的程序集文件,以及 Build Action 为 Content 的文件;
  • 将所有需要拷贝的文件拷贝到一个和其所在的工程目录对应的目录下面,如果某一个目录下没有一个文件需要在打包中进行拷贝,则不生成这个目录。

打包-代码

我们是否需要自己解析工程的 XML 结构然后按照上述规则进行打包呢?幸运的是,完全不用:这是因为在 ASP.NET Web 工程中会引用 $(VSToolsPath)\Web\Microsoft.Web.Publishing.targets,其中定义的 _WPPCopyWebApplication 过程正是我们以上描述的过程。我们只需要在上一个例子的基础上修改 Compile-Project 函数:

Function Compile-Project() {
    iex -Command "& '$global_msBuildPath' /t:Rebuild /t:_WPPCopyWebApplication 
/p:WebProjectOutputDir='$global_buildDirPath\Package\' 
/p:UseWPP_CopyWebApplication=True /p:PipelineDependsOnBuild=False '$project_path'"
}

其中:

  • $global_msBuildPath 是 msbuild.exe 的所在位置;
  • /t:Rebuild:首先执行 Rebuild 过程,这将删除上一次的构建结果,然后重新构建整个项目;
  • /t:_WPPCopyWebApplication:将该项目进行打包;
  • /p:WebProjectOutputDir='$global_buildDirPath\Package\':将整个打包结果存放在 buildDir 下的 Package 目录下。如果这个目录不存在则创建这个目录;
  • /p:UseWPP_CopyWebApplication=True:从 Visual Studio 2010 开始,我们可以使用 Web.config.\$(Configuration).config 文件对 Web.config 在不同的编译选项下进行修正。为了使用能够这个功能,需要设定此变量值为 True
  • /p:PipelineDependsOnBuild=False:如果将 UseWPP_CopyWebApplication 设置为 True,则必须将 PipelineDependsOnBuild 变量设置为 False 否则将导致 MSBuild 的 Targets 的循环引用。具体的技术细节请参见这里

这么长的一坨命令非常不容易维护,因此我们可以将这些命令放在一个 MSBuild 工程中。首先,我们建立一个 XML 文件,不妨命名为 Deploy.xml:

<?xml version="1.0" encoding="utf-8"?>
<Project
  xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
  ToolsVersion="12.0">
  <Target Name="Build">
    <MSBuild
      Projects="..\src\FromZero.App\FromZero.App.csproj"
      Targets="Rebuild;_WPPCopyWebApplication"
      Properties="WebProjectOutputDir=$(WebAppPublishDir);
                  UseWPP_CopyWebApplication=True;PipelineDependsOnBuild=False;"/>
  </Target>
</Project>

这样,我们只需要在 Compile-Project 函数中用 MSBuild 调用这个 Deploy.xml 文件,并将希望的包的输出目录赋值给 $(WebAppPublishDir) 变量即可:

$global_deployProject = "$global_buildDirPath\deploy.xml"
Function Compile-Project() {
    iex -Command "& '$global_msBuildPath' 
     /p:WebAppPublishDir='$global_buildDirPath\Package\' '$global_deployProject'"
}

到现在,Compile-Project 函数已经不止是在编译工程了,它还具备了打包的能力,因此我们将其重命名为 Deploy-Project

附:deploy.ps1 到目前为止的代码

$ErrorActionPreference = 'Stop'
# Environment helpers ------------------------------------
Function Get-MsBuildPath() {
    $msBuildRegPath = "HKLM:\SOFTWARE\Microsoft\MSBuild\ToolsVersions\12.0"
    $msBuildPathRegItem = Get-ItemProperty $msBuildRegPath -Name "MSBuildToolsPath"
    $msBuildPath = $msBuildPathRegItem.MsBuildToolsPath + "msbuild.exe"
    return $msBuildPath
}
# Environment variables ----------------------------------
$global_buildDirPath = Get-Location
$global_msBuildPath = Get-MsBuildPath
$global_solutionPath = "$global_buildDirPath\..\src"
$global_solutionFilePath = "$global_solutionPath\src.sln"
$global_nugetPath = "$global_buildDirPath\tools\nuget.exe"
$global_deployProject = "$global_buildDirPath\deploy.xml"
# Install nuget packages ---------------------------------
Function Install-SolutionPackages() {
    iex "$global_nugetPath restore $global_solutionFilePath"
}
$project_path = $global_solutionPath + '\FromZero.App\FromZero.App.csproj'
Function Deploy-Project() {
    iex -Command "& '$global_msBuildPath' 
    /p:WebAppPublishDir='$global_buildDirPath\Package\' '$global_deployProject'"
}
Install-SolutionPackages
Deploy-Project

1
0
分享到:
评论

相关推荐

    Asp.net+Msbuild自动打包部署程序源码

    `Asp.net`与`Msbuild`结合的自动打包部署程序源码提供了一种高效、便捷的方式,以实现Web应用的自动化构建和部署。接下来,我们将深入探讨这两个技术以及它们在自动部署中的作用。 `Asp.net`是由微软开发的一种用于...

    web聊天室(.net core MVC + signalr + EF + Authorize)

    这个项目中的"Powershell命令"可能包含了部署和管理应用程序的脚本,例如创建数据库、发布应用程序到IIS服务器等操作。PowerShell是一种命令行接口,提供了更强大的管理和自动化能力,特别是在处理系统任务和配置...

    udemy-aspnet-mvc5:ASP.NET MVC 5上的Udemy课程的练习:https:www.udemy.comcoursethe-complete-aspnet-mvc-5course

    在ASP.NET MVC 5开发中,PowerShell可以用来执行部署、配置和系统管理任务,提升开发效率。 总结来说,这个压缩包文件“udemy-aspnet-mvc5-master”可能包含的是从Udemy课程中获取的ASP.NET MVC 5项目源代码,通过...

    asp-net-mvc4-sso:示例 ASP.NET MVC4 应用程序,用于演示使用 WS-Federation 和 SAML2 的 SSO

    PowerShell,作为标签提到的技术,可能在这个项目中用于自动化配置或部署过程。PowerShell是一种强大的命令行接口和脚本语言,尤其适用于管理Microsoft Windows环境。开发者可能会使用PowerShell脚本来设置IIS...

    asp.net第三方插件

    7. **部署与自动化**:如Octopus Deploy和NuGet PowerShell命令,帮助开发者实现自动化部署,确保ASP.NET应用能够快速、稳定地发布到生产环境。 8. **移动支持**:对于移动友好的ASP.NET应用,第三方插件如Mobile ...

    [ASP.NET & IIS 7高级编程]一书光盘源码例子

    - **ASP.NET MVC**:一种基于模式的Web开发框架,用于创建可测试、可维护的Web应用。 - **ASP.NET Web API**:用于构建RESTful服务,支持HTTP协议,便于移动设备和Web应用的交互。 - **身份验证和授权**:实现用户...

    ASP.NET源码——[CMS程序]SharpCms 0.4.0.0.zip

    通过研究和分析SharpCms的源代码,开发者可以学习到ASP.NET MVC框架的实现方式,以及如何构建一个完整的CMS系统。这有助于提升对Web开发的理解,特别是对于那些想要深入学习.NET平台和Web应用架构的人来说,这是一个...

    115_asp.net试卷生成系统_题库管理系统_试题管理.rar

    7. 构建和部署脚本:用于自动化构建和发布应用程序的批处理或PowerShell脚本。 该系统的实现可能涉及以下技术点: 1. ASP.NET MVC 或 Web Forms:用于构建Web应用程序的框架。 2. C#:编程语言,驱动整个系统的逻辑...

    ASP.NET-[CMS程序]chx99个人主页源码.zip

    8. **部署脚本**:可能包含`.bat`或PowerShell脚本,用于自动化部署过程,将源码和数据库设置部署到服务器。 通过研究这个源码,学习者不仅可以了解ASP.NET的基本概念和编程技巧,还可以深入理解CMS系统的架构和...

    微软金牌讲师、微软最有价值专家讲解WinServer2008和asp.net,PPT文件

    - **Web Forms、MVC和Web Pages**:ASP.NET支持多种开发模式,包括传统的Web Forms,模型-视图-控制器(MVC)架构,以及轻量级的Web Pages,为不同需求的开发者提供了灵活的选择。 - **AJAX支持**:ASP.NET集成了...

    秦皇岛365信息网整站打包,模板大气,简洁明了[.Net+acc]

    4. .NET源代码:网站的后端程序,可能包括ASP.NET或ASP.NET MVC等项目文件,用于处理用户请求和数据库交互。 5. 数据库文件(可能为.accdb扩展名):ACC(Access)数据库文件,存储网站所需的数据,如用户信息、文章...

    Microsoft.NET.zip

    7. **ASP.NET**:是.NET Framework的一部分,用于开发Web应用程序,提供了多种模式(MVC、Web Forms、Web API等)来构建Web应用。 8. **.NET Core**:作为.NET Framework的现代替代品,.NET Core是跨平台的,支持...

    IISl模拟软件

    1. **MVC(Model-View-Controller)架构**:ASP.NET MVC模式鼓励分离关注点,让开发者能更清晰地组织代码,提高代码的可读性和可维护性。 2. **Web Forms**:ASP.NET Web Forms提供了一种事件驱动的编程模型,类似...

    C#项目开发案例全程实

    同时,学习如何构建和部署微服务,利用C#的ASP.NET Core框架,可以实现高可扩展性和灵活性的分布式系统。 案例六:数据处理与分析。C#结合LINQ(Language Integrated Query)提供了一种强大的数据查询方式。学习...

    windows 2012 安装 .net framwork3.5报错所需的源文件

    版本3.5是在2007年发布的,它基于.NET Framework 2.0、3.0,并添加了对ASP.NET MVC、LINQ、银光(WPF)等新特性的支持。 当在Windows Server 2012上安装.NET Framework 3.5时,系统通常会尝试从Windows安装映像(也...

    微软实例代码CodeFlex

    CodeFlex可能包含了不同版本的ASP.NET(如ASP.NET MVC、ASP.NET Core)的实例,涵盖了页面生命周期、控件事件处理、数据绑定、身份验证和授权等多个主题。 2. C#和VB.NET:这两种都是.NET Framework的主要编程语言...

    Lab6dotnet:TS .NET学科的学生Mendela Alexandru-Abel的实验室6

    3. **ASP.NET**:如果项目是Web应用,可能会涉及到ASP.NET,学习如何创建Web Forms、MVC或Web API应用,以及路由、身份验证和授权等。 4. **Entity Framework**:.NET中的主流ORM(对象关系映射)工具,用于简化...

    C#网站开发公司管理系统。

    ASP.NET提供了丰富的功能,如页面生命周期管理、状态管理、内置的安全机制以及自动化的部署工具,使得开发者可以更高效地构建动态网站。 2. **MVC模式** 在C#网站开发中,通常会采用Model-View-Controller(MVC)...

Global site tag (gtag.js) - Google Analytics