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

TFS2010 Team Build 与 ClickOnce 应用程序

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.57/5 (6投票s)

2010年10月28日

CPOL

5分钟阅读

viewsIcon

61263

downloadIcon

617

如何设置 TFS2010 以便您可以使用 Team Build 和 ClickOnce 应用程序

引言

通过 TFS2010,Microsoft 创造了一个非常灵活的构建系统,但问题在于它没有对 ClickOnce 应用程序的开箱即用支持。在本文中,我将展示如何使用 TFS2010 中的 Team Build 来构建和发布 ClickOnce 应用程序。

如果您想发布应用程序,您还需要 TFS Deployer(在此处获取)。

准备 ClickOnce 应用程序

在我们可以使用 Team Build 构建 ClickOnce 应用程序之前,我们需要准备应用程序并创建所有 ClickOnce 清单。如果应用程序以前已通过 ClickOnce 部署,您可以跳过此阶段。为此,请打开应用程序并转到项目属性

image1.png

转到“发布”选项卡,然后输入您要部署应用程序的位置(我使用了 \\Dave\ClickOnce)。配置好后,单击“立即发布”按钮来设置所有清单并部署应用程序。

image2.png

应用程序现在应该有一个签名密钥,并且所有清单文件都已存在。将此解决方案添加到您的 TFS 2010 源代码管理中,我们就准备好开始了。

设置 Team Build

现在我们需要设置 Team Build,以便在运行构建时要求 MSBuild 创建 ClickOnce 文件。最简单的解决方案是在 Team Build 设置的 MSBuild 参数字段中传递 /t:publish

image3.png

这个解决方案的问题在于使用“DefaultTemplate.xaml”模板,添加此参数将要求 MSBuild 在现有文件旁边创建 ClickOnce 清单文件,这些文件将出现在binaries文件夹中。正确的 ClickOnce 文件结构将出现在项目调试文件夹下(例如ClickOnceApplication\bin\Debug\app.publish文件夹)。此文件夹在构建期间不会复制到Binaries文件夹。

解决方案是修改DefaultTemplate.xaml;为此,我们需要知道可部署 ClickOnce 应用程序的项目名称。因此,我们在构建脚本中添加了一个参数,以便我们可以轻松地为多个构建配置此参数。

创建变量

在 VS2010 中打开DefaultTemplate.xaml。您将在窗口底部看到指向“参数”屏幕的链接。

image4.png

打开“参数”屏幕,添加一个名为“PublishProject”的新参数,方向为“In”,类型为“String”。

image5.png

为了使变量请求更用户友好,请选择 MetaData 参数并单击“...”按钮

image6.png

您将打开 MetaData 窗口(如下图所示),在此处添加一个具有所示详细信息的新项

image7.png

更改工作流

由于我们希望此脚本用于 ClickOnce 和普通应用程序,因此我们所做的所有更改都应该可以正常运行普通应用程序。我们使用创建的参数来检查这是普通应用程序还是 ClickOnce 应用程序。我们做的第一个更改是当变量被填充时自动将 /t:publish 参数添加到 MSBuild 调用中。工作流中有多个路径,因此 MSBuild 出现在两个位置,请确保在这两个位置都进行了更改。

您需要查找名为“Run MSBuild for Project”的 MSBuild 活动,第一个位于

“Process > Sequence > Run On Agent > Try Compile, Test, and Associate Changesets and Work Items > Sequence > Compile, Test, and Associate Changesets and Work Items > Try Compile and Test > Compile and Test > For Each Configuration in BuildSettings.PlatformConfigurations > Compile and Test for Configuration > If BuildSettings.HasProjectsToBuild > For Each Project in BuildSettings.ProjectsToBuild > Try to Compile the Project > Compile the Project”(这是一条很长的路径)。

Build Task 的属性之一是“CommandLineArguments”,它被填充为

“String.Format("/p:SkipInvalidConfigurations=true {0}", If(MSBuildArguments, ""))”

我们需要添加额外的参数,但仅当传入了 Publish Project 时。将参数更改为包含

“String.Format("/p:SkipInvalidConfigurations=true {0} {1}", _
If((PublishProject IsNot Nothing AndAlso PublishProject <> ""), _
"/t:publish", ""), If(MSBuildArguments, ""))”

image8.png

下一个更改是复制输出文件到 drop 位置。在普通应用程序构建中,我们希望从Binaries文件夹复制所有文件。对于 ClickOnce 应用程序,我们需要复制放在“application\bin\debug\app.publish”文件夹中的输出。由于应用程序文件夹的名称与应用程序相同,因此这就是变量发挥作用的地方。让我们找到复制发生的位置,它位于

“Process > Sequence > Run On Agent > Try Compile, Test, and Associate Changesets and Work Items (在 finally 块中) > Revert Workspace and Copy Files to Drop Location > If DropBuild And DropLocation is Set (在 Then 部分)。

目前 Then 块将只包含 CopyDirectory 任务,将其保存以备后用,将其复制到 Else 部分。在 Then 部分插入另一个 If 语句,其条件为

“PublishProject IsNot Nothing AndAlso PublishProject <> ""“

这只是检查一个有效的 PublishProject。在新 if 语句的 else 部分,将 CopyDirectory 从之前移动它的其他 Else 部分复制回来。在 Then 部分,从 Else 部分复制 CopyDirectory 任务的一个克隆。

image9.png

现在您需要将文件签入 TFS。我已经将编辑后的文件包含在解决方案中,供那些在上述过程中迷失方向的人使用。

构建解决方案

文件更新后,您可以使用新的DefaultTemplate.xaml文件创建构建定义。在“进程”选项卡上,您现在应该会看到一个名为“ClickOnce”的额外部分,其中有一个名为“Project To Publish”的新参数,您需要在此处放入要通过 ClickOnce 发布的项目名称。

image10.png - Click to enlarge image

保存构建定义后,您可以排队一个新构建。完成后,它应该看起来像这样(我添加了一条消息以显示文件复制)

image11.png - Click to enlarge image

部署解决方案

TFS Deployer 可以从 http://tfsdeployer.codeplex.com/ 下载。我将不介绍如何设置 TFS Deployer,因为它已在其他地方详细介绍。随附的文件中有用于从Drop文件夹发布项目的 PowerShell 脚本。

历史

  • 2010 年 10 月 28 日:首次发布
© . All rights reserved.