使用MSBuild构建一个包含许多项目的解决方案(.sln),如何将每个项目构建到自己的文件夹中?

时间:2011-09-26 16:14:31

标签: msbuild continuous-integration

我正在尝试为相当复杂的(许多项目)vs2010解决方案创建一个简单的构建过程。

我希望有一个像

这样的文件夹结构
-Build
   -Proj1
      -proj1.exe
      -proj1.dll
   -Proj2
      -proj2.exe
      -proj2.dll
......
   -Projn
      -projn.exe
      -projn.dll

我从下面的尝试中得到的是

-Build
   -proj1.exe
   -proj1.dll
   -proj2.exe
   -proj2.dll
   -projn.exe
   -projn.dll

我目前将此作为.proj文件。 (见下文)

这样可以很好地构建,但它会将所有内容放在我指定的“build”文件夹中。我希望每个项目都在该“build”文件夹中的自己的单独文件夹中。我怎么能做到这一点?

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

<PropertyGroup>
  <BuildOutputDir>C:\Projects\BuildScripts\Build</BuildOutputDir>
  <SolutionToCompile>PathToSolution.sln</SolutionToCompile>
 </PropertyGroup>

 <Target Name="Clean">
  <RemoveDir Directories="$(BuildOutputDir)" />
 </Target>

 <Target Name="Compile">
  <MakeDir Directories="$(BuildOutputDir)" />
  <MSBuild Projects="$(SolutionToCompile)" 
           properties = "OutputPath=$(BuildOutputDir)" Targets="Rebuild" />

 </Target>

 <Target Name="Build" DependsOnTargets="Clean;Compile">
  <Message Text="Clean, Compile"/>
 </Target>
</Project>

我用简单的蝙蝠打电话给.proj

"%windir%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe" /nologo externalBuild.proj /m:2 %*
pause

我还尝试了一个更复杂的版本(copy and paste!),它看起来更像应该可以使用,但仍然把东西放在一个文件夹中。

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="BuildAll" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <ItemGroup>
    <ProjectsToBuild Include="path to solution folder\**\*proj" Exclude="$(MSBuildProjectFile)"/>
  </ItemGroup>

  <PropertyGroup>
    <Configuration>CI</Configuration>
  </PropertyGroup>



  <Target Name="CoreBuild">
    <MSBuild Projects ="@(ProjectsToBuild)"
             ContinueOnError ="false"
             Properties="Configuration=$(Configuration)">
      <Output ItemName="OutputFiles" TaskParameter="TargetOutputs"/>
    </MSBuild>    
  </Target>
  <PropertyGroup>
    <DestFolder>Build\</DestFolder>
  </PropertyGroup> 


  <Target Name="CopyFiles">
    <Copy SourceFiles="@(OutputFiles)"
          DestinationFiles="@(OutputFiles->'$(DestFolder)%(RecursiveDir)%(Filename)%(Extension)')" />
  </Target>

  <Target Name="CleanAll">
    <!-- Delete any files this process may have created from a previous execution -->
    <CreateItem Include="$(DestFolder)\**\*exe;$(DestFolder)\**\*dll">
      <Output ItemName="GeneratedFiles" TaskParameter="Include"/>
    </CreateItem>

    <Delete Files="@(GeneratedFiles)"/>
    <MSBuild Projects="@(ProjectsToBuild)" Targets="Clean" Properties="Configuration=$(Configuration);"/>
  </Target>

  <PropertyGroup>
    <BuildAllDependsOn>CleanAll;CoreBuild;CopyFiles</BuildAllDependsOn>
  </PropertyGroup>
  <Target Name="BuildAll" DependsOnTargets="$(BuildAllDependsOn)"/>

</Project>

1 个答案:

答案 0 :(得分:0)

使用devenv.com从命令行构建将执行您想要的操作。它将使用项目文件中指定的输出目录。这就是我们正在使用的,因为目前我们不需要对构建机制进行更多控制。