而不是构建到默认的文件夹结构,就像
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
为每个项目定义了IntermediateOutputPath
和OutputPath
:
<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
下有两个项目。MSBuild
15.6.82.30579
不需要将自定义目标存储在C:Program Files[(x86)]microsoft visual studio2017xxxmsbuild15.0
或任何预定义路径下。默认情况下,重写已在Microsoft.Common.targets
中定义并注入到项目中CustomBeforeMicrosoftCommonTargets
属性。
来自Microsoft.Common.targets
评论:
此文件定义 .NET 标准生成过程中的步骤 项目。它包含所有常见的步骤 不同的 .NET 语言,如 Visual Basic 和 Visual C#。