如何让TFS 2010将每个项目构建到单独的目录中?

Jon*_*ter 22 msbuild tfs team-build tfs2010

在我们的项目中,我们希望我们的TFS构建将每个项目放在drop文件夹下的自己的文件夹中,而不是将所有文件都放到一个平面结构中.为了说明,我们希望看到这样的事情:

DropFolder/
  Foo/
    foo.exe
  Bar/
    bar.dll
  Baz
    baz.dll
Run Code Online (Sandbox Code Playgroud)

这基本上与此处提出的问题相同,但现在我们正在使用基于工作流的构建,这些解决方案似乎不起作用.使用CustomizableOutDir属性的解决方案看起来对我们来说效果最好,但我无法识别该属性.我自定义了我们的工作流程,将其作为命令行参数传递给MSBuild(/ p:CustomizableOutDir = true),但似乎MSBuild只是忽略它并将输出放入工作流程给出的OutDir中.

我查看了构建日志,我可以看到CustomizableOutDir和OutDir属性都在命令行args中设置为MSBuild.我仍然需要传递OutDir,以便我可以在最后将我的文件复制到TeamBuildOutDir.

知道为什么我的CustomizableOutDir参数没有被识别,或者是否有更好的方法来实现这一点?

Jon*_*ter 14

我想出了一个很好的方法来做到这一点.事实证明,既然您可以将OutDir设置为工作流中的任何内容,那么如果将其设置为空字符串,MSBuild将使用特定于项目的OutputPath.这让我们变得更加灵活.这是我的整个解决方案(基于默认构建工作流程):

在"运行MSBuild"任务中,将OutDir设置为空字符串.在同一任务中,将CommandLineArguments设置为类似以下内容.这将允许您从项目中引用TFS默认OutDir:

String.Format("/p:CommonOutputPath=""{0}\\""", outputDirectory)
Run Code Online (Sandbox Code Playgroud)

在要复制到drop文件夹的每个项目中,设置OutputPath,如下所示:

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <OutputPath Condition=" '$(CommonOutputPath)'=='' ">bin\Release\</OutputPath>
    <OutputPath Condition=" '$(CommonOutputPath)'!='' ">$(CommonOutputPath)YourProjectName\bin\Release\</OutputPath>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

检查所有内容,您应该有一个工作版本,将每个项目部署到drop文件夹下的自己的文件夹中.


Tra*_*ohn 8

我也解决了这个问题,我认为它比这个线程上的现有解决方案更清晰.

  • Run MSBuild for Project活动之前,我添加了一项Assign活动:projectName = Regex.Replace(New FileInfo(localProject).Name, "\.sln$", "").
  • 接下来我添加了一个Create Directory活动:outputDirectory + "\" + projectName
  • 最后,在活动的MSBuild我改OutDiroutputDirectory + "\" + projectName.

模板已经填充了代理上构建localProject.sln文件的完整路径名,例如c:\build\path\to\MySolution.sln.assign活动会切断路径和扩展,将输出放入MySolution.您需要创建projectName变量,然后导入System.Text.RegularExpressionsSystem.IO.

OP解决方案的优势在于您无需编辑每个.csproj解决方案,从解决方案文件的名称推断出该信息.

  • 这非常有效,只需很少的努力即可完成我想要的工作.我做的唯一更改是使用Path.Combine而不是手动连接路径.对于那些好奇的人来说,使用这条路线时单元测试似乎工作正常.希望我能两次投票! (2认同)
  • 所有这一切都将您的输出放在解决方案级别文件夹中...如果解决方案中有多个项目,它们仍将被分组到该解决方案级别文件夹中. (2认同)