Перезаписать цели после события сборки другого файла целей - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть пакет 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>

Я не хочу разбивать свой пакет NuGet только на 1% проекта.

Ответы [ 2 ]

1 голос
/ 04 мая 2020

Вся заслуга принадлежит @Perry Quian-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>

Это нормально работает в моей установке, также не зависит от порядка файлов назначения импорта в файле проекта.

0 голосов
/ 01 мая 2020

Перезаписать цели после события сборки другого файла цели

Фактически , если вы хотите использовать несколько файлов цели в пакет nuget, а затем переключаться между различными файлами цели в зависимости от ваших потребностей, вы не можете получить то, что хотите.

И, как сказал этот документ , когда вы хотите добавить целевой файл в проект с помощью nuget, вы должны убедиться, что имя целевого файла совпадает с именем пакета nuget, поэтому он будет работать.

Таким образом, вы можете использовать только один целевой файл с именем <package_id>.targets и установить в нем condidtion, чтобы отличить guish какую среду проекта использовать.

Решение

1) Пожалуйста, поместите все это в файл <package_id>.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, а когда вы устанавливаете его в другие проекты ( менее 1% проектов ), вы должны определить свойство Отметить до true в конце файла xxx.csproj, например thi s:

enter image description here

И менее 1% проектов могут использовать ThisIsMyRareTarget.exe. В других 99% проектах вам не следует определять свойство Flag в xxx.csproj, и оно автоматически c захватывает ThisIsMyCommand.exe.

...