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

news/2024/4/27 16:13:44/文章来源:https://blog.csdn.net/changandaxue/article/details/84531063

简单来说,部署就是 “构建(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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_871092.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

纯css 网站导航

这两天重新把前端的只是梳理了下&#xff0c;按照简约的设计理念做了几套样例&#xff0c;记录下&#xff0c;方便自己方便他人。先上结果图&#xff0c;一个很简单的网站导航&#xff0c;没有图片&#xff0c;没有JS 为了方便查看&#xff0c;css样式没有分开&#xff0c;下面…

网站开发技巧参考大全

事件源对象 event.srcElement.tagName event.srcElement.type 捕获释放 event.srcElement.setCapture(); event.srcElement.releaseCapture(); 事件按键 event.keyCode event.shiftKey event.altKey event.ctrlKey 事件返回值 event.returnValue 鼠标位置 event.x …

java在线电影网站

Java在线电影网站 项目简介 这次分享一个电影网站&#xff0c;基于JspServletC3p0mysql&#xff0c;难度适中。网站内视频均是跳转到相应的平台播放&#xff08;如腾讯视频、爱奇艺、优酷等&#xff09;&#xff0c;后台管理员可观察在线人数&#xff0c;并添加新的视频&…

导致SEO策略失败的12个原因及改进方法

这里有一个新闻快报给你:你的SEO策略失败不是因为搜索引擎为难你&#xff0c;或者因为你遭受了一些神秘的惩罚。 虽然很容易把你的网站在有机搜索引擎优化中的失败解释为你无法控制的因素造成的&#xff0c;但现实是有很多更平凡的原因导致SEO活动失败。 看看下面的列表&…

微信公众号对接电影网站,回复名称推送电影

电影站对接微信公众号简单方便&#xff0c;输入电影名称即可观看&#xff0c;非常方便 第一步&#xff0c;微信公众号后台点击基本配置 第二步&#xff0c;点击启用&#xff0c;然后输入下图中的内容&#xff0c;保存不上请多试几次 微信公众号后台–基本配置–启用–输入即可…

python爬取哔哩哔哩网站数据以及弹幕

首先要爬取哔哩哔哩网站的数据 , 第一步就是要分析网页,找到网上ajax异步加载的数据 即json文件,找到后还要对其爬去,这里我选正则表达式爬去网页,其次是 对爬取的数据进行清洗,防止脏数据对生成的词云造成影响,将清洗完的的数据存入MongoDB数据库中最后是 利用woldcould这个库…

xpath爬取好大学网站数据

xpath爬好大学网站 from lxml import etree import pymongo from config import * import requests# 连接mongoDB数据库 client pymongo.MongoClient(MONGO_URL,connectFalse) db client[MONGO_DB]def get_page(year):url "http://www.zuihaodaxue.cn/zuihaodaxuepaim…

基于Spark统计购物网站标签

文章目录 1、项目描述2、数据描述3、代码实现 1、项目描述 目前&#xff0c;越来越多的商家驻扎于购物网站中&#xff0c;每天都有大量的用户在不同的商家购物&#xff0c;然后进行评价&#xff0c;如图1&#xff0c;图2&#xff0c;图3所示。评论越多&#xff0c;说明该商品越…

python爬虫之爬取网站小说

继上次的使用类的方法爬取的单页单章小说后&#xff0c;在准备爬取整部小说&#xff0c;遇到点困难&#xff0c;先用函数式编程试试结果。 代码如下&#xff1a; 函数式编程 17K小说网爬取龙井迷案小说 # 导入第三方库 import requests from lxml import etree import time fro…

养眼神器,爬取美女网站个人的写真套图

很久之前写的爬虫&#xff0c;一直没有放出来&#xff0c;这次放出来&#xff0c;单线程爬取&#xff0c;又有延时&#xff0c;所以有点慢。不过这也不耽误爬取了一个人的2万多张写真套图&#xff0c;因为这个人的很好看&#xff0c;哈哈哈。。。不过后来又全都删了&#xff0c…

NET开发人员必知的几个网站

当前全球有数百万的开发人员在使用微软的.NET技术。如果你是其中之一&#xff0c;或者想要成为其中之一的话&#xff0c;我下面将要列出的每一个站点都应该是你的最爱&#xff0c;都应该收藏到书签中去。 对于不熟悉.NET技术的朋友&#xff0c;需要说明一下&#xff0c;.NET提…

局域网ip部署web网站

局域网ip的设备如何做部署web网站 今天&#xff0c;在家部署web网站&#xff0c;因为用的家用路由器&#xff0c;自身电脑ip是局域网ip&#xff08;192.168.1.107&#xff09;&#xff0c;因此无法通过ip&#xff1a;端口号访问&#xff0c;那怎么办呢&#xff1f; 度娘发现&a…

windows server 2008 Asp.net 网站环境配置

1.建立用户www,隶属于: 2.IIS建立网站&#xff0c;应用程序池设置为&#xff1a; 3.网站&#xff0c;高级设置中“物理路径凭证”&#xff0c;需要输入用户www&#xff1a; 4.网站根目录设置用户www只读&#xff08;左一&#xff09;&#xff0c;对于需要写入的文件夹&#xff…

针对DLL的网站授权License破解方法

有很多Asp.Net制作的网站&#xff0c;每年都需要授权。如果破解授权呢。本文将一步步的操作。 以下内容只是作者兴趣所致&#xff0c;不代表任何立场。 一般而言&#xff0c;License文件是一个加密文件&#xff0c;通过bin下面的DLL组件进行判断。我们可以对DLL进行改造。 1. …

快速免费搭建属于自己的网站

快速免费搭建属于自己的网站 本网文由忆云竹业务 编辑发布 很多人想拥有一个简单的个人网站&#xff0c;但是域名、主机空间以及程序代码却是不会。现在带给大家简单快速拥有个人网站 网站展示 个人网页 大量个人网页模板&#xff0c;炫酷、简约、个性等等 表白网页 浪漫、…

百度中指定某个网站来搜索

法&#xff1a;在搜索引擎的框框里输入 " site:wenku.baidu.com题目" 或者 "site:wenku.baidu.com 题目"。 解释&#xff1a;【site命令是指在制定的网站里搜索&#xff0c;加号也是要的&#xff0c;如果嫌输入加号麻烦&#xff0c;可以用空格代替。】 …

jQuery Mobile 移动网站开发之日期控件Mobiscroll 2.5 使用说明

福利&#xff1a;阿里云服务器-全场景 首次购买ECS享实例首台5折&#xff0c;限时领取红包 在用jQuery Mobile 做手机网站、需要用日期控件 找了3个 分别展示下&#xff1a; 1.可以说是html5自己的 <label for"date-1"> 购买时间* </label> <…

宝塔面板网站运行php文件的时候提示404错误

其实报这个错误原因大部分在php的原因。 解决办法1&#xff1a; 开启php的错误提示 修改配置文件 将display_errors Off 修改成display_errors On 修改完之后重启php即可 注&#xff1a;7月份以前安装过宝塔php的默认是关闭错误提示的&#xff0c;7月份后安装的默认开启 如…

利用XSS注入漏洞能对网站做什么

或许大家经常看一些高手测试XSS漏洞都是alert一个窗口来。便以为XSS即是如此&#xff0c;当自己alert出窗口来&#xff0c;便说自己发现了漏洞。 其实远没这么简单。你发现的只是程序员的一个小bug而已&#xff0c;远谈不上XSS。它们的关系如同系统漏洞与漏洞利用的关系&…

从零带你用VuePress来搭建个人网站

VuePress可以让你非常方便的在Markdown文档中编写Vue代码&#xff0c;VuePress会为每个页面预渲染生成静态的HTML,同时&#xff0c;每个页面被加载的时候&#xff0c;将作为SPA运行 这里我将带大家一步步用VuePress来搭建个人网站 环境搭建 查看node的版本号 node -vnode.…