Один пакет NuGet (SQLite Core) вызывает сбой сборки TFS

Мое решение настроено на «восстановление пакетов», но один из его проектов не может быть собран: -

3> C: \ Builds \ 1 \ xxxxx \ xxxx.csproj (223,5): ошибка: этот проект ссылается на пакеты NuGet, которые отсутствуют на этом компьютере. Включите восстановление пакета NuGet, чтобы загрузить их. Для получения дополнительной информации см. http://go.microsoft.com/fwlink/?LinkID=322105 < / а>. Отсутствует файл .. \ packages \ System.Data.SQLite.Core.1.0.97.0 \ build \ net45 \ System.Data.SQLite.Core.targets.

Это может быть отвлекающим маневром, но указанная выше ошибка появляется в журнале перед восстановлением пакета, т.е.

2> Восстановить пакеты:

Восстановление пакетов NuGet ...

Ближе к концу файла .csproj оскорбительного проекта находится этот раздел <Target>, который, похоже, генерирует указанную выше ошибку: -

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="$(SolutionDir)\.nuget\nuget.targets" />
<Import Project="..\packages\System.Data.SQLite.Core.1.0.97.0\build\net45\System.Data.SQLite.Core.targets" Condition="Exists('..\packages\System.Data.SQLite.Core.1.0.97.0\build\net45\System.Data.SQLite.Core.targets')" />

<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
  <PropertyGroup>
    <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
  </PropertyGroup>
  <Error Condition="!Exists('..\packages\System.Data.SQLite.Core.1.0.97.0\build\net45\System.Data.SQLite.Core.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\System.Data.SQLite.Core.1.0.97.0\build\net45\System.Data.SQLite.Core.targets'))" />
</Target>

В чем дело? И правильно ли я предполагаю, что эта проверка происходит до того, как пакеты решения были даже восстановлены (следовательно, почему она не работает)? Как это исправить?

Пакеты других проектов в решении (тех, которые не ссылаются на основной пакет SQLite) восстановлены и успешно построены.


person Andrew Stephens    schedule 18.06.2015    source источник


Ответы (2)


Я обнаружил, что это связано с подходом, который вы используете для восстановления отсутствующих пакетов NuGet во время сборки. Я использую хорошо известную опцию «Включить восстановление пакета NuGet» (щелкнув решение правой кнопкой мыши). Проблема в том, что рассматриваемый пакет NuGet ("System.Data.SQLite Core (x86 / x64)") добавляет этап предварительной сборки (предыдущий элемент), который проверяет, что этот пакет установил aa целевой файл сборки с именем System.Data.SQLite.Core.targets.

На ум приходят курица и яйцо - пакеты еще не восстановлены, но перед сборкой проверяется наличие файла пакета!

рекомендуемый подход для восстановления пакетов NuGet теперь кажется чтобы быть новой функцией «автоматического восстановления пакета». Насколько я понимаю, это восстанавливает пакеты NuGet до начала сборки, избегая вышеуказанной проблемы. К сожалению, эта функция не поддерживается TFS 2012. Существует обходной путь (подробно описан здесь), который включает в себя создание файла проекта msbuild в вашем решении, который отвечает за восстановление пакетов NuGet, прежде чем приступить к созданию решения, но это начинало казаться беспорядочным.

Для всех, кто интересуется (или знаком с SQLite.Net), вот что я сделал для решения своей проблемы: -

Я удалил пакет «System.Data.SQLite Core (x86 / x64)» и вместо него добавил пакет «System.Data.SQLite Core MSIL». Он содержит только управляемую System.Data.SQLite.dll сборку и не делает ничего умного с настраиваемыми целями сборки.

Эта сборка зависит от собственного SQLite.Interop.dll, но по какой-то странной причине предназначена для поиска во вложенной папке [bin] \ x86 или [bin] \ x64 (в зависимости от архитектуры). Эти DLL взаимодействия были частью исходного пакета, который я удалил; его цель сборки (которая вызвала мою проблему) отвечает за копирование библиотек DLL в эти подпапки.

Чтобы обойти это, я добавил в свой проект библиотеки взаимодействия x86 и x64, например: -

FooProject
  \x86
     SQLite.Interop.dll
  \x864
     SQLite.Interop.dll

Я убедился, что их Build Action был «Содержимое», затем изменил их Copy to Output Directory настройку на «Всегда копировать». Структура папок проекта сохраняется, когда файлы «Content» копируются в выходную папку, поэтому это удобный способ создания подпапок [bin] \ x86 и [bin] \ x64 и их соответствующих DLL.

person Andrew Stephens    schedule 19.06.2015

В моем случае я проверяю, что сообщение .csproj указывает, есть ли System.Data.SQLite.Core.targets файл, затем перезагружаю компьютер и перезапускаю визуальную студию, а затем добиваюсь успеха без ошибок.

person yu yang Jian    schedule 04.05.2019