MSBuild解决方案命令行输出到各个文件夹

时间:2014-08-07 20:18:42

标签: visual-studio visual-studio-2012 deployment msbuild

目前,我有以下MSBuild命令:

msbuild 
    /t:Build 
    /p:Configuration=Release 
    /p:OutputPath=C:\MySolutionOutput\ 
    MySolution.sln

然而,编译中我在我的解决方案中有多个项目。当我使用解决方案文件以这种方式构建时,它会将所有项目输出复制到同一目录,而Project2的输出会覆盖Project1的输出(或者它们内置的任何顺序)。

相反,我希望MSBuild将每个项目放入项目名称的子文件夹中。

msbuild 
    /t:Build 
    /p:Configuration=Release 
    /p:OutputPath=C:\MySolutionOutput\$(ProjectName)
    MySolution.sln

但是,$(ProjectName)语法不起作用,因为它实际上是一个名为$(ProjectName)的文件夹。

如何使MSBuild解决方案构建输出每个项目到OutputPath的子目录,最好不制作MSBuild xml文件,或单独构建每个项目?

为了进一步说明,我的项目如下。

+ Project 1
    + File1.txt
    + File2.txt
    + ReadMe.txt

+ Project 2
    + File3.txt
    + File4.txt
    + ReadMe.txt     

我的构建输出

C:\MySolutionOutput\File1.txt
C:\MySolutionOutput\File2.txt
C:\MySolutionOutput\File3.txt
C:\MySolutionOutput\File4.txt
C:\MySolutionOutput\ReadMe.txt 
^-- (this is the 2nd readme, project 1's readme gets overwritten)

我想要什么

C:\MySolutionOutput\Project 1\File1.txt
C:\MySolutionOutput\Project 1\File2.txt
C:\MySolutionOutput\Project 1\ReadMe.txt

C:\MySolutionOutput\Project 2\File3.txt
C:\MySolutionOutput\Project 2\File4.txt
C:\MySolutionOutput\Project 2\ReadMe.txt

1 个答案:

答案 0 :(得分:8)

使用msbuild构建解决方案时,它会在内部将解决方案转换为msbuild xml文件,该文件构建所有项目并将OutputPath等属性传递给它,并且afaik没有办法干扰其行为方式。一种可能的解决方案确实需要您自己编写msbuild文件,但修改确实很小。您没有提到您正在使用的项目类型,但任何类型的原则都是相同的,这里是C#项目的示例:

  • 创建一个允许以您希望的方式覆盖OutputPath的公共文件,但除非特别说明,以便在需要时保留现有行为,否则不执行任何操作
  • 在每个项目中导入该文件
  • 在命令行上指定自定义输出目录

msbuild文件,说outputpath.props

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <OutputPath Condition="'$(OutputPathBaseDir)' != ''">$(OutputPathBaseDir)\$(MSBuildProjectName)\</OutputPath>
  </PropertyGroup>
</Project>

每个项目的导入;这里我使用的是相对路径,但你可以参考例如$(SolutionDir)等;对于c#项目,请在显示

之前插入此行
<Import Project="..\outputpath.props" />
<!--the below is an existing line in every c# project-->
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

现在建立:

msbuild mysolution.sln /p:OutputPathBaseDir=C:\MySolutionOutput