การกู้คืนข้อมูลอ้างอิงของ Nuget


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.co.th/
Csaba Toth

18
หมายเหตุ: คำสั่งนี้จะติดตั้งการอ้างอิงในโครงการทั้งหมดที่เปิดอยู่ในปัจจุบันอีกครั้งใน Visual Studio แทนที่จะเป็นเพียงโครงการที่เลือกในคอนโซล
simbolo

3
คำสั่งนี้จะติดตั้งแพคเกจใหม่ในการแก้ปัญหาทั้งหมดไม่เพียง แต่ในโครงการที่เลือก!
Alex Sorokoletov

14
อันตรายมาก !!!! หากกระบวนการขัดจังหวะคุณจะสูญเสียการอ้างอิงแพคเกจทั้งหมดของคุณและจะต้องเพิ่มหนึ่งต่อหนึ่งให้กับทุกโครงการในโซลูชันของคุณ
Bill Velasquez

2
@BillVelasquez สิ่งนี้เพียงแค่กินการอ้างอิงของฉันทั้งหมด ขอบคุณพระเจ้าสำหรับคอมไพล์ฉันเดา
Gleno

44

คุณต้องเปิดใช้งานแพ็คเกจ NuGet ที่ระดับโซลูชัน VSเพื่อให้แพคเกจการกู้คืนที่หายไปทำงาน

ป้อนคำอธิบายรูปภาพที่นี่


43
สิ่งนี้จะช่วยให้ NuGet ดาวน์โหลดแพคเกจที่ขาดหายไปอีกครั้งลงในไดเรกทอรี. \ packages \ แต่ไม่มีส่วนเกี่ยวข้องกับการกู้คืนการอ้างอิงโครงการที่ขาดหายไปซึ่งเป็นสิ่งที่ผู้โพสต์ถาม
ตัวผู้บ๊อบบี้

13

ในกรณีนี้ช่วยใครบางคนสำหรับฉันไม่มีสิ่งใดที่กล่าวมาเพียงพอ ฉันยังสร้างไม่ได้ VS ยังหาข้ออ้างอิงไม่ได้ กุญแจสำคัญคือการปิดและเปิดโซลูชันอีกครั้งหลังจากกู้คืนแพ็คเกจ

นี่คือสถานการณ์ (ใช้ Visual Studio 2012):

คุณเปิดโซลูชันที่ไม่มีแพ็คเกจ การอ้างอิงแสดงว่า VS ไม่พบพวกเขา มีหลายวิธีในการกู้คืนแพ็คเกจที่หายไปซึ่งรวมถึง

  • การสร้างโซลูชันที่ตั้งค่าให้กู้คืนอัตโนมัติ
  • เปิด Package Manager Console และคลิกปุ่ม "คืนค่า" ที่ดี
  • ทำnuget restoreถ้าคุณมีการติดตั้ง nuget บรรทัดคำสั่ง

แต่ไม่ว่าจะใช้วิธีใดการอ้างอิงเหล่านั้นจะยังคงแสดงว่าหายไป และเมื่อคุณสร้างมันจะล้มเหลว ถอนหายใจ อย่างไรก็ตามหากคุณปิดโซลูชันและเปิดใหม่ตอนนี้ VS จะตรวจสอบสิ่งที่ดี<HintPath>อีกครั้งพบว่าแพ็คเกจดังกล่าวกลับมาอยู่ในที่ที่พวกเขาอยู่และทุกอย่างก็อยู่ในโลกนี้

ปรับปรุง

Visual Studio ยังไม่เห็นว่าคุณมีแพ็คเกจหรือไม่ ยังแสดงข้อมูลอ้างอิงว่าไม่สามารถแก้ไขได้ใช่ไหม ตรวจสอบให้แน่ใจว่าเวอร์ชันของแพคเกจที่คุณกู้คืนนั้นเหมือนกับ<HintPath>ในไฟล์. csproj ของคุณ แม้แต่หมายเลขแก้ไขข้อผิดพลาดเล็กน้อย (เช่น 1.10.1 ถึง 1.10.2) จะทำให้การอ้างอิงล้มเหลว คุณสามารถแก้ไขได้โดยแก้ไข csproj xml ของคุณโดยตรงหรืออื่น ๆ โดยการลบการอ้างอิงและทำการชี้ไปที่เวอร์ชันที่เพิ่งเรียกคืนในไดเร็กทอรีแพ็คเกจ


1
คุณทำประเด็นสำคัญมากเกี่ยวกับการคืนค่าเท่านั้นทำให้แน่ใจว่าแพ็คเกจอยู่ในโฟลเดอร์แพ็คเกจ (ซึ่งแน่นอนได้หลายแห่ง) อย่างไรก็ตามการปิดและเปิดใหม่ยังไม่ทำงานสำหรับฉันแม้ว่าจะมีแพ็คเกจที่ถูกต้องฉันก็ต้องแก้ไขเส้นทางคำใบ้ในแต่ละไฟล์ csproj ด้วยตนเอง ฉันเชื่อว่าสิ่งนี้เกิดจากการย้ายโฟลเดอร์แพ็คเกจเทียบกับโครงการ
Shaun

การแก้ไข.csprojไฟล์เพื่อให้แน่ใจว่าหมายเลขเวอร์ชันที่ตรงกันนั้นใช้ได้สำหรับฉัน ขอบคุณ!
Mateen Ulhaq

11

ในขณะที่โซลูชันที่ให้บริการโดย @jmfenoll นั้นจะปรับปรุงเป็นแพ็คเกจล่าสุด ในกรณีของฉันมีการติดตั้ง beta2 (ก่อนวางจำหน่าย) จะอัปเดต libs ทั้งหมดเป็น RC1 (ซึ่งมีข้อบกพร่อง) ดังนั้นวิธีการแก้ปัญหาข้างต้นทำงานเพียงครึ่งเดียว

หากคุณอยู่ในสถานการณ์เดียวกับฉันและคุณต้องการซิงโครไนซ์โครงการของคุณกับแพคเกจ NuGet รุ่นที่แน่นอนที่คุณมี / หรือระบุไว้ในของคุณpackages.configดังนั้นสคริปต์นี้อาจช่วยคุณได้ เพียงคัดลอกและวางลงใน Package Manager Console ของคุณ

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

และดำเนินการอย่างใดอย่างหนึ่งด้วยชื่อแพคเกจ sepific เช่น

Sync-References AutoMapper

หรือสำหรับแพ็คเกจทั้งหมดเช่น

Sync-References

เครดิตไปที่แดนเฮย์วูดและโพสต์บล็อกของเขา


8

สคริปต์ต่อไปนี้สามารถทำงานได้ในหน้าต่าง Package Manger Console และจะลบแพ็คเกจทั้งหมดออกจากแต่ละโครงการในโซลูชันของคุณก่อนติดตั้งใหม่

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

ฉันเพิ่ม DLLs ด้วยตนเอง คลิกขวาที่การอ้างอิงในโปรเจ็กต์เลือกเพิ่มการอ้างอิงจากนั้นในไดอะล็อกกดปุ่มเรียกดู NuGet DLLs ซึ่งอยู่ในไดเรกทอรีแพ็คเกจของโซลูชัน เพื่อให้ได้ชื่อของพวกเขาคุณสามารถคลิกขวาที่การอ้างอิงในโครงการอื่นที่ทำงานอย่างถูกต้องและเลือกคุณสมบัติและดูในคุณสมบัติเส้นทาง


นี่คือทางออกที่ง่ายที่สุด มันใช้งานได้สำหรับฉันเพียงแค่เรียกดูโฟลเดอร์แพ็คเกจ
Hao Nguyen

2

ใน Visual Studio 2015 (Soulution อยู่ภายใต้การควบคุมของแหล่งข้อมูล MVC-Project) ของ csano Update-Package -Reinstall -ProjectName Your.Project.Nameทำงานแต่มันเกิดความสับสนกับล็อคการเขียนบางส่วน

ฉันต้องลบ "แพ็คเกจ" - โฟลเดอร์ด้วยตนเองก่อน (ดูเหมือนว่าจะถูกล็อคเนื่องจากการควบคุมแหล่งที่มา)

นอกจากนี้ฉันต้องติดตั้ง MVC-Package จาก NuGet Package Manager อีกครั้ง


2

สคริปต์นี้จะติดตั้งแพคเกจทั้งหมดของโครงการใหม่โดยไม่ต้องยุ่งกับการพึ่งพาหรือติดตั้งการพึ่งพาที่อาจถูกลบออกโดยเจตนา (เพิ่มเติมสำหรับนักพัฒนาส่วนแพ็คเกจของพวกเขา)

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

1

ในกรณีที่มันช่วยใครบางคน - ในสถานการณ์ของฉันฉันมีไลบรารีที่แบ่งใช้ (ซึ่งมีโครงการ / โซลูชัน TFS ของตัวเอง) ทั้งหมดรวมกันเป็นโซลูชันเดียว

Nuget จะคืนค่าโครงการสำเร็จ แต่ DLL จะหายไป

ปัญหาพื้นฐานคือในขณะที่วิธีการแก้ปัญหาของคุณมีโฟลเดอร์แพคเกจของตัวเองและกู้คืนได้อย่างถูกต้องไปยังโฟลเดอร์นั้นไฟล์โครงการ (เช่น. csproj) กำลังอ้างอิงโครงการอื่นซึ่งอาจไม่มีแพ็คเกจดาวน์โหลด เปิดไฟล์ในเท็กซ์เอดิเตอร์เพื่อดูว่าการอ้างอิงของคุณมาจากที่ใด

สิ่งนี้อาจเกิดขึ้นได้เมื่อจัดการแพ็คเกจบนโซลูชันที่แชร์กันแบบเชื่อมโยงต่างกัน - เนื่องจากคุณอาจต้องการตรวจสอบให้แน่ใจว่า DLLs ทั้งหมดอยู่ในระดับเดียวกันคุณอาจตั้งค่านี้ไว้ที่ระดับบนสุด ซึ่งหมายความว่าบางครั้งมันจะมองหาทางออกที่แตกต่างอย่างสิ้นเชิงสำหรับ 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 เป็นต้น) แต่แพ็คเกจ nuget แบบสัมพัทธ์ได้รับการติดตั้งอย่างเหมาะสม

หมายเลขเวอร์ชันทั้งหมดในโปรเจ็กต์และแพ็กเกจตรงกันการทำการคืนค่า nuget (ในทุกวิธี) ไม่ทำงาน

ฉันจะแก้ไขได้อย่างไร:เพียงแค่ลบโฟลเดอร์แพ็กเกจในรูทโซลูชันและดำเนินการกู้คืน nuget ณ จุดนี้ dll ที่ดาวน์โหลดอย่างถูกต้องและสามารถเพิ่มสำหรับการอ้างอิงที่ขาดหายไป


0

ฉันได้รับความเดือดร้อนจากปัญหานี้มากเกินไปในกรณีของฉันการดาวน์โหลด NuGet ที่หายไปถูกตรวจสอบแล้ว (แต่มันไม่ได้ทำการกู้คืน) และฉันไม่สามารถถอนการติดตั้ง & ติดตั้งใหม่ได้เนื่องจากฉันแก้ไขแพ็คเกจที่ติดตั้งแล้ว ...

ฉันเพิ่งล้างแคชและสร้างใหม่และใช้งานได้ (เครื่องมือ - ตัวเลือก - ผู้จัดการแพคเกจ Nuget - ทั่วไป)

นอกจากนี้ยังมีการเชื่อมโยงนี้จะช่วยให้ https://docs.nuget.org/consume/package-restore/migrating-to-automatic-package-restore


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. คัดลอกการแก้ไข 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
    }
    
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.