использовать события пост-сборки с установленным Fody.Costura

После того, как я добавил Fody.Costura в свой проект, мое событие post build, копировавшее полученную сборку в другое место, начало давать сбой с сообщением об отказе в доступе. Это имеет смысл, поскольку Costura использует MSBuild для встраивания сборок. Есть ли способ принудительно выполнить мои пост-сборки после того, как Costura завершит работу? Пример команды пост-сборки:

copy /Y "$(TargetPath)" "%ALLUSERSPROFILE%\Autodesk\Revit\Addins\2019\HOK-Addin.bundle\Contents"

person konrad    schedule 02.10.2018    source источник
comment
Маловероятно, что причиной этой проблемы является Фоди. Временно отключите установленный антивирусный продукт и повторите попытку. Документируйте, что вы используете.   -  person Hans Passant    schedule 08.10.2018
comment
На самом деле, мне удалось это исправить, выполнив пользовательский Target и используя процедуру Copy. Я просто убедился, что установил свой AfterTargets на AfterBuild;NonWinFodyTarget, и это помогло. До этого я использовал только стандартное событие после сборки, которое должно было выполняться до того, как Fody завершил свою работу, а файлы все еще были заблокированы.   -  person konrad    schedule 09.10.2018
comment
Задача сборки «Копировать» намного умнее, она будет повторять попытку копирования при отказе в доступе. Вы не первый программист, у которого проблемы с защитой от вредоносных программ. Пожалуйста, задокументируйте, что вы используете, такие вопросы не перестанут приходить, пока мы не узнаем, что хорошо, а чего следует избегать.   -  person Hans Passant    schedule 09.10.2018
comment
Мне любопытно, почему вы думаете, что это вызвано антивирусным программным обеспечением. Команды после сборки работали нормально до того, как я добавил Fody. Проблема заключается в заблокированном / запрещенном доступе к файлу, вероятно, потому, что Fody использует его при запуске команды. Я согласен с тем, что Задачи намного лучше, но я сомневаюсь, что здесь задействовано антивирусное ПО. Не хочешь объяснить, что думаешь по этому поводу?   -  person konrad    schedule 09.10.2018


Ответы (1)


По сути, решение моего собственного вопроса следующее.

  <Target Name="CopyFiles" AfterTargets="AfterBuild;NonWinFodyTarget">
    <Message Text="Signing file..." Importance="high" />
    <Exec Command="&quot;C:\Program Files (x86)\Windows Kits\10\bin\10.0.17134.0\x64\signtool.exe&quot; sign /c &quot;Code Signing - DTM&quot; /v &quot;$(TargetPath)&quot;" />
    <Message Text="Copy files..." Importance="high" />
    <Message Text="$(TargetPath) &gt; $(ALLUSERSPROFILE)\Autodesk\Revit\Addins\$(Configuration)\HOK-Addin.bundle\Contents" Importance="high" />
    <Message Text="$(TargetDir)$(TargetName).addin &gt; $(ALLUSERSPROFILE)\Autodesk\Revit\Addins\$(Configuration)" Importance="high" />
    <Copy SourceFiles="$(TargetPath)" DestinationFolder="$(ALLUSERSPROFILE)\Autodesk\Revit\Addins\$(Configuration)\HOK-Addin.bundle\Contents" ContinueOnError="true" />
    <Copy SourceFiles="$(TargetDir)$(TargetName).addin" DestinationFolder="$(ALLUSERSPROFILE)\Autodesk\Revit\Addins\$(Configuration)" ContinueOnError="true" />
  </Target>

Что я сделал, так это заменил стандартную команду Post Build Command, которая запускает процедуры командной строки, на MSBuild Target и Task. Предоставление ей флагов для запуска после завершения сборки и завершения слияния сборок Fody решает мою проблему.

Также помогает тот факт, что Tasks имеют флаги типа ContinueOnError="true", которые позволяют задаче продолжать попытки до тех пор, пока файл не станет доступным (если это была проблема), в отличие от утилит командной строки, которые просто не работают.

Ваше здоровье!

person konrad    schedule 09.10.2018