简单来说,部署就是 “构建(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 的文件类型也会在打包的时候被拷贝。
以我们的工程为例:
|
那么需要拷贝的文件为:
- .\bin 文件夹下的所有文件;
- 所有 Build Action 为 Content 属性的文件:Global.asax、packages.config、Web.config、Index.cshtml。
包的目录结构
在上一节我们介绍了,所有构建生成的程序集和 Build Action 为 Content 的文件都会在打包过程中进行拷贝。那么它们会拷贝到什么地方去呢?答案是拷贝到相应的目录下面去。以我们的工程为例,假设我们希望将构建好的工程拷贝到一个名为 Package 的目录下去,那么这个 Package 目录在打包完毕之后应该是这个样子的:
|
等一下,Controller 和 Properties 目录到哪里去了?由于这两个目录下面没有一个文件需要进行发布,因此这个目录也就不会创建。
假设你的确需要一个 Controller 目录进行发布,该怎么办呢?那么我们可以利用规则创建一个 0KB 的 placeholder 文件。并且将这个文件的 Build Action 属性设置为 Content。
至此我们已经可以总结出打包的规则了:
- 拷贝所有构建过程中生成的程序集文件,以及 Build Action 为 Content 的文件;
- 将所有需要拷贝的文件拷贝到一个和其所在的工程目录对应的目录下面,如果某一个目录下没有一个文件需要在打包中进行拷贝,则不生成这个目录。
打包-代码
我们是否需要自己解析工程的 XML 结构然后按照上述规则进行打包呢?幸运的是,完全不用:这是因为在 ASP.NET Web 工程中会引用 $(VSToolsPath)\Web\Microsoft.Web.Publishing.targets,其中定义的 _WPPCopyWebApplication 过程正是我们以上描述的过程。我们只需要在上一个例子的基础上修改 Compile-Project
函数:
|
其中:
-
$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:
|
这样,我们只需要在 Compile-Project
函数中用 MSBuild 调用这个 Deploy.xml 文件,并将希望的包的输出目录赋值给 $(WebAppPublishDir)
变量即可:
|
到现在,Compile-Project
函数已经不止是在编译工程了,它还具备了打包的能力,因此我们将其重命名为 Deploy-Project
。
附:deploy.ps1 到目前为止的代码
|
相关推荐
New edition of the top book on MVC from the top ASP.NET experts at Microsoft! MVC 3 is the latest update to Microsoft's Model-View-Controller technology, which enables developers to build dynamic, ...
New edition of the top book on MVC from the top ASP.NET experts at Microsoft! MVC 3 is the latest update to Microsoft's Model-View-Controller technology, which enables developers to build dynamic, ...
Scaffold asp.net mvc中文教程可实现。按着做肯定能完成,是VS2010版本哦。如果出现错误,可按照错误提示安装POWERSHELL2.0,NUGET1.5
asp.net MVC 4在winxp sp3上的安装步骤: 1、运行WindowsXP-KB968930-x86-CHS.exe安装powershell 2.0 2、运行AspNetMVC4Setup.exe 3、运行AspNetMVC4Setup_CHS.exe ...
展开展开是基于.net的Web应用程序的完整部署解决方案。 它使您能够轻松创建和自定义部署方案,而不必诉诸难以自动化的复杂工具。展开展开是针对基于.net的Web应用程序的完整部署解决方案。 它使您能够轻松创建和...
本项目是基于Asp.net/MVC/WebApi开发的Open.Chat即时在线聊天系统设计源码,主要使用C#进行开发。项目共包含224个文件,其中DLL动态链接库文件78个,XML配置文件54个,NUPKG打包文件31个,JavaScript源代码文件21个...
ASP.NET MVC DropDownList Samples ASP.NET MVC DropDownList 范例 介绍ASP.NET MVC 内建的Html Helper - DropDownList。 包含之前部落格文章里曾经介绍过的一些有关DropdownList 的内容, 不过如果已经有在GitHub ...
ASP.NET MVC 资料分页- 使用PagedList.Mvc [ASP.NET MVC 资料分页- 使用PagedList.Mvc] 程式范例 部落格文章连结: 开发环境:Visual Studio 2013 Update3, LocalDB 使用版本:ASP.NET MVC 5, ADO.NET Entity ...
该网站是ASP.NET网站管理工具的替代品。 下载源代码,然后开始从Visual Studio调试Web应用程序。 该站点将在〜/ Home / Index页面上请求到您的ASP.NET MVC 4简单成员资格提供程序数据存储区的连接字符串。 当前功能...
ASP.NET MVC4 .NET 4.5 - 带有 WS-Federation 和 SAML2 的 SSO 我目前正在研究这些样本,很快就会提供指南。 谢谢!
Raspberry Pi上的ASP.NET MVC Web应用程序 步骤1:在发布前更改此行文件:js / SystemPerformance.js var host ='ws:// minwinpc:8080 / api / resourcemanager / systemperf'; //将minwinpc更改为您的树莓派名称...
从印度小哥那里受到启发,PowerShell不止可以做批处理,自动化。还能做界面做GUI,也能实现很好的交互。因为PowerShell是可以和.Net 程序无缝集成的。所以.Net能用的东西在PowerShell里也几乎都能使用。那么如果想让...
代码注释详细,内附需要用到的powershell命令
使用 Entity Framework Code First 在 ASP.NET MVC4 中开发的 CRUD 应用程序。 使用实体框架 5 的多层 MVC4 项目。 首先使用代码在我们的数据库中创建多对多表结构 将子集合添加到我们的对象中,让用户拥有多个...
StackOverFlowAttributeRouting 使用 ASP.NET MVC 5 属性路由的类似 stackoverflow.com 的属性路由 对于以下博客文章。
Windows PowerShell 4.0 for .NET Developers 英文无水印pdf pdf所有页面使用FoxitReader和PDF-XChangeViewer测试都可以打开 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权...
此扩展使您可以更轻松地使用新的ASP.NET Core工具进行构建。 此扩展包括以下任务: DNX任务构建Web软件包 DNX任务发布Web软件包 DNX Tasks Build Nuget软件包 DNX任务Azure SlotSwap DNX任务清除NuGet缓存 DNX...
If you are a .NET developer who wants to learn how to use Windows PowerShell then this book is what you are looking for. This book takes you from the basics to a professional level in PowerShell ...
但是每种方式都有不同的适用范围,本资源是作者在平时实际工作过程中总结的适用于React前端项目的自动部署脚本。可以使用该脚步轻松的一键部署React项目到Azure的App Service上。 并且整合了一些小功能在上面方便...
PowerShell可以和.Net无缝集成,而现在大多数电脑都有.Net和Powershell 所以通过调用.Net提供的 System.Windows.Forms 以及 System.Drawing.Graphics 等程序集实现屏幕检测,像素判断 可以实现判断白屏。再通过...