提问人:John Saunders 提问时间:1/11/2014 最后编辑:Sayed Ibrahim HashimiJohn Saunders 更新时间:8/21/2014 访问量:491
如何在 Web 服务器和映像服务器之间拆分 Web 应用程序的部署
How to split deployment of web application between web and image servers
问:
我有一个 ASP.NET 3.5 Web 应用程序项目。我想将大部分部署到我的 Web 服务器,但我想将 CSS、图像和 JavaScript 部署到第二个“图像服务器”。
如何使用 Web 部署,甚至是 Visual Studio 2010 及更高版本的“发布”功能来执行此操作?
有人问我尝试过什么。我什么都没试过,因为我不知道有什么可以尝试的。
我过去在 Web 部署方面做过一些认真的工作。我甚至使用 Web 部署来部署非 Web 应用程序,方法是手动将适当的目标添加到项目文件。我有MSBUILD的书(“Microsoft® Build Engine内部:使用MSBuild和Team Foundation Build”,由Sayed Ibrahim Hashimi和William Bartholomew撰写)和补充,并且知道如何做一些事情,例如将不在项目中的额外文件添加到MSDEPLOY包中,添加文件夹,设置访问保护等。
我不知道该怎么做是从单个项目制作两个包,然后将两个包部署到两个单独的服务器。
这里有两件事我可以尝试。在我(是的,专家)看来,两者都不值得花时间。我很乐意有人告诉我我错了哪里。
Visual Studio 中的发布配置文件不仅包括有关要发布哪些文件以及发布到哪个目标的信息;它还包括要生成和部署的解决方案配置。我可以
- 有两种解决方案配置:“Release”和“ReleaseImage”。“Images”项目不会在“Release”配置中生成,“normal”项目不会在“ReleaseImage”配置中生成。“普通”项目的发布配置文件将生成“发布”配置,映像的发布配置文件将生成“ReleaseImage”配置。我不必说让图像、CSS 和 JavaScript 与使用它的代码不在同一个项目中会有多痛苦。
- 与第一个类似,但将所有内容保留在一个项目中。这一次,使用两种配置,手动编辑 .csproj 文件,以在包含内容的元素上放置条件。实际上,单个项目将变成两个项目,具体取决于解决方案配置。我不必说明每次向项目添加新项时都必须手动编辑项目文件是多么不切实际。
ItemGroup
我想不出任何切实可行的方法来做我需要做的事情。我希望有人会知道一种我不知道的实用技术 - 也许是我不知道的 Web Deploy 3.5 的一些功能。
答:
这应该像创建两个不同的发布配置文件“PackageApplication”和“PackageContent”一样简单,这两个配置文件都是“Web 部署包”配置文件。
然后,只需为您不想要的东西定义项目即可。ExcludeFromPackageFiles
PackageApplication.pubxml
将如下所示:
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<WebPublishMethod>Package</WebPublishMethod>
<LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
<LastUsedPlatform>Any CPU</LastUsedPlatform>
<SiteUrlToLaunchAfterPublish />
<LaunchSiteAfterPublish>True</LaunchSiteAfterPublish>
<ExcludeApp_Data>False</ExcludeApp_Data>
<DesktopBuildPackageLocation>package\Application.zip</DesktopBuildPackageLocation>
<PackageAsSingleFile>true</PackageAsSingleFile>
<DeployIisAppPath />
<PublishDatabaseSettings>
<Objects xmlns="" />
</PublishDatabaseSettings>
</PropertyGroup>
<ItemGroup>
<ExcludeFromPackageFiles Include="**/*.js" />
<ExcludeFromPackageFiles Include="**/*.css" />
</ItemGroup>
</Project>
它看起来像这样:PackageContent.pubxml
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<WebPublishMethod>Package</WebPublishMethod>
<LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
<LastUsedPlatform>Any CPU</LastUsedPlatform>
<SiteUrlToLaunchAfterPublish />
<LaunchSiteAfterPublish>True</LaunchSiteAfterPublish>
<ExcludeApp_Data>False</ExcludeApp_Data>
<DesktopBuildPackageLocation>package\Content.zip</DesktopBuildPackageLocation>
<PackageAsSingleFile>true</PackageAsSingleFile>
<DeployIisAppPath />
<PublishDatabaseSettings>
<Objects xmlns="" />
</PublishDatabaseSettings>
</PropertyGroup>
<ItemGroup>
<ExcludeFromPackageFiles Include="**/*.dll;**/*.pdb" />
<ExcludeFromPackageFiles Include="**/*.cshtml" />
<ExcludeFromPackageFiles Include="**/*.aspx;**/*.asax" />
<ExcludeFromPackageFiles Include="**/*.config" />
</ItemGroup>
</Project>
现在,您将拥有一个 Application.zip 和一个 Content.zip(包含脚本),您可以将其部署到两个 Web 服务器。.deploy.cmd
警告我不完全确定 MSBuild 脚本是否足够智能,以便在配置文件之间切换时清除临时输出目录 (out\Debug\Package\PackageTmp),因此我建议包含在命令行中。/t:Clean;Build
评论
<ExcludeFromPackageFolders Include="CSS" />
评论