Jar*_*uan 3 msbuild prebuild multi-targeting
我只想在构建过程之前运行我的 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>
Run Code Online (Sandbox Code Playgroud)
当我构建项目时,PreBuild 目标被调用了 3 次。
到目前为止,我已经尝试过:
1) 起初,我猜测构建是按顺序进行的,所以我向目标添加了一个条件:
<Target Name="PreBuild" BeforeTargets="PreBuildEvent" Condition=" '$(TargetFramework)' == 'net40' ">
<Exec Command="PowerShell -ExecutionPolicy Unrestricted -File script.ps1/>
</Target>
Run Code Online (Sandbox Code Playgroud)
,这不起作用。事实证明,多目标构建是同时进行的。有时,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>
Run Code Online (Sandbox Code Playgroud)
在这种情况下BeforeTargets="Build" Condition="'$(IsCrossTargetingBuild)' == 'true'"将不起作用,因为多目标Build目标取决于已经构建的“内部项目”。
| 归档时间: |
|
| 查看次数: |
885 次 |
| 最近记录: |