【问题标题】:Using MSBuild to buld a solution (.sln) with many projects in how can I make each project build into its own folder?使用 MSBuild 构建包含许多项目的解决方案 (.sln),如何让每个项目构建到自己的文件夹中?
【发布时间】:2011-09-26 16:14:31
【问题描述】:

我正在尝试为一个相当复杂(许多项目)的 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 文件。 (见下文)

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

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

我用一个简单的 bat 调用 .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>

【问题讨论】:

  • 您是如何解决问题的?我有相同且唯一的解决方案 - 是构建项目,而不是解决方案文件。

标签: msbuild continuous-integration


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-05
    • 2010-09-24
    • 2013-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-07
    • 2011-09-09
    相关资源
    最近更新 更多