3

我正在尝试为我们的一个产品编写一个自动构建,并且我已经为我们的一些 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:)

<?xml version="1.0"?>
<VisualStudioPropertySheet ProjectType="Visual C++"
                           Version="8.00"
                           Name="Overrides"
                           OutputDirectory="V:\">
  <Tool Name="VCCLCompilerTool"
        AdditionalUsingDirectories="V:\" />
</VisualStudioPropertySheet>

然后我编辑了我的 MSBuild 文件以添加 Override 参数:

<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>
4

3 回答 3

2

查看VCBuild 任务的 Override 参数。基本上,您指定一个属性表,您可以使用它来覆盖您想要的任何属性(它与在 VS 中的项目中将属性表添加到列表顶部具有相同的效果)。您甚至可以使用 WriteLinesToFile 任务生成覆盖文件。

例子:

<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>

然后将 $(VCOverridesFile) 传递给 Override 属性并确保您的 VCBuild 任务 DependsOnTarget WriteOverridesFile。

于 2010-11-22T21:48:07.863 回答
0

这样做是肮脏的方式,你可以通过命令行参数传递输出目录路径msbuild

msbuild yourProject /p:OutDir=yourPath

尽管我怀疑,应该有更好的方法来完成任务。主要思想是设置“OutDir”属性,使其不会被您的 SomeProject.vcproj 覆盖

于 2010-11-22T21:24:12.523 回答
0

如果您使用 Azure DevOps 并且需要创建 YAML,请构建一个 .net 框架(老式 [旧])

- task: VSBuild@1
  inputs:
    solution: '**\*.sln'
    msbuildArgs: '/p:DeployOnBuild=true /p:SkipInvalidConfigurations=false /p:OutDir="$(System.DefaultWorkingDirectory)\publish_output"'
    platform: 'Any CPU'
    configuration: 'Release'
于 2021-03-10T21:18:41.650 回答