如何在TFS 2013工作流中更改msbuild工作目录

如何在TFS 2013工作流中更改msbuild工作目录,msbuild,tfsbuild,Msbuild,Tfsbuild,我有一个TFS 2013 build xaml工作流,它最终会为我要生成的每个解决方案调用一次Microsoft.TeamFoundation.build.workflow.Activities.MSBuild活动。调用msbuild.exe时,其工作目录是正在生成的当前解决方案的工作目录。在使用“诊断”详细信息运行msbuild时,我可以通过“MSBuildStartupDirectory”属性看到这一点 不幸的是,当msbuild.exe启动时,我需要在其他地方使用msbuild.exe。这

我有一个TFS 2013 build xaml工作流,它最终会为我要生成的每个解决方案调用一次Microsoft.TeamFoundation.build.workflow.Activities.MSBuild活动。调用msbuild.exe时,其工作目录是正在生成的当前解决方案的工作目录。在使用“诊断”详细信息运行msbuild时,我可以通过“MSBuildStartupDirectory”属性看到这一点

不幸的是,当msbuild.exe启动时,我需要在其他地方使用msbuild.exe。这是因为我使用的MSBuild运行程序对调用MSBuild的目录施加约束


我已经查看了“msbuild”活动,无法控制工作目录。是否有其他方法可以控制此活动的工作目录?

我编辑生成过程模板已有一段时间了,但我相信您可以使用仅在CMD中执行命令并提供完整MSBuild命令的活动。我相信你需要设置大量的变量才能让它工作

您是否考虑过在生成后脚本中使用PowerShell脚本来执行SonarQube,而不是编辑生成过程模板


我仍然没有找到任何方法来控制msbuild的工作目录。但是,因为我知道工作目录将是由msbuild生成的项目的目录,所以我在工作区的根目录(必须是工作目录)创建了一个新的proj文件,并且仅从我的工作流生成这个新的proj文件。这个新的proj文件然后构建我的所有其他解决方案。这样,对于所有正在构建的解决方案,我的工作目录都是相同的

下面是我的顶级项目文件的一个示例:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build">
  <ItemGroup>
    <Solutions Include="**\*.sln"/>
  </ItemGroup>

  <Target Name="Build">
    <MSBuild Projects="@(Solutions)" Targets="Build"/>
  </Target>      
</Project>

但请注意,这样做可能会影响每个解决方案的输出目录(OutDir)。因此,您可能需要执行以下操作:

<MSBuild Projects="@(Solutions)" Targets="Build" Properties="OutDir=$(OutDir)..\%(Solutions.Filename)"/>


对CMD有很好的建议。但是,如果我需要修改工作流,我宁愿通过调用powershell脚本来替换许多活动,该脚本将完成所有工作(启动sonarQube runner、编译、测试、停止sonarQube runner)。这将简化工作流,并将大部分构建逻辑放在我的PowerShell脚本中。我还没有,但我认真考虑过。我们一直避免改变构建过程模板,所以我们不必长期拥有。我们已经能够使用MSBuild或构建前/后脚本成功地扩展TFS构建。