1

Мое решение настроен на «восстановление пакетов», но один из его проектов не удается построить: -Один NuGet пакет (SQLite Ядро) вызывает TFS сборки на провал

3>C:\Builds\1\xxxxx\xxxx.csproj(223,5): error : 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 ..\packages\System.Data.SQLite.Core.1.0.97.0\build\net45\System.Data.SQLite.Core.targets.

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

2>RestorePackages:

Restoring NuGet packages...

Ближе к концу файла .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) имеют свои пакеты, которые прекрасно восстанавливаются и успешно работают.

ответ

3

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

Куриные и яичные источники на память - пакеты еще не восстановлены, но шаг предварительной сборки проверяет наличие файла пакета!

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

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

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

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

Чтобы обойти эту проблему, я добавил x86 & x64 Interop библиотеки DLL для моего проекта, как это: -

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

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