65.9K
CodeProject 正在变化。 阅读更多。
Home

VS 2010 部署 (打包、一键部署和 Web.config 转换)

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.91/5 (23投票s)

2010年8月23日

CPOL

9分钟阅读

viewsIcon

90050

VS 2010 部署 (打包、一键部署和 Web.config 转换)

VS 2010 部署 (打包、一键部署和 Web.config 转换)

引言和目标
部署问题
打包和 “MSDeploy”
创建包
部署包
一键部署
Web.config 转换
定位和转换
定位器和转换的更多细节

引言和目标
 

在本文中,我们将讨论 VS 2010 提供的 3 项重要功能,以简化我们在生产和其他环境中的部署任务。我们将首先了解部署方面的问题,然后继续创建打包、一键部署和 web.config 转换。

部署问题
 

当我们谈论部署时,它不仅仅是编译和将 DLL 传输到生产服务器。它涉及许多其他方面,如 IIS 设置、SQL 脚本、文本文件、配置等。
 

 

作为开发人员,您可能希望将一个包含所有依赖项的包交给管理员进行安装,或者您希望直接从 Visual Studio IDE 中安装它。
 

打包和 “MSDeploy”
 

包就是一个 ZIP 文件,其中包含您的应用程序所需的所有必要组件(DLL、SQL 脚本、配置文件、IIS 设置等)。

创建包
 

要创建包,请单击项目 – 属性选项卡,您会找到两个选项卡“package/publish web”(打包/发布 Web)和“package / publish SQL”(打包/发布 SQL)。第一个选项卡包含所有 IIS 和通用设置,而 SQL 选项卡用于在生产环境中部署 SQL 脚本。
 

“Package/Publish Web”(打包/发布 Web)选项卡包含一些关键项,您可以从 IIS 的角度定义这些项以及哪些内容应包含在包中。下图描述了一些重要的关键功能。

“Package/Publish SQL”(打包/发布 SQL)选项卡帮助您配置所有与 SQL Server 相关的内容。第一点是您可以导入“web.config”文件,然后 web.config 的所有连接字符串都将用于生成 SQL 脚本。

 

您还可以指定包的 SQL Server 的源和目标。源目标会从“Web.config”自动导入,但您可以根据需要随时进行更改。

“Package/Publish SQL”(打包/发布 SQL)选项卡还有三个要点:
• 您可以看到自动生成的架构,换句话说,架构是从指定的源 SQL Server 自动生成的。
• 如果您想手动添加一些脚本,例如插入模拟数据等,您可以随时使用如图所示的“add script”(添加脚本)选项卡。
• 我个人喜欢的是最后一个功能,您可以控制脚本的运行顺序。例如,在下图所示的情况下,首先运行自动生成的架构 SQL,然后执行“indexes.sql”脚本。这是一个很好的功能,可以从版本控制的角度进行利用。

要创建包,请单击“build deployment package”(生成部署包)菜单,您应该会在项目的包文件夹中看到必要的包文件。
 

部署包
 

好的,现在包已生成,让我们了解如何安装它。要安装包,我们需要 Microsoft Web Deploy 软件。Microsoft Web Deploy,又名“msdeploy”,由 Microsoft IIS 团队创建,用于从 IIS 6 迁移到 IIS 7。

为了充分利用其功能,它被用作安装 VS 2010 创建的包的骨干。
 

如果您还记得,在第一步中创建的包文件夹包含一些 XML 文件。有三个文件非常重要:一个是源清单,一个是目标清单,还有一个是 cmd 文件。清单文件由 MS Deploy 读取以获取元数据和部署配置,然后所有这些都通过 cmd 文件执行。

您首先应该做的是检查包是否正确,并且它是否能在环境中正常执行。要进行试安装,您需要转到“Microsoft Web Deploy”命令并使用“/t”执行 cmd 文件。这实际上并不会安装,但会简要检查实际安装过程中是否存在任何问题。
 

C:\Program Files\IIS\Microsoft Web Deploy>E:\deleteit\MyWebApplicationToPackage\
MyWebApplicationToPackage\obj\Debug\Package\MyWebApplicationToPackage.deploy.cmd
/t

 

执行 cmd 文件后,您应该会看到将在生产服务器上进行的更改摘要,如下图所示。

 

在进行交叉检查后,您可以使用“/y”属性部署包,如下面的代码片段所示。如果您使用“y”命令运行您的包,它应该会创建 IIS 应用程序并执行必要的数据库脚本来创建 SQL Server 对象。
 

C:\Program Files\IIS\Microsoft Web Deploy>E:\deleteit\MyWebApplicationToPackage\
MyWebApplicationToPackage\obj\Debug\Package\MyWebApplicationToPackage.deploy.cmd
/y

 

一键部署
 

很多时候,您希望直接从 VS IDE 安装包,而不是交给管理员进行安装。为了实现这一点,VS 2010 IDE 提供了“一键部署”。
 

 

顾名思义,您可以通过单击“Build”(生成)然后“Publish”(发布)菜单,以不同的模式一键部署您的包。下图是“one deploy publish”(一键发布)的屏幕截图。
您可以发布到 FTP、Web Deploy、文件系统等。
 

Web.config 转换
 

最后值得讨论的功能是“Web.config”转换。很多时候,您为不同的环境准备了不同的配置文件。在处理不同版本的 web.config 文件时,这会导致很多混淆。
 

因此,转到 Tools(工具)– Configuration Manager(配置管理器)并添加一个新配置文件,如下图所示。您可以看到它创建了一个父“Web.config”文件,该文件可以通过具有自己设置的子配置文件覆盖。

要查看您新添加的配置,需要右键单击 web.config 文件并选择“add config transforms”(添加配置转换),如下图所示。

根据您选择的活动配置,将为该环境创建相应的“Web.config”文件。

 

定位和转换
 

您可能会想到的一个问题是如何在子 web 配置文件中进行转换。换句话说,您的父 web.config 文件有一个连接字符串,如何在像 production、acceptance、test 等子配置文件中覆盖/转换它?

配置文件转换是一个两步过程:首先是搜索/定位需要转换的内容,第二步是进行实际的转换。
 

 

有 3 种机制可以通过 Match(匹配)、Condition(条件)和 XPath 来搜索/定位特定的属性/元素。有八种方法可以设置/替换/转换搜索到的属性或元素,如下图所示。

让我们举一个搜索和转换如何工作的例子。下面是父“web.config”文件和包含“web.production.config”文件的子文件的图像代码片段。

我们想为生产环境更改连接字符串的值。您可以看到下面的代码片段,生产环境的配置文件使用了“xdt:locator”按“name”(名称)进行搜索,然后我们想将该属性设置为不同的值,因此我们使用了“setattribute”转换。
 

 

定位器和转换的更多细节
 

让我们简要看一下 3 种定位器和 8 种转换。

以下所有内容均摘自 http://vishaljoshi.blogspot.com/2009/03/web-deployment-webconfig-transformation_23.html
 

xdt:Locators
 

下面将讨论内置的 xdt:Locators。
 

Match
 

在提供的语法示例中,只有当源 web.config 中的连接字符串列表中名称 Northwind 匹配时,才会发生 Replace(替换)转换。请注意,Match Locator 可以接受多个 attributeNames 作为参数,例如 Match(name, providerName)]
 

<connectionStrings> 
<add name="Northwind" connectionString="connectionString goes here" 
providerName="System.Data.SqlClient" 
xdt:Transform="Replace" xdt:Locator="Match(name)" /> 
</connectionStrings> 

条件
 

Condition Locator 将创建一个 XPath 谓词,该谓词将被附加到当前元素的 XPath。下面示例生成的 XPath 为“/configuration/connectionStrings/add[@name='Northwind or @providerName=’ System.Data.SqlClient’ ]”
然后使用此 XPath 在源 web.config 文件中搜索正确的节点。
 

<connectionStrings> 
<add name="Northwind" connectionString="connectionString goes here" 
providerName="System.Data.SqlClient" xdt:Transform="Replace" 
xdt:Locator="Condition(@name=’Northwind or @providerName=’ 
System.Data.SqlClient’)" /> 
</connectionStrings> 

 

Xpath
 

此 Locator 支持复杂的 XPath 表达式来识别源 web.config 节点。在语法示例中,我们可以看到提供的 XPath 允许用户替换 system.web 部分,无论它在 web.config 中的哪个位置(即,将删除任何 location 标签下的所有 system.web 部分)。
 

<location path="c:\MySite\Admin" >
<system.web xdt:Transform="RemoveAll" xdt:Locator="XPath(//system.web)">
...
</system.web>
</location>
 

 

xdt:Transform
 

替换
完全替换目标 web.config(例如,staging 环境的 web.config 文件)中的第一个匹配元素及其所有子元素。请注意,转换不会修改您的源 web.config 文件。
 

<assemblies xdt:Transform="Replace"> 
<add assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" /> 
</assemblies> 

 

移除
删除第一个匹配的元素及其所有子元素。
 

<assemblies xdt:Transform="Remove"></assemblies> 

 

RemoveAll

删除目标 web.config(例如,staging 环境的 web.config 文件)中所有匹配的元素。
 

<connectionStrings> 
<add xdt:Transform="RemoveAll"/> 
</connectionStrings> 

 

Insert
将 web.staging.config 中定义的元素插入到目标 web.config(例如,staging 环境的 web.config 文件)中所有同级元素的末尾。
 

<authorization> 
<deny users="*" xdt:Transform="Insert"/> 
</authorization> 

SetAttributes
 

将 web.staging.config 中指定属性的值,并设置为目标 web.config 中匹配元素的属性。此转换接受一个逗号分隔的属性列表,这些属性需要被设置。如果未为 SetAttributes 转换提供任何属性,则它假定您希望设置 web.staging.config 中相应节点上的所有属性。
 

<compilation batch="false" 
xdt:Transform="SetAttributes(batch)"> 
</compilation> 

 

RemoveAttributes
 

从目标 web.config(即 staging 环境的 web.config 文件)中删除指定的属性。语法示例显示了如何删除多个属性。
 

<compilation 
xdt:Transform="RemoveAttributes(debug,batch)"> 
</compilation> 

InsertAfter (XPath)

将 web.staging.config 中定义的元素精确地插入到传递给“InsertAfter()”转换的指定 XPath 定义的元素之后。在语法示例中,元素 <deny users="Vishal" /> 将精确地插入到目标 XML 中元素 <allow roles="Admins" /> 之后。
 

<authorization> 
<deny users="Vishal" xdt:Transform="InsertAfter(/configuration/system.web/authorization/allow[@roles='Admins'])” /> 
</authorization> 

InsertBefore (XPath)
将 web.staging.config 中定义的元素精确地插入到传递给“InsertBefore()”转换的指定 XPath 定义的元素之前。在语法示例中,元素 <allow roles="Admins" /> 将精确地插入到目标 XML 中元素 <deny users="*" /> 之前。
 

<authorization> 
<allow roles=" Admins" xdt:Transform="InsertBefore(/configuration/system.web/authorization/ deny[@users='*'])" /> 
</authorization> 

如需进一步阅读,请观看以下面试准备视频和分步视频系列。

© . All rights reserved.