TFS2010解决方案PostBuild宏值在Team构建中有所不同

时间:2012-05-31 13:13:49

标签: visual-studio-2010 msbuild tfsbuild team-build

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

这在本地客户端构建上运行良好,但是当从TFS构建代理触发相同的postbuild事件时,它会失败。在检查时这是因为$(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.

所以看看宏的值,看起来我在postbuild中需要一组不同的命令,当在TFS构建代理下构建到本地模式时,这非常糟糕。

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

1 个答案:

答案 0 :(得分:2)

我个人不喜欢在使用TFS构建时依赖post构建脚本。定制构建模板会好得多。虽然postbuild脚本肯定更容易,但构建模板将更好地管理您的环境(在我看来)。我正在链接到一篇微软文章,为您提供有关如何完成此任务的更多信息。我也粘贴了内容,以便StackOverflow可以保持自包含。

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

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

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

自定义构建过程的Windows Workflow段。您应该在此段中进行更改以自定义构建过程的大多数方面,但编译和处理二进制文件除外。具体而言,本主题介绍如何执行以下任务:

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

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

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

修改工作流使用MSBuild活动调用MSBuild的方式。

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

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

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

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