如何获得 TFS 构建以使用保存的发布配置文件预编译 Web 应用程序?

Posted

技术标签:

【中文标题】如何获得 TFS 构建以使用保存的发布配置文件预编译 Web 应用程序?【英文标题】:How do I get a TFS build to precompile a web application using a saved publish profile? 【发布时间】:2014-11-22 04:21:20 【问题描述】:

我目前正在运行 CI 构建和部署,使用 TFS 2013 进行构建,并使用 Release Management 2013 进行部署,但我需要对我正在部署的 Web 应用程序 (WebForms) 进行预编译。我希望在将输出复制到放置位置之前使用发布配置文件来驱动预编译,但我还没有找到任何能够做到这一点的东西。

找到 How do I configure MSBuild to use a saved publishProfile for WebDeploy? 后,我在我的 Web 应用程序中设置了一个发布配置文件,如果我使用 msbuild.exe 使用 VS2013 的开发人员命令提示符,我将预编译 Web 应用程序

msbuild.exe WebSite.csproj /p:DeployOnBuild=true /p:PublishProfile=TfsPrecompile

在https://***.com/a/13267694/595473 的帮助下发布名为 TfsPrecompile 的配置文件

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <WebPublishMethod>FileSystem</WebPublishMethod>
        <LastUsedBuildConfiguration>Debug</LastUsedBuildConfiguration>
        <LastUsedPlatform>Any CPU</LastUsedPlatform>
        <SiteUrlToLaunchAfterPublish />
        <ExcludeApp_Data>False</ExcludeApp_Data>
        <PublishUrl>$(MSBuildProjectDirectory)\PublishDirectory</PublishUrl>
        <DeleteExistingFiles>True</DeleteExistingFiles>
        <PrecompileBeforePublish>True</PrecompileBeforePublish>
        <EnableUpdateable>False</EnableUpdateable>
        <DebugSymbols>False</DebugSymbols>
        <WDPMergeOption>DonotMerge</WDPMergeOption>
    </PropertyGroup>
</Project>

在本地运行 MSBuild,我最终在一个新的 PublishDirectory 文件夹中获得了预编译的站点,并且一切似乎都很顺利。

为了链接 TFS 和发布管理,我使用的是 ReleaseTfvcTemplate.12.xaml 模板。

构建 > 项目:$/Insert_Directory_Here/WebSite.csproj

高级 > MSBuild 参数:/p:DeployOnBuild=true /p:PublishProfile=TfsPrecompile

当我使用 MSBuild 参数运行构建时,与没有预编译参数的构建相比,九分钟左右的构建没有明显的时间差异。当我在本地运行 MSBuild 时,我看到对 ASPNETCOMPILER 的引用滚动,但我在任何 TFS 诊断日志中都没有看到对 ASPNETCOMPILER 或 aspnet_compiler 的引用。

【问题讨论】:

如果您以“详细”或“诊断”的构建日志记录详细程度运行构建,您是否看到任何与 ASP .NET 编译器相关的警告?这听起来很熟悉。 您是否设置了 VisualStudioVersion 属性?有关详细信息,请参阅sedodream.com/…。 @DanielMann @SayedIbrahimHashimi 我现在在 Build>Advanced>MSBuild 参数中使用/flp:verbosity=diagnostic /p:VisualStudioVersion=12.0 /p:DeployOnBuild=true /p:PublishProfile=TfsPrecompile,尽管我没有看到构建服务器上的文件或放置位置有任何差异。日志文件的大小与以前相同,似乎所有构建现在都在 2013 年以诊断级别记录。在 WebSite.log 文件中,我看到 DeployOnBuild = true 和 PublishProfile = TfsPrecompile 在 1>Project "C :\Builds\1\DIRECTORY\WebSite.csproj" 在节点 1 上(默认目标)。 【参考方案1】:

事实证明,构建框没有执行发布所需的所有目标,所以它只是忽略了它。

https://social.msdn.microsoft.com/Forums/vstudio/en-US/c2d10c74-ed44-4635-acb9-ab08612701e2/deployonbuild-not-working?forum=tfsbuild的回答

终于!我有解决办法。无论是从 Team Build 部署还是直接使用 MSBuild,您都需要将 MSBuild 目标复制到您的构建机器上才能成功发布。

我们不会将 Visual Studio 安装到我们的构建机器上(浪费许可证) - 但是我们会安装 Visual Studio Shell。似乎 shell 安装了一些 MSBuild 目标——但不是全部——当然也不是 Publishing。

因此在安装了 VS 的机器上转到 C:\Program Files (x86)\MSBuild\Microsoft

将整个文件夹复制到您的构建机器并在那里替换相同的文件夹。也许先备份原件。您还可以准确地确定您实际需要哪些目标...

这已经帮我解决了!

【讨论】:

可能需要仔细检查,因为我认为在构建服务器上部署 VS 不需要许可证——如果您只是使用它来促进构建。【参考方案2】:

我认为发布模板中有一个错误会影响网站的预编译方式。寻找使用默认模板,而不是手动添加 RM 位。

http://blogs.msdn.com/b/visualstudioalm/archive/2013/12/09/how-to-modify-the-build-process-template-to-use-the-option-trigger-release-from-build.aspx

首先切换到默认模板并验证它是否如您所愿。然后按照上面的路径。

【讨论】:

发布模板 build 很好。发布模板中有一个错误,它没有换出 _PublishedWebsites 文件夹中的标记化配置文件,但仅此而已。这纯粹是发布方面的问题。发布默认模板与默认模板基本相同,只是它添加了两个纯粹与发布关注点相关的小逻辑部分。构建完全没有被触及。 所以你的sating坏了?如果它没有在发布模板中交换标记化的配置,那么它就不会像默认的那样工作!

以上是关于如何获得 TFS 构建以使用保存的发布配置文件预编译 Web 应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

自托管 azure 代理 - 如何配置管道以共享相同的构建文件夹

在线构建 TFS 后如何访问工件文件夹?

配置 Bamboo 以使用 MS Build Xaml 模板

如何配置 tfs build 以在发布构建完成时复制 dll

如何为 Windows Azure Web 角色上的 PHP 项目配置 TFS 构建定义以实现持续集成?

如何设置 TFS 2013 以使用 Visual Studio 2013 或 Visual Studio 2017 构建