Автоматическое восстановление Nuget для веб-сайта

Я пытаюсь перенести все свои проекты C# в новое автоматическое восстановление Nuget, следуя этому руководству: Миграция решений, интегрированных с MSBuild, для использования автоматического восстановления пакетов

Я успешно сделал это для своих проектов рабочего стола/библиотек, которые мне пришлось редактировать файлы .csproj, удалив из него эти строки (я не использую TFS):

<RestorePackages>true</RestorePackages>  
...
<Import Project="$(SolutionDir)\.nuget\nuget.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('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />
</Target>

Однако на веб-сайтах, похоже, нет .csproj или любого другого файла, содержащего эти инструкции. Когда я устанавливаю пакет, он успешно помещает .dll в папку моих пакетов, но также помещается в папку bin. Если я выберу .dll в разделе /bin в обозревателе решений, он будет иметь следующие свойства:

Auto-refresh path: C:\mypackages\Newtonsoft.Json.6.0.8\lib\net45\Newtonsoft.Json.dll
File Name: Newtonsoft.Json.dll
Full Path: C:\MyWebSite\Bin\Newtonsoft.Json.dll

Это установлено по умолчанию, когда я впервые устанавливаю пакет из nuget. Я думаю, что он не должен заглядывать в папку bin, или когда я создаю проект, он должен переносить .dll в папку bin, если он не существует. Проблема в том, что если я создаю проект без .dll в корзине, это дает мне следующую ошибку: «Тип или имя пространства имен« Newtonsoft »не удалось найти (вам не хватает директивы использования или ссылки на сборку?)». Для проектов рабочего стола/библиотек .dll копируется в папку bin.

Я прочитал в другом вопросе, что Nuget не поддерживает веб-сайт, а вместо этого поддерживает веб-приложения: Восстановление пакета NuGet для веб-сайта, но я также прочитал на странице Nuget, что они добавили совместимость с веб-сайтами ASP.NET, поэтому вот мой вопрос: я делаю что-то не так? Или мне следует перейти на веб-приложение, потому что оно вообще не поддерживает веб-сайты?


person thiagossi    schedule 22.04.2015    source источник
comment
WAP, безусловно, путь. Веб-сайты гораздо более ограничены и на самом деле не имеют много преимуществ, если вы используете VS. Обратите внимание, что с выпуском ASP.NET 5 он будет сочетать в себе лучшее из обоих миров. Однако в прошлом я использовал NuGet с веб-сайтами.   -  person mason    schedule 22.04.2015


Ответы (4)


У меня также есть такая же проблема, описанная в предыдущем вопросе. Мне было интересно, выяснили ли вы, как выполнить восстановление nuget на веб-сайте без файла проекта. У меня есть package.config на сайте.

Я пробовал кучу разных вещей, и следующая команда приблизила меня к разрешению, но не совсем.

nuget restore packages.config -PackagesDirectory ..\packages

Приведенная выше команда восстанавливает пакеты в папку ..\packages, как и ожидалось, но я не могу понять, как поместить правильные сборки в папку bin веб-сайта.

person Dennis Fazekas    schedule 17.12.2016
comment
Не кажется возможным это сделать. Я потратил полдня, пытаясь заставить его работать, но безуспешно. - person dcp; 20.04.2018
comment
используйте файл .refresh - person CodeDreamer68; 15.01.2019

Когда вы нажимаете «Включить восстановление пакета NuGet» в контекстном меню правой кнопки мыши в решении в Visual Studio, вы получаете отображаемое информационное сообщение, в котором говорится:

Пакеты, установленные в проекты веб-сайта, не будут восстановлены во время сборки. Рассмотрите возможность преобразования их в проекты веб-приложений.

Однако есть обходной путь, который я пробовал, который работает. Рассмотрим ситуацию, когда у вас есть проект библиотеки классов (DLL), на который ссылается проект веб-сайта. Если оба проекта ссылаются на один и тот же пакет NuGet, то при построении всего решения сначала создается проект DLL, пакеты восстанавливаются правильно. Следующий шаг, когда дело доходит до проекта веб-сайта, требуемый пакет уже установлен, а его библиотеки DLL скопированы в папку /Website/Bin/ в соответствии с файлом *.refresh. Результат - сборка решения завершена успешно.

person Alexei Matrosov    schedule 23.04.2015

Я могу с уверенностью подтвердить, что функция автоматического восстановления NuGet действительно работает для проектов веб-сайтов в VS с последней версией NuGet.

Убедись в том, что:

  1. Вы используете NuGet 2.7 или выше (Инструменты > Расширения и обновления > Обновления).
  2. В корне решения нет файла .nuget\NuGet.targets.
  3. У вас есть packages.config в корневом каталоге веб-сайта со всеми ссылками на пакеты (обычно генерируются VS при добавлении пакетов NuGet).
  4. Visual Studio настроен на «Разрешить NuGet загружать отсутствующие пакеты» и «Автоматически проверять наличие отсутствующих пакетов во время сборки» в Visual Studio (см. «Параметры» > «Диспетчер пакетов NuGet»). включены по умолчанию

Вот что я вижу в выводе сборки, когда отсутствует какой-либо пакет для проекта Веб-сайт.

Restoring NuGet packages...
To prevent NuGet from restoring packages during build, open the Visual Studio Options dialog, click on the Package Manager node and uncheck 'Allow NuGet to download missing packages during build.'
------ Build started: Project: WebSite1, Configuration: Debug Any CPU ------
Validating Web Site
Building directory '/'.

Validation Complete
========== Build: 1 succeeded or up-to-date, 0 failed, 0 skipped ==========

Ссылка, подробно описывающая вышеизложенное: https://docs.nuget.org/consume/package-restore .

person Eugene D. Gubenkov    schedule 24.05.2015
comment
Я вижу, что пакет восстанавливается, но сценарии не добавляются повторно в реальный каталог веб-сайта. Вы видите, что они снова добавляются? - person GotDibbs; 31.03.2016
comment
@GodDibbs, какие сценарии вы имеете в виду? - person Eugene D. Gubenkov; 31.03.2016
comment
Извините, только что понял, что был недостаточно универсален :). Например, если вы устанавливаете пакет nuget реакции на проект веб-сайта, то удалите файлы и папку пакетов, затем попытайтесь восстановить, папка пакетов будет заполнена заново, а папка сценариев на веб-сайте - нет. - person GotDibbs; 31.03.2016
comment
@GotDibbs, это может быть что-то с этим конкретным пакетом - мне нужно попробовать. Это точно работало для обычных сборок .NET с пакетами NuGet (например, Newtonsoft.Json). - person Eugene D. Gubenkov; 01.04.2016
comment
@GotDibbs, правильно, в вашем конкретном случае скрипты не будут скопированы, если вы его удалите. Однако похоже, что это не имеет ничего общего с веб-сайтами. Это то, как NuGet работает для таких пакетов содержимого — такое же поведение будет для проектов веб-приложений. Причина, по которой это работает по-разному для сборок, заключается в том, что файлы .refresh создаются для ссылок DLL, что заставляет msbuild копировать их из местоположения с помощью пакетов NuGet. Обходной путь для вас может быть фиктивным проектом с событием сборки для копирования необходимых файлов из пакетов. VS позаботится о том, чтобы у вас всегда была актуальная информация. - person Eugene D. Gubenkov; 01.04.2016
comment
Спасибо за очень подробный ответ!! - person GotDibbs; 01.04.2016

Вот решение этой проблемы, и оно действительно работает.

Если у вас есть отдельный уровень бизнес-логики, вы можете установить пакеты nuget в этот проект. Затем вы можете выполнить восстановление nuget на уровне бизнес-логики перед выполнением msbuild в решении веб-сайта. При выполнении msbuild для решения, которое содержит BLL и веб-сайт, все сборки, на которые есть ссылки (включая восстановленные библиотеки nuget), будут извлечены из проекта BLL в папку bin веб-сайта.

Вот вариант взлома, если у вас нет отдельного уровня бизнес-логики. Использование NuGet с файлами *.dll.refresh в проектах веб-сайтов ASP.NET с проектами веб-развертывания

person Dennis Fazekas    schedule 23.04.2017