而不是构建到默认的文件夹结构,这就像
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
文件夹,因为谁知道那里有什么 - 可能是不同项目的文件名相同。)
答案 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
定义IntermediateOutputPath
和OutputPath
:
<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#。