我有一个通用的目标文件,其中包含 AfterBuild .目标文件位于解决方案级别。所有 csproj 使用<Import Project=$(SolutionDir)custom.targets
文件导入自定义目标文件。但是 custom.targets 中的 afterbuild 永远不会为任何 csproj 运行。我在这里错过了什么?
自定义目标文件包含以下内容
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<OutputTargets Include="$(TargetDir)$(TargetName).???" />
<OutputSatellites Include="$(TargetDir)**$(TargetName).resources.dll" />
</ItemGroup>
<Target Name="AfterBuild">
<Copy SourceFiles="@(OutputTargets)" DestinationFiles="@(OutputTargets->'$(SolutionDir)Test.WebAppConfig%(RecursiveDir)%(Filename)%(Extension)')" />
<Copy SourceFiles="@(OutputSatellites)" DestinationFiles="@(OutputSatellites->'$(SolutionDir)Test.WebAppConfig%(RecursiveDir)%(Filename)%(Extension)')" />
</Target>
</Project>
上述目标文件将导入到解决方案中的每个 csproj 中。
目标"AfterBuild"和"BeforeBuild"被Microsoft.Common.targets项目覆盖。如果未明确包含项目,则会自动将其添加为标题和预告片。
这样,迁移到新 csproj 格式的项目(以及具有新 csproj 格式的新项目(就不能以这种方式指定"BeforeBuild"和"AfterBuild"目标。
相反,建议使用 BeforeTargets
或 AfterTargets
属性注册自定义"预生成"和"后期生成"目标,如下所示:
<Target Name="DefinitelyNotBeforeBuild" BeforeTargets="PreBuildEvent">
<!-- BeforeBuild goes here -->
</Target>
<Target Name="DefinitelyNotAfterBuild" AfterTargets="PostBuildEvent">
<!-- AfterBuild goes here -->
</Target>
确保不要将这些目标命名为"BeforeBuild"和"AfterBuild"。如果您这样做,它们将被覆盖,这将不起作用。
另请参阅相关的 github 问题