Msbuild 在一个多目标项目中,如何在所有构建之前只调用一次脚本
我只想在生成过程之前运行一次powershell脚本。在我看来,这应该很容易做到,只需在PreBuildEvent之前调用脚本就可以了。嗯,它确实适用于普通项目 但是,对于多目标项目,在所有目标框架的每次构建之前,都会多次调用脚本 这是我的项目文件,我的目标是3个框架:Msbuild 在一个多目标项目中,如何在所有构建之前只调用一次脚本,msbuild,prebuild,multi-targeting,Msbuild,Prebuild,Multi Targeting,我只想在生成过程之前运行一次powershell脚本。在我看来,这应该很容易做到,只需在PreBuildEvent之前调用脚本就可以了。嗯,它确实适用于普通项目 但是,对于多目标项目,在所有目标框架的每次构建之前,都会多次调用脚本 这是我的项目文件,我的目标是3个框架: <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFrameworks>net40;net45;netstandar
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net40;net45;netstandard1.4</TargetFrameworks>
<AssemblyName>abc</AssemblyName>
<Version>1.0.0</Version>
</PropertyGroup>
<ItemGroup Condition=" '$(TargetFramework)' == 'net40' ">
<Reference Include="System" />
<Reference Include="Microsoft.CSharp" />
</ItemGroup>
<ItemGroup Condition=" '$(TargetFramework)' == 'net45' ">
<Reference Include="System" />
<Reference Include="Microsoft.CSharp" />
</ItemGroup>
<Target Name="PreBuild" BeforeTargets="PreBuildEvent">
<Exec Command="PowerShell -ExecutionPolicy Unrestricted -File script.ps1/>
</Target>
</Project>
net40;net45;netstandard1.4
abc
1.0.0
,这不起作用。事实证明,多目标构建是同时进行的。有时,net40的构建会更晚,因此我的脚本在所有构建之前都没有运行
2) 然后我尝试使用环境变量来进行同步,但也没有成功。构建似乎没有共享环境变量
3) 最后,我转向其他MSBuild目标来替换PreBuildEvent,但没有找到合适的目标
因此,我如何在所有构建之前调用脚本,并且在多目标项目中仅调用一次。请帮助我。您可以将目标挂接到多目标msbuild目标,该目标将调用TargetFramework特定的生成,如下所示:
<PropertyGroup>
<TargetFrameworks>netstandard2.0;netstandard1.4</TargetFrameworks>
</PropertyGroup>
<Target Name="OuterPreBuild" BeforeTargets="DispatchToInnerBuilds">
<Message Importance="high" Text="Outer before build" />
</Target>
</Project>
netstandard2.0;netstandard1.4
在这种情况下,
BeforeTargets=“Build”Condition=“”$(IsCrossTargetingBuild)==“true”
将不起作用,因为多目标Build
target依赖于已经构建的“内部项目”。这很好,它可以解决我的问题。但我还有另一个问题:如何将msbuild预定义属性(如$(ProjectPath))传递给脚本?例如,如果我希望这样做,该怎么办:您可能希望使用$(MSBuildProjectDirectory)
,请参见“酷”。你救了我。谢谢。顺便说一句,我想知道您是如何找到正确的目标“DispatchToInnerBuilds”的?我检查了MSBuild.targets文件,但失败。它位于.CrossTargeting.targets文件中
<PropertyGroup>
<TargetFrameworks>netstandard2.0;netstandard1.4</TargetFrameworks>
</PropertyGroup>
<Target Name="OuterPreBuild" BeforeTargets="DispatchToInnerBuilds">
<Message Importance="high" Text="Outer before build" />
</Target>
</Project>