【问题标题】:Target BeforeBuild doesn't work in csprojTarget BeforeBuild 在 csproj 中不起作用
【发布时间】:2017-06-20 03:18:18
【问题描述】:

我正在尝试在 .csproj (vs2017) 中使用目标事件“BeforeBuild”,但它不起作用。有人会知道出了什么问题:

<Project DefaultTargets="BeforeBuild" Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp1.1</TargetFramework>
  </PropertyGroup>

  <Target Name="BeforeBuild">
    <Message Text="Test123"></Message>
  </Target>
</Project>

预期结果是一条消息:Test123 on output。

[]s

【问题讨论】:

    标签: c# visual-studio msbuild


    【解决方案1】:

    BeforeBuild 在 csproj 中不起作用

    那是因为 csproj 中的Before/AfterTarget 被 SDK 目标文件覆盖

    如果您在 Project 元素上使用新的 Sdk 属性,则无法在默认的 .targets 导入之后放置目标定义。这可能导致人们放入项目文件中的目标意外无法运行,除非您检查日志文件并看到目标已被覆盖的消息,否则无法说明原因。

    dsplaisted 已为此问题提交了Microsoft/msbuild#1680。作为一种解决方法,您可以执行以下操作:

      <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>netcoreapp1.1</TargetFramework>
        <PreBuildEvent />
    
      </PropertyGroup>
      <Import Project="Sdk.props" Sdk="Microsoft.NET.Sdk" />
      <Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk" />
    
      <Target Name="BeforeBuild">
        <Message Text="Test123"></Message>
      </Target>
    

    或者:

      <Target Name="test" BeforeTargets="Build">
        <Message Text="Test123" />
      </Target>
    

    【讨论】:

    • 请注意,在大多数情况下,应该在 BeforeTargets="BeforeBuild" 之前或在 CoreBuild 之前在编译步骤之前实际运行,因为 Build 目标仅取决于其他几个目标..(但不适用于外部项目上的交叉定位项目)
    【解决方案2】:

    来自official docs

    警告

    请务必使用与中列出的预定义目标不同的名称 上一节中的表格(例如,我们将自定义命名为 在此处构建目标CustomAfterBuild不是AfterBuild),因为那些 预定义的目标被 SDK 导入覆盖,它还定义了 他们。您看不到覆盖那些目标文件的导入 目标,但它被隐式添加到项目文件的末尾 当你使用 SDK 属性方法引用 SDK 时。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-24
      • 2021-08-21
      相关资源
      最近更新 更多