Восстановление ссылок Nuget?

У меня есть решение и проект в Visual Studio 2012.

У проекта есть файл packages.config в корне проекта.

В целях этого вопроса давайте предположим, что я случайно удалил эти библиотеки из раздела References моего проекта.

При входе в диспетчер пакетов NuGet интерфейс по-прежнему сообщает о тике рядом с этими пакетами, указав, что они установлены.

Единственный способ, которым я могу понять, как исправить эту ситуацию, - удалить все записи из packages.config, которые исправят проблему интерфейса NuGet, сообщающую о них как установленную, и повторно добавят каждый из них.

Есть ли более разумный способ? Я надеялся, что включение "enable nuget для восстановления недостающих пакетов" решит это, но, похоже, ничего не делает.

Ответ 1

Попробуйте переустановить пакеты.

В консоли управления пакетами NuGet введите следующую команду:

Update-Package -Reinstall -ProjectName Your.Project.Name

Если вы хотите переустановить пакеты и восстановить ссылки для всего решения, опустите параметр -ProjectName.

Ответ 3

В случае, если это помогает кому-то, для меня ни один из вышеперечисленных не был достаточным. Я все еще не мог построить, VS все еще не мог найти ссылки. Ключ был просто закрыть и снова открыть решение после восстановления пакетов.

Здесь сценарий (с использованием Visual Studio 2012):

Вы открываете решение, в котором отсутствуют пакеты. Ссылки показывают, что VS не может их найти. Существует много способов для восстановления отсутствующих пакетов, в том числе

  • создание решения, настроенного на автоматическое восстановление
  • открытие консоли диспетчера пакетов и нажатие кнопки "Восстановить"
  • Выполнение nuget restore, если у вас установлена ​​nuget командной строки

Но независимо от того, какой подход, эти ссылки будут по-прежнему отображаться как отсутствующие. И когда вы его построите, это провалится. Вздох. Однако, если вы закрываете решение и снова открываете его, теперь VS снова проверяет эти красивые <HintPath>, обнаруживает, что пакеты вернулись туда, где они принадлежат, и все хорошо с миром.

Update

Разве Visual Studio все еще не видит, что у вас есть пакет? Все еще показываете ссылку, которую она не может решить? Убедитесь, что версия восстановленного пакета точно такая же, как <HintPath> в вашем файле .csproj. Даже небольшое количество исправлений ошибок (например, от 1.10.1 до 1.10.2) приведет к сбою ссылки. Вы можете исправить это либо путем прямого редактирования вашего csproj xml, либо путем удаления ссылки и создания новой, указывающей на недавно восстановленную версию в каталоге пакетов.

Ответ 4

Пока решение, предоставляемое @jmfenoll, работает, оно обновляет последние пакеты. В моем случае, установив beta2 (preerelease), он обновил все библиотеки до RC1 (у которого была ошибка). Таким образом, вышеупомянутое решение выполняет только половину задания.

Если вы находитесь в той же ситуации, что и я, и вы хотели бы синхронизировать свой проект с точной версией пакетов NuGet, которые у вас есть или указаны в вашем packages.config, тогда этот script может помочь вам, Просто скопируйте и вставьте его в консоль диспетчера пакетов.

function Sync-References([string]$PackageId) {
  get-project -all | %{
    $proj = $_ ;
    Write-Host $proj.name; 
    get-package -project $proj.name | ? { $_.id -match $PackageId } | % { 
      Write-Host $_.id; 
      uninstall-package -projectname $proj.name -id $_.id -version $_.version -RemoveDependencies -force ;
      install-package -projectname $proj.name -id $_.id -version $_.version
    }
  }
}

И затем запустите его либо с именем сибирского пакета, как

Sync-References AutoMapper

или для всех пакетов, таких как

Sync-References

Кредиты идут в Дэн Хейвуд и его сообщение в блоге.

Ответ 5

Следующий следующий script может быть запущен в окне консоли диспетчера пакетов и удалит все пакеты из каждого проекта в вашем решении, прежде чем переустанавливать их.

foreach ($project in Get-Project -All) { 
    $packages = Get-Package -ProjectName $project.ProjectName
    foreach ($package in $packages) {
        Uninstall-Package $package.Id -Force -ProjectName $project.ProjectName
    }
    foreach ($package in $packages) {
        Install-Package $package.Id -ProjectName $project.ProjectName -Version $package.Version
    }
}

Это снова запустит каждую установку пакета script, которая должна восстановить отсутствующие ссылки на сборку. К сожалению, все остальные вещи, которые могут выполнять скрипты установки - например, создание файлов и изменение конфигураций - также повторится. Вы, вероятно, захотите начать с чистой рабочей копии и использовать свой инструмент SCM, чтобы выбрать, какие изменения в вашем проекте сохранить и которые игнорировать.

Ответ 6

Я добавил библиотеки DLL вручную. Щелкните правой кнопкой мыши по ссылкам в проекте, выберите "Добавить ссылку", а затем в диалоговом окне нажмите кнопку "Обзор". Библиотеки NuGet, которые находятся в каталоге пакетов решения. Чтобы получить их имена, вы можете щелкнуть правой кнопкой мыши по ссылкам в другом проекте, который работает правильно, и выбрать свойства и посмотреть в свойстве пути.

Ответ 7

В Visual Studio 2015 (Soulution находится под контролем источника, MVC-Project), csano Update-Package -Reinstall -ProjectName Your.Project.Name работал, но он перепутался с некоторыми блокировками записи.

Мне пришлось сначала удалить "пакеты" -Folder. (Казалось, что он заблокирован из-за контроля источника).

Кроме того, мне пришлось переустановить MVC-пакет из диспетчера пакетов NuGet.

Ответ 8

На всякий случай это помогает кому-то. В моем сценарии у меня есть несколько разделяемых библиотек (у которых есть свои проекты/решения TFS), которые объединены в одно решение.

Nuget будет успешно восстанавливать проекты, но DLL будет отсутствовать.

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

Это может произойти при управлении пакетами на разных взаимосвязанных общих решениях - поскольку вы, вероятно, хотите убедиться, что все DLL файлы находятся на одном уровне, вы можете установить это на верхнем уровне. Это означает, что иногда он будет искать совершенно другое решение для связанной DLL-ссылки, поэтому, если у вас нет всех проектов/решений, загруженных и обновленных, вы можете получить вышеуказанную проблему.

Ответ 9

Этот script будет переустанавливать все пакеты проекта без использования зависимостей или установки зависимостей, которые могли быть удалены. (Больше для их разработчиков пакетов пакетов.)

Update-Package -Reinstall -ProjectName Proteus.Package.LinkedContent -IgnoreDependencies

Ответ 10

Я должен согласиться с @Juri, что очень популярный ответ jmfenoll не является полным. В случае неисправных ссылок я утверждаю, что большую часть времени, когда вы делаете не, хотите обновиться до последнего пакета, но только исправьте свои ссылки на текущие версии, которые вы используете. И Juri предоставил удобную функцию Sync-References, чтобы сделать именно это.

Но мы можем идти немного дальше, позволяя гибко фильтровать как по проекту, так и по пакету:

function Sync-References([string]$PackageId, [string]$ProjectName) {
    get-project -all | 
    Where-Object { $_.name -match $ProjectName } |
    ForEach-Object {
        $proj = $_ ;
        Write-Output ('Project: ' + $proj.name)
        Get-Package -project $proj.name |
        Where-Object { $_.id -match $PackageId } |
        ForEach-Object { 
            Write-Output ('Package: ' + $_.id)
            uninstall-package -projectname $proj.name -id $_.id -version $_.version -RemoveDependencies -force
            install-package -projectname $proj.name -id $_.id -version $_.version
        }
    }
}

Ответ 11

У меня была такая же проблема с отсутствующими ссылками. Ниже моего сценария:

  • Новая версия Windows 10 и VS Community 2015 устанавливают
  • Только что извлеченный код репозитория через TFS
  • Одно из решений, построенное просто отлично, одно решение имело один проект с отсутствующими ссылками (EF, System.Http, в качестве экземпляра), но относительные пакеты nuget были правильно установлены.

Все номера версий в проекте и пакетах совпадают, выполнение восстановления nuget (по-своему) не работает.

Как я его исправил: просто удалите папки пакета в корне решения и выполните восстановление nuget. На данный момент DLL правильно загружаются и могут быть добавлены для недостающих ссылок.

Ответ 12

  • Скопировать файл package.config проекта и применить все модификации версии
  • Уничтожить все пакеты и удалить настройки

    $packages = Get-Package -ProjectName [nameOfProjectToRestore]
    foreach ($package in $packages) {
        uninstall-package  -projectname [nameOfProjectToRestore] -id $package.Id -version $package.version -RemoveDependencies -force ;
    }
    
  • Очистить папку пакетов в корне проекта

  • Скопировать изменение package.config в корневую папку веб-сайта

  • Запустите этот код, чтобы восстановить проект

    $packages = Get-Package -ProjectName [nameOfProjectToRestore]
    foreach ($package in $packages) {
        uninstall-package  -projectname [nameOfProjectToRestore] -id $package.Id -version $package.version -RemoveDependencies -force ;
    }
    foreach ($package in $packages) {
        install-package  $package.Id -ProjectName [nameOfProjectToRestore] -Version $package.Version
    }
    

Ответ 13

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

Я просто очистил кэширование и перестроил, и это сработало. (Tools-Option-Nuget Package Manager - General)

также эта ссылка помогает https://docs.nuget.org/consume/package-restore/migrating-to-automatic-package-restore.