Msbuild TFS生成定义和相对工作区路径

Msbuild TFS生成定义和相对工作区路径,msbuild,Msbuild,在TFS 2010中假设此文件夹结构 Main Collection_A Solution_A1 Solution_A2 Reference Assemblies Collection_B Solution_B1 Project_B1A Project\u B1A通过使用相对路径(。\..\\\..\Collection\u A\Reference Assemblies\Whatever.d

在TFS 2010中假设此文件夹结构

Main
    Collection_A
        Solution_A1
        Solution_A2
        Reference Assemblies
    Collection_B
        Solution_B1
            Project_B1A
Project\u B1A
通过使用相对路径(
。\..\\\..\Collection\u A\Reference Assemblies\Whatever.dll
)引用
集合A
引用程序集中的dll。在TFS中定义生成定义时,工作流选项卡中出现问题

Project_B1A => $(SourceDir)
对于引用程序集,它应该是

Reference Assemblies => $(SourceDir)\..\..\..\Collection_A\Reference Assemblies
但随后TFS抛出错误

TF215083: The local path $(SourceDir)\..\..\Collection_A\Reference Assemblies for a 
workspace mapping is not valid. (Detail Message: TF10202: The path '..' ends with a 
character which is not allowed. Characters which are not allowed include '.' and ' '.)

我们已经尝试了
$(SourceDir)\Collection\u A\Reference Assemblies
$(BuildDir)\Collection\u A\Reference Assemblies
,但正如预期的那样,没有任何效果。是否可以使用其他变量?

如错误消息所示,我认为在定义工作文件夹映射时不允许使用相对路径

相反,您应该做的是从要映射的所有可能路径中最常见的路径开始映射(在本例中,它是Main)。所以$(SourceDir)应该映射到Main。但是,您应该只映射Main的顶层(使用星号作为Main/*)。这意味着您不想递归地映射Main。然后在其他映射中指定Main的特定子文件夹

它看起来像:

$/Main/* -> $(SourceDir)
$/Main/Collection_A/Reference Assemblies -> $(SourceDir)\Collection_A\Reference Assemblies
$/Main/Collection_B/Solution_B1/Project_B1A -> $(SourceDir)Collection_B\Solution_B1\Project_B1A
或者,如果不想映射的路径数小于根路径下要映射的路径数,则可以递归映射根路径,但有选择地隐藏不需要的路径


希望这有帮助。

同意:+1。注意,我根本不会设置您的第一行
$/Main/*->$(SourceDir)
,只设置以下两行,因为这第一行将导致下载
$/Main/
下的所有内容。只需设置后两个就可以了。这可能会起作用,我不记得我们是否需要第一行。感谢您澄清它下载Main下的文件和文件夹,只是不是递归的。谢谢,这很有效。由于路径变得太长,我最终使用了$(BuildDir)。此外,正如@pantelif所评论的,我不必绘制主地图。谢谢,这也解决了我们工作中的问题。还要感谢@pantelif指出,顶部文件夹条目本身并不是必需的。这个问题写得很好!然而,我认为你指的是“工作区”选项卡,而不是“工作流”。