MSBuild中的VCBuild任务-更改outputpath

MSBuild中的VCBuild任务-更改outputpath,msbuild,vcbuild,Msbuild,Vcbuild,我正试图为我们的一个产品编写一个自动构建,我遇到了一些VC++项目的难题:我需要能够设置输出路径,以便在完成后将程序集复制到哪里 以下是一个临时msbuild文件: <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5"> <Target Name="Build">

我正试图为我们的一个产品编写一个自动构建,我遇到了一些VC++项目的难题:我需要能够设置输出路径,以便在完成后将程序集复制到哪里

以下是一个临时msbuild文件:

<Project DefaultTargets="Build"
         xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
         ToolsVersion="3.5">
 <Target Name="Build">
   <VCBuild Projects="C:\src\SomeProject\SomeProject.vcproj"
            ToolPath="C:\Program Files\Microsoft Visual Studio 9.0\VC\vcpackages"
            Configuration="Debug" />
 </Target>
</Project>





Stijn的回答:

我想我应该利用这个空间来澄清我个人是如何使用Stijn的答案来解决这个问题的。他在MSBuild文件中有一些代码,可以为他编写vsprops文件。我决定采用一种更简单的方法,只需手动编写文件

我创建了这个名为build.vsprops的文件(我的输出路径是V:)


然后,我编辑了MSBuild文件以添加覆盖参数:

<Project DefaultTargets="Build"
         xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
         ToolsVersion="3.5">
 <Target Name="Build">
   <VCBuild Projects="C:\src\SomeProject\SomeProject.vcproj"
            ToolPath="C:\Program Files\Microsoft Visual Studio 9.0\VC\vcpackages"
            Configuration="Debug"
            Override="$(MSBuildProjectDirectory)\build.vsprops" />
 </Target>
</Project>

使用脏方法执行此操作您可以通过
msbuild的命令行参数传递输出目录路径

msbuild yourProject /p:OutDir=yourPath

尽管我怀疑,应该有更好的方法来完成这项任务。其主要思想是设置“OutDir”属性,使其不会被SomeProject覆盖。vcproj查看该属性的覆盖参数。基本上,您可以指定一个属性表,用于覆盖所需的任何属性(其效果与在VS中的项目中将属性表添加到列表顶部相同)。您甚至可以使用WriteListFile任务生成覆盖文件

例如:

<PropertyGroup>
  <VCOverridesFile Condition=" '$(VCOverridesFile)'=='' ">overrides.vsprops</VCOverridesFile>
  <VCOverridesOpen>%3C?xml version=%221.0%22?%3E%0D%0A%3CVisualStudioPropertySheet ProjectType=%22Visual C++%22 Version=%228.00%22 Name=%22My Overrides%22%3E</VCOverridesOpen>
  <VCOverridesClose>%3C/VisualStudioPropertySheet%3E</VCOverridesClose>
  <MyOutPath>&lt;Tool Name="VCLinkerTool" OutputFile ="c:\my.exe"/&gt;</MyOutPath>
</PropertyGroup>

<Target Name="WriteOverridesFile">
  <WriteLinesToFile
    File="$(VCOverridesFile)"
    Lines="$(VCOverridesOpen);$(AdditionalVCOverrides);$(VCOverridesClose)"
    Overwrite="true" />
</Target>

overrides.vsprops
%3C?xml版本=%221.0%22?%3E%0D%0A%3CVisualStudioPropertySheet项目类型=%22Visual C++%22版本=%228.00%22名称=%22My覆盖%22%3E
%3C/VisualStudioProperty表%3E
工具名称=“vclinertool”OutputFile=“c:\my.exe”/

然后将$(VCOverridesFile)传递给Override属性,并确保VCBuild任务依赖于Target WriteOverridesFile。

如果您使用的是Azure DevOps,并且需要创建YAML do build.net framework(vintage[旧])

<PropertyGroup>
  <VCOverridesFile Condition=" '$(VCOverridesFile)'=='' ">overrides.vsprops</VCOverridesFile>
  <VCOverridesOpen>%3C?xml version=%221.0%22?%3E%0D%0A%3CVisualStudioPropertySheet ProjectType=%22Visual C++%22 Version=%228.00%22 Name=%22My Overrides%22%3E</VCOverridesOpen>
  <VCOverridesClose>%3C/VisualStudioPropertySheet%3E</VCOverridesClose>
  <MyOutPath>&lt;Tool Name="VCLinkerTool" OutputFile ="c:\my.exe"/&gt;</MyOutPath>
</PropertyGroup>

<Target Name="WriteOverridesFile">
  <WriteLinesToFile
    File="$(VCOverridesFile)"
    Lines="$(VCOverridesOpen);$(AdditionalVCOverrides);$(VCOverridesClose)"
    Overwrite="true" />
</Target>
- task: VSBuild@1
  inputs:
    solution: '**\*.sln'
    msbuildArgs: '/p:DeployOnBuild=true /p:SkipInvalidConfigurations=false /p:OutDir="$(System.DefaultWorkingDirectory)\publish_output"'
    platform: 'Any CPU'
    configuration: 'Release'