Msbuild 在一个多目标项目中,如何在所有构建之前只调用一次脚本

Msbuild 在一个多目标项目中,如何在所有构建之前只调用一次脚本,msbuild,prebuild,multi-targeting,Msbuild,Prebuild,Multi Targeting,我只想在生成过程之前运行一次powershell脚本。在我看来,这应该很容易做到,只需在PreBuildEvent之前调用脚本就可以了。嗯,它确实适用于普通项目 但是,对于多目标项目,在所有目标框架的每次构建之前,都会多次调用脚本 这是我的项目文件,我的目标是3个框架: <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFrameworks>net40;net45;netstandar

我只想在生成过程之前运行一次powershell脚本。在我看来,这应该很容易做到,只需在PreBuildEvent之前调用脚本就可以了。嗯,它确实适用于普通项目

但是,对于多目标项目,在所有目标框架的每次构建之前,都会多次调用脚本

这是我的项目文件,我的目标是3个框架:

<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>