Двоичные файлы, скопированные в неправильную папку при сборке
Недавний 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 есть какая-то причина, почему они не хотят, чтобы вы использовали более новую цель копирования вместо старой сломанной.