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

发布于 2024-12-06 10:58:58 字数 3348 浏览 0 评论 0原文

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

我还尝试了更复杂的版本(复制并粘贴!)看起来更像是应该可以工作,但仍然把东西放在一个文件夹中。

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

I am trying to create a simple build process for a quite complex (many projects) vs2010 solution.

I wish for a folder structure such as this

-Build
   -Proj1
      -proj1.exe
      -proj1.dll
   -Proj2
      -proj2.exe
      -proj2.dll
......
   -Projn
      -projn.exe
      -projn.dll

What I am getting from my attempts below is

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

I currently have this as a .proj file. (see below)

This builds things fine, however it puts everything in the "build" folder that I specify. I want each project to be in its own seperate folder within that 'build' folder. How can I achive this?

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

I call the .proj with a simple bat

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

I have also tried a more complex version (copy and paste!) that looks more like it should work, but still puts things in a single folder.

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

浅浅淡淡 2024-12-13 10:58:58

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

Using devenv.com to build from the command line will do what you want. It will use the output directories specified in the project files. This is what we're using, because at the moment we don't need more control over the build mechanism.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文