MSBuild导入自定义目标

时间:2017-05-11 01:55:48

标签: c# msbuild csproj

我有一个具有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.WebApp\Config\%(RecursiveDir)%(Filename)%(Extension)')" />
    <Copy SourceFiles="@(OutputSatellites)" DestinationFiles="@(OutputSatellites->'$(SolutionDir)Test.WebApp\Config\%(RecursiveDir)%(Filename)%(Extension)')" />
  </Target>
</Project>

将上面的Target文件导入到解决方案中的每个csproj中。

1 个答案:

答案 0 :(得分:1)

Microsoft.Common.targets项目将目标“ AfterBuild”和“ BeforeBuild”覆盖。如果未明确包含该项目,则会自动将其添加为标题和尾部。

以这种方式迁移到新的csproj格式的项目(以及具有新的csproj格式的新项目)不能以这种方式指定“ BeforeBuild”和“ AfterBuild”目标。

相反,建议您使用BeforeTargetsAfterTargets属性来注册您的自定义“ PreBuild”和“ PostBuild”目标,如下所示:

<Target Name="DefinitelyNotBeforeBuild" BeforeTargets="PreBuildEvent">
  <!-- BeforeBuild goes here -->
</Target>
<Target Name="DefinitelyNotAfterBuild" AfterTargets="PostBuildEvent">
  <!-- AfterBuild goes here -->
</Target>

确保将这些目标命名为“ BeforeBuild”和“ AfterBuild”。如果这样做,它们将被覆盖,并且将无法正常工作。

另请参阅相关的github issue

相关问题