Двоичные файлы, скопированные в неправильную папку при сборке

Недавний libgit2sharp Nuget использует новую функцию Nuget, которая позволяет вам включить часть скрипта сборки в ваш NuGet. Цель состоит в том, чтобы скопировать нативный DLL в подпапку папки bin, например:

    <ItemGroup>
    <None Include="$(MSBuildThisFileDirectory)\..\..\lib\net40\NativeBinaries\amd64\git2-e0902fb.dll">
        <Link>NativeBinaries\amd64\git2-e0902fb.dll</Link>
        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>...

Теперь все было красиво и красиво локально, но когда я развернул его в AppHarbor, в папке /bin (в дополнение к целевой подпапке) появились нативные dll, что привело к сбою моего приложения.

Проблема заключается в _CopyWebApplicationLegacy target, который не выполняется локально (он запускается, только если у вас выходной каталог не по умолчанию), поэтому у меня нет этой проблемы на моем компьютере разработчика. А именно, он выполняет следующий фрагмент кода:

<!-- Copy items that have been marked to be copied to the bin folder -->
<Copy SourceFiles="@(_SourceItemsToCopyToOutputDirectory)" 
      DestinationFolder="$(WebProjectOutputDir)\bin" 
      SkipUnchangedFiles="true" 
      Retries="$(CopyRetryCount)"
      RetryDelayMilliseconds="$(CopyRetryDelayMilliseconds)"/>

Вы можете видеть, что целевая папка всегда /bin - Я считаю, что это ошибка в файле Microsoft.WebApplication.targets (я не могу контролировать ее на целевой машине).

Есть ли простое исправление или я должен вернуться к сценарию в событии PostBuild (которое мне придется обновлять с каждой новой версией)?

1 ответ

Решение

Как упомянуто здесь: https://github.com/libgit2/libgit2sharp/issues/1089

то, как AppHarbor строит ваш проект, он запускает старый _CopyWebApplicationLegacy цель, и это в основном сломано. Он портит все файлы, использующие свойство Copy to Output Directory, помещая их непосредственно в выходной каталог, вместо того, чтобы соблюдать относительную структуру папок. Он также не запускает никаких преобразований web.config, которые у вас могут быть.

Вы можете сделать свой проект более новым _CopyWebApplication цель вместо этого, добавив следующее в файл проекта:

<UseWPP_CopyWebApplication>True</UseWPP_CopyWebApplication>
<PipelineDependsOnBuild>False</PipelineDependsOnBuild>

В чем я не уверен, так это в том, что у AppHarbor есть какая-то причина, почему они не хотят, чтобы вы использовали более новую цель копирования вместо старой сломанной.

Другие вопросы по тегам