Сборки MSBuild clobbers в неоперативной сборке ReSharper - PullRequest
0 голосов
/ 18 февраля 2020

У меня есть пользовательская цель MSBuild с AfterTargets="Build", которая переписывает определенные ссылки на сборки для сборок в выходной папке сборки приложений net Framework. Цель состоит в том, чтобы развернуть это в моей компании, чтобы помочь решить проблемы с загрузкой сборок для сторонних пакетов, которые изменили закрытые ключи, которые они используют для подписи своих пакетов.

Я настроил это с помощью Input и Output для добавочного сборки как предложено здесь: https://www.jetbrains.com/help/resharper/Building_Solution.html#limitations

Все это прекрасно работает, когда есть фактическая сборка. Проблема в том, что при повторной сборке (без изменений) используется сборка ReSharper (для этого я использую Rider, но в Visual Studio то же самое). В этом случае сообщается, что в сборке ничего не происходит (как и следовало ожидать) с выводом сборки следующим образом:

Build with surface heuristics started at 16:10:40
Use build tool: C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\MSBuild\Current\Bin\MSBuild.exe
CONSOLE: Microsoft (R) Build Engine version 16.0.461+g6ff56ef63c for .NET Framework
CONSOLE: Copyright (C) Microsoft Corporation. All rights reserved.
CONSOLE: Build started 18/02/2020 16:10:40.
Build completed in 00:00:00.671
Build succeeded at 16:10:40

Даже при записи в журнал журнала MSBild уровня c уровня все Я получаю загрузку переменных среды, за которыми следует просто

Build succeeded.
0 Warning(s)
0 Error(s)

Time Elapsed 00:00:00.12 

Поскольку цель Build не запускается, моя пользовательская цель AfterTargets="Build" также не запускается, независимо от того, изменились ли ее входные данные ( все как положено).

Однако msbuild изменяет dll в выходном каталоге.

например,

  • Первая сборка: приложение ссылается на пакет Foo, и Foo.dll копируется в выходной каталог во время сборки. Моя цель запускает и обновляет ссылки на сборки в Foo.dll. Все хорошо.
  • Вторая сборка без изменений: все журналы показывают, что ничего не происходит, но Foo.dll копируется из моего глобального кеша NuGet в мою выходную папку сборки, что приводит к засорению изменений, которые были внесены в него моим пользовательским target.

Я использовал procmon, чтобы убедиться, что это экземпляр msbuild, запущенный resharper, который делает это. Экземпляр msbuild вызывается для фиктивного файла проекта в AppData \ Local \ Temp \ 8 \, который выглядит следующим образом:

<Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003'>
<UsingTask AssemblyFile='C:\Program Files\JetBrains\Rider 2019.3.1\lib\ReSharperHost\JetBrains.Platform.MsBuildTask.v15.dll' TaskName='JetBrains.Platform.MsBuildTask.ControllerTask' />
<Target Name='ControllerTaskTarget'>
<ControllerTask PortValue='64263' BuildToolVersion='15.9' LoggerPath='' />
</Target>
</Project>

Я понятия не имею, что это такое. Изменение моей пользовательской цели на использование AfterTargets="ControllerTaskTarget" по-прежнему ничего не дает. Так как я не вижу здесь других целей, запускаемых msbuild, у меня нет ничего, к чему можно привязать свою пользовательскую цель для достижения желаемого поведения.

Есть идеи, что я могу сделать здесь?

Некоторые опции, которые я уже исследовал:

  • Использование входов и выходов инкрементной сборки в моей цели, как рекомендовано - не стартер, так как в первую очередь нет целей, поэтому моя цель никогда не запускается.
  • Обновление временных меток dll, когда я их редактирую, чтобы они выглядели так, как будто они не были отредактированы. Это работает немного - если это dll из ссылки на проект, то этот «дурак» реширится, полагая, что он не изменился, зависимость не перестраивается, и dll снова не копируется, поэтому я могу сохранить свой отредактировал один. Это не работает для DLL из ссылок на пакеты, хотя. MSBuild, похоже, использует «ChangeTime» в файле вместо «LastWriteTime» для поиска изменений, которые, насколько я вижу, я не могу обновить при работе от имени обычного пользователя.
  • Отключение сборки ReSharper. Работает нормально, но мы не получаем сборку ReSharper ... Не для начала, так как многие разработчики в компании используют сборку ReSharper и любят / нуждаются в ее преимуществах.
  • Ticking "Задачи Invoke BeforeBuild и AfterBuild для пропущенных проектов »в опциях сборки ReSharper. Это работает, но это действительно последнее средство - многие разработчики создают огромные решения и заставляют их выполнять работу (которая не обязательно является единственной целью) для каждого пропущенного проекта в каждой сборке, вряд ли будет приемлемым рабочим процессом.
...