如何在多目标项目中的所有构建之前仅调用一次脚本

2023-11-25

我想在构建过程之前仅运行一次 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>

当我构建项目时,PreBuild 目标被调用了 3 次。

到目前为止,我已经尝试过:

1)起初,我猜测构建是按顺序进行的,所以我向我的目标添加了一个条件:

  <Target Name="PreBuild" BeforeTargets="PreBuildEvent" Condition=" '$(TargetFramework)' == 'net40' ">
    <Exec Command="PowerShell -ExecutionPolicy Unrestricted -File script.ps1/>
  </Target>

,这没有用。事实证明,多目标构建是同时进行的。有时,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>

在这种情况下BeforeTargets="Build" Condition="'$(IsCrossTargetingBuild)' == 'true'"不起作用,因为多目标Build目标取决于已经建立的“内部项目”。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在多目标项目中的所有构建之前仅调用一次脚本 的相关文章

随机推荐