【问题标题】:Overwrite targets post build event of another targets file覆盖另一个目标文件的构建事件后的目标
【发布时间】:2020-04-29 15:10:47
【问题描述】:

我有一个 NuGet 包,它为我的 C# 项目添加了一个目标文件,其中包含用于构建后事件的内容。

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <Target Name="ThisIsMyTarget" AfterTargets="Build">
        <Exec Command="ThisIsMyCommand.exe"/>
    </Target>
</Project>

在不到 1% 的项目中,我不需要这个命令,我需要另一个命令来执行。目标文件是否可以将目标从另一个目标文件中挂起?

类似这样的:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <Target Name="ThisIsMyRareTarget" Overwrite="ThisIsMyTarget" AfterTargets="Build">
        <Exec Command="ThisIsMyRareCommand.exe"/>
    </Target>
</Project>

我不想只为项目的 1% 拆分我的 NuGet 包。

【问题讨论】:

  • 您应该能够在每个项目中添加这两个目标,然后使用仅在您罕见的 1% 项目中定义的属性来设置每个目标的 Condition 属性。
  • 嗨 DangerSchwob,这个问题有更新吗?
  • 嗨佩里,你的概念听起来很有趣,但我还有其他一些条件,这使得它变得困难。我正在检查是否可以使用您想法的修改版本。

标签: visual-studio msbuild target overwrite post-build-event


【解决方案1】:

所有功劳归于@Perry Quan-MSFT。他有正确的概念。

我创建了 2 个目标文件/NuGet 包。

使用此目标文件的标准包。

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <Target Name="ThisIsMyTarget" AfterTargets="Build" Condition="'$(DontUseStandardCommand)'!='true'">
        <Exec Command="ThisIsMyCommand.exe"/>
    </Target>
</Project>

罕见案例目标文件如下所示。

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <Target Name="ThisIsMyRareTarget" AfterTargets="Build">
        <Exec Command="ThisIsMyRareCommand.exe"/>
    </Target>
    <PropertyGroup>
        <DontUseStandardCommand>true</DontUseStandardCommand>
    </PropertyGroup>
</Project>

这在我的设置中工作正常,也独立于项目文件中导入目标文件的顺序。

【讨论】:

    【解决方案2】:

    覆盖另一个目标文件的构建事件后目标

    其实,如果你想在nuget包中使用多个目标文件,然后根据需要在不同的目标文件之间切换,你是得不到你想要的。

    正如this document所说,当你想通过nuget将目标文件添加到项目中时,你应该确保目标文件的名称与nuget包的名称相同,这样才能正常工作。

    所以你只能使用一个名为&lt;package_id&gt;.targets的目标文件,并在其中设置一个condidtion来区分使用哪个项目环境。

    解决方案

    1)请把这些都放在你的&lt;package_id&gt;.targets文件中:

    <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
        <PropertyGroup>
            <Flag></Flag>
        </PropertyGroup>
        <Target Name="ThisIsMyTarget" AfterTargets="Build" Condition="'$(Flag)'!='true'">
            <Exec Command="ThisIsMyCommand.exe"/>
        </Target>
        <Target Name="ThisIsMyRareTarget" AfterTargets="Build" Condition="'$(Flag)'=='true'">
            <Exec Command="ThisIsMyRareCommand.exe"/>
        </Target>
    </Project>
    

    2) 然后你打包你的 nuget 项目,当你在其他项目中安装你的 nuget 时(不到 1% 的项目),你应该定义属性 标记到true 文件末尾的true,如下所示:

    并且只有不到 1% 的项目可以使用ThisIsMyRareTarget.exe。在其他 99% 的项目中,您不应该在 xxx.csproj 中定义 Flag 属性,它会自动捕获 ThisIsMyCommand.exe

    【讨论】:

      猜你喜欢
      • 2010-12-24
      • 1970-01-01
      • 1970-01-01
      • 2017-08-15
      • 2018-04-21
      • 2021-08-20
      • 1970-01-01
      • 2012-06-15
      • 2019-11-09
      相关资源
      最近更新 更多