2

我在单个 TFS 解决方案(shell、comon 库、两个模块和几个测试项目)中有一个 PRISM 应用程序。为了简单起见,我选择了 DirectoryModuleCatalog 并且为了在构建后在本地运行应用程序,向复制的模块项目构建添加了一个后期构建步骤构建 dll 到 GUI 应用程序输出路径的模块子文件夹。

这在本地客户端构建上工作得很好,但是当从 TFS 构建代理触发相同的构建后事件时,它会失败。经检查,这是因为 $(OutDir) 宏是本地相对路径,在 TFS 构建代理 MSBuild 日志中是绝对路径!

引用 MSDN

$(OutDir) 

Path to the output file directory, relative to the project directory. 
This resolves to the value for the Output Directory property. 
It includes the trailing backslash '\'.

在本地,这在构建代理上解析为“bin\Debug\”,它解析为“C:\Builds\5\XXXX\Gui.DEV_XXXX7_Iteration0.CI\Binaries\”

鉴于这个原始的本地后期构建定义;

mkdir "$(SolutionDir)Gui\$(OutDir)Modules\"
copy "$(TargetPath)" "$(SolutionDir)Gui\$(OutDir)Modules\"

您可以看到为什么它在构建代理上失败,如下所示:

mkdir "C:\Builds\4\XXXX\Gui.DEV_Cortex7_Iteration0.CI\Sources\Gui\C:\Builds\4    \XXXX\Gui.DEV_XXXX7_Iteration0.CI\Binaries\Modules\"
copy "C:\Builds\4\XXXX\Gui.DEV_XXXX7_Iteration0.CI\Binaries\Apdcomms.Cortex.Gui.Example2.Module.dll" 
    "C:\Builds\4\XXXX\Gui.DEV_XXXX7_Iteration0.CI\Sources\Gui\C:\Builds\4\XXXX\Gui.DEV_XXXX7_Iteration0.CI\Binaries\Modules\"
The filename, directory name, or volume label syntax is incorrect.
The filename, directory name, or volume label syntax is incorrect.
      0 file(s) copied.

因此,在查看宏的值时,在 TFS 构建代理下构建与在本地模式下构建时,我似乎需要在 postbuild 中使用一组不同的命令,这非常糟糕。

所以问题是:如何以适用于 locla 客户端构建和 TFS 团队构建的方式将解决方案中一个项目的二进制输出移动到同一解决方案中另一个项目的子文件夹

4

1 回答 1

2

从 TFS 构建时,我个人不喜欢依赖构建后脚本。自定义构建模板会更好。虽然后期构建脚本肯定更容易,但构建模板将更好地管理您的环境(在我看来)。我链接到 Microsoft 文章,为您提供有关如何完成此操作的更多信息。我还粘贴了内容,以便 StackOverflow 可以保持独立。

http://msdn.microsoft.com/en-us/library/ff977206.aspx

默认构建过程(在 DefaultTemplate.xaml 中定义)会将它从所有代码项目编译的二进制文件放到一个目录中。但是,在某些情况下,您希望将二进制文件组织成更细粒度和更有条理的文件夹结构。

您可以使用本主题中的技术创建自定义构建过程,将二进制文件放入您设计的目录结构中。您还可以使用相同的原则以不同的方式自定义构建过程。本主题介绍了以下技术:

自定义构建过程的 Windows 工作流部分。您应该在此部分中进行更改以自定义构建过程的大多数方面,除了编译和处理二进制文件。具体来说,本主题介绍如何执行以下任务:

通过修改默认模板 (DefaultTemplate.xaml) 的副本来创建自定义生成过程。

声明并使用参数将数据传递到工作流中。

声明并使用变量在整个工作流程中收集和传递数据。

修改工作流如何使用 MSBuild 活动来调用 MSBuild。

将文件下载到构建服务器并使用 ConvertWorkspaceItem 活动使该文件可用于构建过程。

自定义构建过程的 MSBuild 部分。通过在此部分中进行更改,您可以更有效地自定义二进制文件的编译和处理方式。具体来说,本主题介绍如何执行以下任务:

将参数传递给 MSBuild,然后在代码项目中使用它们来更改编译的二进制文件的处理方式。

设置您自己的 MSBuild 元素(例如属性组或目标)的集中式公共代码库。通过设置这种类型的库,您可以让您的团队轻松重用和修改构建过程逻辑的关键部分。

于 2012-05-31T17:07:35.847 回答