利用Powershell自动部署asp.net mvc网站项目 (一)
这一篇中我们会写一些关于自动化部署的代码。我们会使用 Powershell 书写这类代码。
你将发现这篇文章中涉及的东西非常具体,有的要求甚至相当苛刻且可能不具有通用性。这是因为部署从来都是跟环境打交道,部署过程中协作的组建太多,相互之间的交集不可能太大。可能唯一能够通用的是自动化部署的基本原则(只是这篇文章的基本原则):
- 每一次自动化部署结束之后,应用程序都会有相同的初始状态。
- 自动化部署的机器非常干净,只有相应的 Windows Server 系统和 .NET Framework。尤其是,不会有 Visual Studio。
我们需要公开一些基本的环境信息:
- 64-bit Windows Server 2008/2012/2012 R2或者 64-bit Windows 7/8/8.1
- 我们的工程是使用 Microsoft Visual Studio 2013 开发的;
- .NET Framework 版本为 4.5
- ASP.NET MVC 的版本为 5.0.0
- Microsoft Build Tool 的版本为 12.0
关于 MSBuild 这里需要多说几句。在 Visual Studio 2013 发布之前,MSBuild 是随 .NET Framework 一起发布的。这意味着我们可以不用安装 Visual Studio 就可以构建 .NET 应用程序。
这是多么美好的世界啊!因此,上一句话是假的。尤其是当你构建 ASP.NET Web 应用程序的时候,你马上就会遇到 “Cannot found … WebApplication.target” 的错误。如果你 StackOverflow 一下就可以知道,我们需要做的是安装 Visual Studio 或者从另外一台安装了 Visual Studio 的机器上将相关的文件拷贝出来。这真是——丢人的设计!Linux 的拥趸又有了发泄的空间。
于是微软决定正视这个问题。从 Visual Studio 2013 开始,MSBuild 将与 Visual Studio 而不是.NET Framework 一起发布。这引来了一片骂声。我不得不说,大家在生活中不论遇到什么事情都要保持足够的冷静,往往先发脾气的得不到任何的好处。事实是,由于 .NET Framework 发布的周期是相对较长的,因此微软目前越来越倾向于使用 NuGet 进行类库的发布,这样有助于削减 .NET Framework 基础类库的大小,并缩短基础类库的发布周期。相应的 MSBuild 和 Visual Studio 的发布周期也希望进行独立的变化。MSBuild 将和 Visual Studio 保持发布周期的一致性,并不意味这 MSBuild 依赖于 Visual Studio。因此我们当然可以下载 MSBuild 的独立安装包 Microsoft Build Tools,并在一台没有 Visual Studio 的服务器上进行自动化构建。
再次强调,如果幸运,你可以直接运行这篇文章中的例子。但是你不要指望将这篇文章的脚本拷贝到你的工程就可以正常工作。因为部署是一个因地制宜的任务,需要具体分析。你可能会遇到各种各样的环境问题,但是我认为最重要的还是思路。
部署是什么
简单来说,部署就是 “构建(Build)” –> “拷贝” –> “配置”。那么我们就开始一个一个解决它。这一篇将着眼于构建。
编译和构建应用程序 – 思路
如何构建应用程序呢?答案是先把需要的东西都拷贝过来,然后再用工具构建。好极了,我们需要拷贝什么东西呢?当然是先把源代码拷贝过来。
|
光源代码还不行,因为我们的程序依赖于第三方库(箭头代表依赖关系)。
|
例如,对于我们构建的那个简简单单的 ASP.NET MVC 5 的应用程序,我们就需要在构建之前下载它依赖的类库:
- Microsoft.AspNet.Mvc 5.0.0
- Microsoft.AspNet.Razor 3.0.0
- Microsoft.AspNet.WebPages 3.0.0
- Microsoft.Web.Infrastructure 1.0.0.0
源代码和依赖库都拷贝完了,那么接下来我们就需要将构建工具也拷贝过来:
|
对于我们来说,构建的工具只有一个:
- MSBuild
如今工具,源代码一应俱全,我们可以开始编译了。
安装 MSBuild
如果你做实验的机器上安装了 Visual Studio 2013——Express 版本的也是可以的——那么你可以跳过这一步,否则请下载 Microsoft Build Tools 并安装。
下载应用程序的代码
我们的代码是现成的,只需要从 git repository clone 下来就可以了。你也可以从这个地址 clone 到一个范例代码,并转换到相应的 commit。
|
好了,完成了,到目前为止一切都是那么的轻松愉快。
下载应用的依赖库
我们将使用 nuget 管理包的依赖。因此我们首先要下载 NuGet 的命令行客户端,可以从这里下载。
接下来的行为都需要明确的目录结构。为了便于说明,我们将建立如下的目录结构。
|
其中,src 目录存放 Solution 的源代码,而 build 目录存放自动化构建所需的各种工具和脚本。其中自动化构建需要的工具将放在 build/tools 目录下。因此我们也会将 nuget.exe 放在这个目录下。
接下来我们在 build 目录下建立 deploy.ps1 脚本,我们将在这个脚本中完成接下来的任务。我们先来下载依赖的包。NuGet 的包管理是通过 package.config 文件进行的。需要指出的是 package.config也具有一定的层次关系。首先 Solution 级别的包信息存储在两个地方:
- 第一个是 Solution 目录下的 .nuget/package.config 文件,这个文件中存储的是非特定项目使用的包(如果并没有这种类型的包,则该目录不存在,或者该目录下没有任何文件);
- 第二个是 Solution 目录下的 packages/repositories.config 文件,这个文件存储了该解决方案下的每一个工程的 packages.config 文件的路径。
而 Solution 下的每一个 Project 的包定义存储在 Project 目录下的 package.config 中。
为了下载这些依赖的包是否需要人为遍历这些 config 文件呢?原来是,而从 nuget 2.7 开始,可以直接支持 Solution 范围内的包下载,于是额我们就可以使用如下的简单函数完成包的下载了。
|
其中,$global_nugetPath
是 nuget.exe 的路径,而 $global_solutionFilePath
是工程文件(在这里是 FromZero.App.csproj)的路径。
接下来需要确定的是构建工具的位置,我们可以使用注册表查找 MSBuild 的位置的,由于我们使用了 2013 版本的 MSBuild(Toolset 的版本号为 12.0),因此我们的查找脚本为:
|
上述两步完成之后,就可以编译我们的工程了:
|
你迫不及待的试验了你的代码,但是却发现出了问题,MSBuild 报告无法找到Microsoft.WebApplication.targets 文件。这是怎么回事,我们已经明明在 MSBuild 中安装了Microsoft.WebApplication.targets 了啊?这是因为为了保持和 Microsoft Visual Studio 2010 SP1 的工程的兼容性,Visual Studio 2012/2013 的工程默认将 $(VisualStudioVersion)
环境变量设置为 10.0
。这样,target 文件的查询路径就成了:
|
而不是:
|
因此我们需要修正这个环境变量。请使用文本编辑器打开 FromZero.App.csproj 文件,找到如下的定义:
|
将其中的 VisualStudioVersion
节替换为:
|
再次运行:祝贺你,你已经能够成功的下载所有的依赖,并完成工程的编译了!在本文的结束,附上 deploy.ps1 到目前为止的所有代码:
|
利用Powershell自动部署asp.net mvc网站项目 (一)相关推荐
- 阿里云 Windows Server 2012 r2 部署asp.net mvc网站 平坑之旅
做了多年的Web开发工作,网站部署也不在话下,可每次部署却并不是十分顺利,将本次在阿里云服务器上部署asp.net mvc网站遇到的问题记录如下. 平台是阿里云ECS,操作系统是 Windows Se ...
- 图文详解远程部署ASP.NET MVC 5项目
图文详解远程部署ASP.NET MVC 5项目 原文:图文详解远程部署ASP.NET MVC 5项目 话外篇: 由于感觉自己的机器比较慢,配置不好,所以最近想把之前的项目部署到实验室的服务器上,但是由 ...
- 总结一下ASP.NET MVC 网站的部署问题
近日,准备把MVC建了一个新的测试站点部署到IIS上面,结果没想到出现了一系列的问题和错误,准备记录一下. 第一个问题,就是如何将MVC的站点部署到IIS上去? 现在我的系统是Windows 7,II ...
- 在没有安装有mvc3的主机上部署asp.net mvc3网站,需要包含的DLL文件
1.在没有安装有mvc3的主机上部署asp.net mvc3网站,需要包含的DLL文件. microsoft.web.infrastructure.dll system.web.helpers.dll ...
- 一起谈.NET技术,在Mono 2.8上部署ASP.NET MVC 2
我们知道Mono 2.8对ASP.NET MVC 2的完全支持,下面我们就来测试下在Mono 2.8上部署ASP.NET MVC 2应用程序.我的环境是Opensuse 11.3,通过以下命令部署好M ...
- 使用Visual Studio 2015 开发ASP.NET MVC 5 项目部署到Mono/Jexus
最新的Mono 4.4已经支持运行asp.net mvc5项目,有的同学听了这句话就兴高采烈的拿起Visual Studio 2015创建了一个mvc 5的项目,然后部署到Mono上,浏览下发现一堆错 ...
- 监测ASP.NET MVC 网站
使用MiniProfiler调试ASP.NET MVC网站性能,MiniProfiler可以很好的处理网站后端每个处理时间的事件,但是MiniProfiler是无法远程做监测的动作,MiniProfi ...
- 在Mono 2.8上部署ASP.NET MVC 2
Mono 2.8发布:C#4.0和更好的性能,我们知道Mono 2.8对ASP.NET MVC 2的完全支持,下面我们就来测试下在Mono 2.8上部署ASP.NET MVC 2应用程序.我的环境是O ...
- 使用Glimpse 监测ASP.NET MVC网站
使用MiniProfiler调试ASP.NET MVC网站性能,MiniProfiler可以很好的处理网站后端每个处理时间的事件,但是MiniProfiler是无法远程做监测的动作,MiniProfi ...
最新文章
- Vue导入非模块化的第三方插件功能无效解决方案
- CSS的常用属性(二)
- 互联网晚报 | 3月1日 星期二 |​ 2022年苹果可能推出三款Apple Watch;“国家中小学智慧教育平台”投入试运行...
- C语言实现简单计算器(可以处理小括号)
- [转载]VHDL的testbench的编写
- html5新增标签/删除标签
- 7 Web前端性能优化
- canvas贝塞尔曲线爱心_贝塞尔曲线之爱心点赞代码全解析!| CSDN 博文精选
- 在Win10与Ubuntu双系统中删除Ubuntu
- python批量生成姓名_Python 批量生成中文姓名(百家姓)
- 面试最后问你期望薪酬_我不能问你的薪水历史吗? 谢谢!
- task7a-10个细胞系仅1个表达你的基因
- 弄清楚这个三角关系,工作效率提高50%
- 中国大数据分析行业研究报告
- 上海高考物理能不能用计算机,上海高考再放大招!选物理再也不会吃亏了
- 有关圆排列问题——m个相同的元素和n个不同的元素的圆排列解法。
- hmc830相位噪声_低相位噪声电压控制振荡器(VCO)和稳定基准电压构成的频率合成器...
- 经验总结6—数据发散
- mysql8.018_MySQL8.0.18通用版本安装
- 内核启动错误:use vmalloc=size to increase size.