使用 MSBuild 生成整个解决方案时使用项目名称



而不是构建到默认的文件夹结构,就像

Solution.sln
Project1
bin    <- project 1 output
obj    <- project 1 intermediate output
Project2
bin    <- project 2 output
obj    <- project 2 intermediate output

相反,我想像

Solution.sln
bin    <- project 1 AND 2 output
obj
Project1   <- project 1 intermediate output
Project2   <- project 2 intermediate output

我能做到

msbuild "/p:OutputPath=../bin" "/p:IntermediateOutputPath=../obj/" Test123.sln

但是,使用"/p:IntermediateOutputPath=../obj/$(ProjectName)/"不起作用。它不是为每个项目创建一个文件夹,而是创建一个字面上称为$(ProjectName)的文件夹(我已经阅读了大多数,但并非所有这些宏实际上都是Visual Studio的东西,而不是MSBuild的魔术)。

构建时,如何在属性值(如IntermediateOutputPath)中使用项目特定的值(如ProjectName)?

(一些背景资料:

在解决方案级别使用一个bin文件夹可以节省不必要的输出文件复制,在大型解决方案中,输出文件会迅速累积超过 100 MB。此外,它保持源文件夹干净,因此它们可以是只读的。

不过,我仍然想要单独的obj文件夹,因为谁知道里面有什么 - 不同项目的文件名可能相同。

您可以覆盖 Microsoft.Common.targets 文件的 CustomAfterMicrosoftCommonTargets 属性。它允许将自定义目标注入项目并执行一些操作。


构建过程的入口点Make.targets

<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"; DefaultTargets="EntryMSBuild">
<ItemGroup>
<Project Include="***.csproj"/>
</ItemGroup>
<Target Name="EntryMSBuild">
<Message Text="-----Entry-----" Importance="high"/>
<Message Text="    Rebuild    " Importance="high"/>
<Message Text="-----Entry-----" Importance="high"/>
<MSBuild Projects="@(Project)" Targets="rebuild" Properties="CustomBeforeMicrosoftCommonTargets=$(MSBuildThisFileDirectory)Setting.targets"/>
</Target>
</Project>

InSetting.targets为每个项目定义了IntermediateOutputPathOutputPath

<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<IntermediateOutputPath>..Globalobj$(MSBuildProjectName)</IntermediateOutputPath>
</PropertyGroup>
<PropertyGroup>
<OutputPath>..Globalbin</OutputPath>
</PropertyGroup>
</Project>
  • IntermediateOutputPath - 依赖于 $(MSBuildProjectName);
  • 输出路径 - 所有项目通用。

结果,您可以获得所需的结构:

Solution.sln
bin    <- project 1 AND 2 output
obj
Project1   <- project 1 intermediate output
Project2   <- project 2 intermediate output

在解决方案上进行了测试,.net46.netstandard2.0下有两个项目。MSBuild15.6.82.30579


不需要将自定义目标存储在C:Program Files[(x86)]microsoft visual studio2017xxxmsbuild15.0或任何预定义路径下。默认情况下,重写已在Microsoft.Common.targets中定义并注入到项目中CustomBeforeMicrosoftCommonTargets属性。

来自Microsoft.Common.targets评论:

此文件定义 .NET 标准生成过程中的步骤 项目。它包含所有常见的步骤 不同的 .NET 语言,如 Visual Basic 和 Visual C#。

相关内容

  • 没有找到相关文章

最新更新