如果我导入带有我自己的构建目标的自定义目标,为什么不会调用 C# 预构建和后构建事件?

问题描述 投票:0回答:1

如果我导入带有我自己的构建目标的自定义目标,为什么不会调用 C# 预构建和后构建事件?

我有一个 C# 项目文件,我通过导入自己的自定义目标文件对其进行了修改。在目标内部,我定义了一个“构建”目标,当我从 Visual Studio IDE 或 MSBUILD 命令行进行构建时将调用该目标。

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <Target Name="Build"> 
        <Message Text="Custom Build started" Importance="high"/>
    </Target>
</Project>

如果我从 Visual Studio IDE 或 MSBUILD 命令行进行构建,则会调用自定义目标文件中的“构建”目标。但是,导入我自己的自定义目标文件后,不会调用项目文件中配置的预构建和构建后事件。

如果有人能建议我必须在目标文件中进行什么样的更改,以便在从目标文件调用“Build”目标之前调用预构建事件,以及在“Build”之后调用构建后事件,那就太好了“目标。

c# visual-studio msbuild msbuild-task
1个回答
0
投票

您的自定义

Build
目标将覆盖项目系统提供的
Build
目标。

截至撰写本答案时,项目系统

Build
定义如下:

  <!--
    ============================================================
                                        Build

    The main build entry point.
    ============================================================
    -->
  <PropertyGroup>
    <BuildDependsOn>
      BeforeBuild;
      CoreBuild;
      AfterBuild
    </BuildDependsOn>
  </PropertyGroup>

  <Target
      Name="Build"
      Condition=" '$(_InvalidConfigurationWarning)' != 'true' "
      DependsOnTargets="$(BuildDependsOn)"
      Returns="@(TargetPathWithTargetPlatformMoniker)" />

CoreBuild
目标的定义是将
PreBuildEvent
PostBuildEvent
目标引入到目标链中。

截至撰写本答案时,

CoreBuild
的定义如下:

  <!--
    ============================================================
                                        CoreBuild

    The core build step calls each of the build targets.
    ============================================================
    -->
  <PropertyGroup>
    <CoreBuildDependsOn>
      BuildOnlySettings;
      PrepareForBuild;
      PreBuildEvent;
      ResolveReferences;
      PrepareResources;
      ResolveKeySource;
      Compile;
      ExportWindowsMDFile;
      UnmanagedUnregistration;
      GenerateSerializationAssemblies;
      CreateSatelliteAssemblies;
      GenerateManifests;
      GetTargetPath;
      PrepareForRun;
      UnmanagedRegistration;
      IncrementalClean;
      PostBuildEvent
    </CoreBuildDependsOn>
  </PropertyGroup>

  <Target
      Name="CoreBuild"
      DependsOnTargets="$(CoreBuildDependsOn)">

    <OnError ExecuteTargets="_TimeStampAfterCompile;PostBuildEvent" Condition="'$(RunPostBuildEvent)'=='Always' or '$(RunPostBuildEvent)'=='OnOutputUpdated'"/>
    <OnError ExecuteTargets="_CleanRecordFileWrites"/>

  </Target>

因为您覆盖了

Build
并且您的覆盖没有
DependsOnTargets="$(BuildDependsOn)"
,所以
CoreBuild
不在目标链中。那么因为
CoreBuild
不在目标链中,所以它的依赖项,包括
PreBuildEvent
PostBuildEvent
都不在目标链中。

如果您实际需要的是一个实际上并未构建的“实用”项目,请参阅 “Microsoft.Build.NoTargets”项目 SDK

© www.soinside.com 2019 - 2024. All rights reserved.