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

182

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

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

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

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

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

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

MAXP
источник

Ответы:

329

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

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

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

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

jmfenoll
источник
10
Английский перевод ссылки: translate.google.com/…
Csaba Toth
18
Примечание. Эта команда переустанавливает ссылки на все проекты, которые в данный момент открыты в Visual Studio, а не только на проект, выбранный в консоли.
simbolo
3
Эта команда переустанавливает пакеты в целом решении, а не только в выбранном проекте!
Алексей Сороколетов
14
Чрезвычайно Опасный !!!! Если процесс будет прерван, вы потеряете все ссылки на пакеты и должны будете добавлять их по одному в каждый проект в вашем решении.
Билл Веласкес
2
@BillVelasquez эта штука просто съела все мои ссылки. Ну, слава богу за мерзость, я думаю.
Глено
44

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

введите описание изображения здесь

Gan
источник
43
Это позволит NuGet повторно загрузить отсутствующие пакеты в каталог. \ Packages \, но не имеет ничего общего с восстановлением отсутствующих ссылок на проекты , о чем спрашивал автор.
Брант Бобби
13

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

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

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

  • построение решения с автоматическим восстановлением
  • открыв Консоль диспетчера пакетов и нажав приятную кнопку «Восстановить»
  • делать, nuget restoreесли у вас установлена ​​командная строка nuget

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

Обновить

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

Джон Хаттон
источник
1
Вы делаете очень важный пункт о восстановлении, только если пакеты находятся в папке пакета (что, конечно, может быть много мест). Однако закрытие и повторное открытие все еще не работало для меня даже с правильными версиями пакета, и мне пришлось вручную исправлять пути подсказок в каждом файле csproj. Я полагаю, что это вызвано перемещением папки пакета относительно проекта.
Шон
Редактирование .csprojфайла, чтобы убедиться, что номера версий соответствуют мне. Спасибо!
Матин Улхак,
11

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

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

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

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

Juri
источник
8

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

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
    }
}

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

Брант Бобби
источник
3

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

Марк Хорган
источник
Это самое простое решение. Это работает для меня, просто просматривая папку пакетов.
Хао Нгуен
2

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

Я должен был удалить «пакеты» -Folder вручную раньше. (Похоже, он заблокирован из-за контроля над источниками).

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

Ив
источник
2

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

Update-Package -Reinstall -ProjectName Proteus.Package.LinkedContent -IgnoreDependencies
Джереми
источник
1

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

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

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

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

McGaz
источник
1

Я должен согласиться с @Juri, что чрезвычайно популярный ответ jmfenoll не является полным. В случае неработающих ссылок я утверждаю, что большую часть времени вы не хотите обновляться до последней версии , а только исправляете ссылки на текущие версии, которые вы используете. И Юри предоставил удобную функцию 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
        }
    }
}
Майкл Соренс
источник
1

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

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

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

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

Francesco
источник
0

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

Я только что очистил кеш и перестроил и все заработало. (Tools-Option-Nuget Package Manager - Общие сведения)

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

Mamdouh
источник
0
  1. Скопируйте файл packages.config проекта и примените все изменения версии
  2. Удалите все пакеты и удалите зависимости

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

  4. Скопируйте файл модификации.config в корневую папку веб-сайта.

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

    $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
    }
    
Lluthus
источник