Відновлення Nuget References?


182

У мене є рішення та проект у Visual Studio 2012.

Проект має файл packages.configу корені проекту.

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

Під час заходу в менеджер пакунків NuGet інтерфейс все ще повідомляє галочку поруч із цими пакунками, вказуючи, що вони встановлені.

Єдиний спосіб я бачу, як виправити цю ситуацію, - це видалити всі записи з packages.config, які виправлять проблему інтерфейсу NuGet, звітуючи про них як про встановлені, і повторно додають кожен.

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

Відповіді:


329

Спробуйте перевстановити пакети .

У консолі менеджера пакунків NuGet введіть таку команду:

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

Якщо ви хочете перевстановити пакети та відновити посилання на все рішення, опустіть -ProjectNameпараметр.


10
Англійська переклад посилання: translate.google.com/…
Csaba Toth,

18
Примітка. Ця команда перевстановить посилання на всі проекти, які зараз відкриті у Visual Studio, а не лише на проект, вибраний у консолі.
simbolo

3
Ця команда перевстановить пакети в цілі рішення, а не лише у вибраному проекті!
Олексій Сороколетов

14
Надзвичайно небезпечно !!!! Якщо процес буде перервано, ви втратите всі посилання на свій пакет і вам доведеться додавати по одному до кожного проекту у своєму рішенні.
Білл Веласкес

2
@BillVelasquez ця річ просто з'їла всі мої згадки. Ну, слава богу за git, я думаю.
Глено

44

Потрібно ввімкнути відновлення пакету NuGet на рівні рішення VS для відновлення відсутнього пакета для роботи.

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


43
Це дозволить NuGet повторно завантажувати відсутні пакети в каталог. \ Пакети \, але не має нічого спільного з відновленням відсутніх посилань на проект , про що запитував плакат.
Brant Bobby

13

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

Ось сценарій (за допомогою Visual Studio 2012):

Ви відкриваєте рішення, у якому відсутні пакети. Посилання показують, що VS їх не може знайти. Існує багато способів відновити відсутні пакети, в тому числі

  • побудова рішення, яке встановлюється для автоматичного відновлення
  • відкрити консоль диспетчера пакунків та натиснути приємну кнопку "Відновити"
  • робити, nuget restoreякщо у вас встановлений нукет командного рядка

Але незалежно від підходу, ці посилання все одно будуть відображатися як відсутні. І коли ви будуєте, це не вдасться. Зітхнути. Однак якщо ви закриєте рішення та повторно відкриєте його, тепер VS перевіряє ці приємні <HintPath>файли знову, виявляє, що пакунки повертаються туди, де вони належать, і все добре зі світом.

Оновлення

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


1
Ви маєте дуже важливий момент відновлення, тільки якщо пакети знаходяться в папці пакунків (що, звичайно, може бути в багатьох місцях). Однак закриття та повторне відкриття все ще не працювало для мене навіть при правильних версіях пакету, мені довелося вручну змінювати шляхи підказки у кожному файлі csproj. Я вважаю, що це викликано переміщенням папки пакунків відносно проекту.
Шон

Редагування .csprojфайлу, щоб переконатися, що відповідні номери версій працювали для мене. Дякую!
Mateen Ulhaq

11

Хоча рішення, яке надає @jmfenoll, працює, оновляється до останніх пакетів. У моєму випадку, встановивши бета2 (попередній випуск), він оновив усі файли до RC1 (у якому була помилка). Таким чином, вищевказане рішення виконує лише половину роботи.

Якщо ви перебуваєте в тій же ситуації, що і я, і ви хочете синхронізувати ваш проект із точною версією пакетів NuGet, які ви / або вказали у вашому packages.config, тоді цей скрипт може вам допомогти. Просто скопіюйте та вставте його в консоль Package Manager

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

Кредити йдуть на Ден Хейвуд та його допис у блозі .


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 вручну. Клацнувши правою кнопкою миші на Посилання в проекті, виберіть Додати довідку, а потім у діалоговому вікні натиснув кнопку Огляд. DLL-файли NuGet, де знаходиться в каталозі пакунків рішення. Щоб отримати їхні імена, ви можете клацнути правою кнопкою миші посилання в іншому проекті, який працює належним чином, і вибрати властивості та подивитися у властивості шляху.


Це найпростіше рішення. Це працює для мене, просто переглядаючи папку пакунків.
Хао Нгуен

2

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

Мені раніше довелося видалити папки-пакети вручну. (Здавалося, його заблокували через контроль джерела).

Крім того, мені довелося перевстановити MVC-пакет від NuGet Package Manager.


2

Цей скрипт переустановить усі пакети проекту, не змішуючи залежностей і не встановлюючи залежностей, які, можливо, були видалені інтенсивно. (Більше для розробників їхніх частин.)

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

1

Про всяк випадок, коли це комусь допомагає. У моєму сценарії у мене є декілька спільних бібліотек (у яких є власні проекти / рішення TFS), об'єднані в одне рішення.

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

Основна проблема полягала в тому, що, хоча ваше рішення має власну папку пакунків і правильно відновило їх до цієї папки, файл проекту (наприклад, .csproj) посилається на інший проект, який, можливо, не завантажив пакет. Відкрийте файл у текстовому редакторі, щоб побачити, звідки беруться ваші посилання.

Це може статися під час керування пакетами на різних взаємопов’язаних спільних рішеннях - оскільки ви, мабуть, хочете переконатися, що всі DLL-файли знаходяться на одному рівні, ви можете встановити це на найвищому рівні. Це означає, що іноді він буде шукати зовсім інше рішення для посилається на DLL, і тому якщо у вас не завантажені та оновлені всі проекти / рішення, то ви можете отримати вищевказану проблему.


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, як приклад), але відносні пакунки нута були встановлені належним чином.

Всі номери версій у проекті та пакунках збігаються, але відновлення нута (усіма способами) не спрацювало.

Як я це виправив: просто видаліть папки пакунків у корені рішення та виконайте відновлення нугів. У цей момент файли коректно завантажуються і можуть бути додані для відсутніх посилань.


0

Я надто сильно постраждав від цього питання, у моєму випадку було перевірено завантаження відсутніх NuGet (але це не відновлення), і я не можу видалити та перевстановити, тому що я змінив деякі встановлені пакети ... так:

Я просто очистив кешований і відновити, і він спрацював. (Менеджер пакетів інструментів Option-Nuget - Загальний)

також це посилання допомагає https://docs.nuget.org/consume/package-restore/migrating-to-automatic-package-restore .


0
  1. Скопіюйте файл Packa.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. Скопіюйте модифікований package.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
    }
    
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.