使用msbuild构建整个解决方案时使用ProjectName

时间:2018-04-20 19:31:12

标签: build msbuild solution

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

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魔法)。

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

(一些背景信息:

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

我仍然想要separete obj文件夹,因为谁知道那里有什么 - 可能是不同项目的文件名相同。)

1 个答案:

答案 0 :(得分:2)

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

构建过程的切入点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>

每个项目的Setting.targets定义IntermediateOutputPathOutputPath

<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

    <PropertyGroup>
        <IntermediateOutputPath>..\Global\obj\$(MSBuildProjectName)</IntermediateOutputPath>
    </PropertyGroup>

    <PropertyGroup>
        <OutputPath>..\Global\bin\</OutputPath>
    </PropertyGroup>

</Project>

结果你得到了理想的结构:

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

.net46.netstandard2.0下的两个项目的测试中进行测试。 MSBuild 15.6.82.30579

<强> UPD 即可。您不需要在c:\program files[ (x86)]\microsoft visual studio\2017\xxx\msbuild\15.0或任何预定义路径下存储自定义目标。您覆盖CustomBeforeMicrosoftCommonTargets中已定义的Microsoft.Common.targets属性并默认注入项目。

来自Microsoft.Common.targets评论:

  

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