NuGet Package Restore ไม่ทำงาน


165

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

http://docs.nuget.org/docs/workflows/using-nuget-without-committing-packages

ฉันทำตามคำแนะนำเหล่านั้นตอนนี้มี.nugetโฟลเดอร์ที่ควรมีรายการต่อไปนี้ในไฟล์. csproj ของฉัน:

<RestorePackages>true</RestorePackages>
<Import Project="$(SolutionDir)\.nuget\nuget.targets" />

และเมื่อฉันสร้างโซลูชันของฉันใหม่แพ็คเกจที่หายไปจะไม่ถูกกู้คืน

ฉันพลาดอะไรไป ฉันจะวินิจฉัยปัญหานี้ได้อย่างไร


คุณเห็น nuget.exe ถูกทริกเกอร์ในบันทึกผลลัพธ์หรือไม่
ปราณเนา

และที่สำคัญคุณเห็นข้อผิดพลาดในบันทึกข้อมูลขาออกหรือไม่
maartenba

คำตอบ:


272

หมายเหตุคุณสามารถบังคับให้แพคเกจการกู้คืนเพื่อดำเนินการโดยการเรียกใช้คำสั่งต่อไปนี้ในคอนโซลผู้จัดการแพคเกจ

ปรับปรุงแพคเกจ - ติดตั้งใหม่

บังคับให้ติดตั้งใหม่ทุกอย่างในโซลูชัน


ปรับปรุงแพคเกจ - ติดตั้งใหม่ - ชื่อโครงการ myProj

บังคับให้ติดตั้งใหม่ทุกอย่างในโครงการ myProj

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

คุณสามารถใช้-safeตัวเลือกพารามิเตอร์ commandline เพื่อ จำกัด การอัปเกรดเป็นเวอร์ชันที่ใหม่กว่าด้วยคอมโพเนนต์รุ่น Major และ Minor ตัวเลือกนี้ถูกเพิ่มเข้ามาในภายหลังและแก้ไขปัญหาบางอย่างที่กล่าวถึงในความคิดเห็น

อัพเดต - แพ็คเกจ - ติดตั้งใหม่ - ปลอดภัย


7
@ NightOwl888 ที่ดูเหมือนสิ่งที่ต้องการรายงานให้กับนักเก็ตเนื่องจากไม่มีวิธีที่จะทำเช่นนั้นได้เว้นแต่คุณจะมีปัญหาในการเชื่อมโยงกับ DLL และโชคดีที่มันทำงาน แต่การติดตั้งมันทำให้คุณโชคดี
Chris Marisic

4
@ nightowl หากคุณใช้การควบคุมแหล่งที่มามันไม่น่าจะยากที่จะสำรองการเปลี่ยนแปลงออกมา
ErikE

4
ข้อสังเกตหลักที่นี่คือเวอร์ชันของแพ็กเกจไม่ได้รับการบำรุงรักษาดังนั้นเวอร์ชันแพ็กเกจล่าสุดจะถูกติดตั้ง นี้อาจจะมีปัญหาถ้าโครงการของคุณไม่ได้เข้ากันได้กับรุ่นใหม่ ..
JDandChips

4
ใช่แพ็คเกจอัพเดต - ติดตั้งใหม่ใช้งานได้สำหรับฉัน ฉันไม่รู้ว่าทำไม IDE ไม่ทำเช่นนั้น ทุกอย่างถูกตั้งค่าอย่างถูกต้อง ใช่ฉันสาบาน NuGet ทั้งดีและน่ารำคาญ
Jeremy Ray Brown

2
ยินดีที่คุณเพิ่ม "สำคัญ! สิ่งนี้สามารถทำลายโครงการของคุณ" ที่ด้านล่างของคำตอบของคุณ!
devman

25

สำหรับคนอื่น ๆ ที่สะดุดเข้าสู่โพสต์นี้อ่านนี้

NuGet 2.7+ แนะนำเราในการแพคเกจอัตโนมัติ Restore นี่ถือเป็นวิธีที่ดีกว่ามากสำหรับแอปพลิเคชันส่วนใหญ่เนื่องจากไม่ได้ยุ่งเกี่ยวกับกระบวนการ MSBuild ปวดหัวน้อย

ลิงก์บางอย่างเพื่อให้คุณเริ่มต้น:


2
ขอบคุณสำหรับคำตอบที่เหมาะสมกับ NuGet รุ่นปัจจุบัน
Eric J.

20

คุณต้องเลือกวิธีหนึ่งดังต่อไปนี้:

การติดตั้งแพ็กเกจใหม่โดยใช้ชื่อในโครงการของโซลูชันทั้งหมด:

Update-Package –reinstall <packageName>

การติดตั้งแพ็กเกจใหม่โดยใช้ชื่อและไม่สนใจการพึ่งพาในโครงการของโซลูชันทั้งหมด:

Update-Package –reinstall <packageName> -ignoreDependencies

การติดตั้งแพคเกจใหม่โดยชื่อในโครงการ:

Update-Package –reinstall <packageName> <projectName>

การติดตั้งแพคเกจทั้งหมดซ้ำในโครงการเฉพาะ:

Update-Package -reinstall -ProjectName <projectName>

การติดตั้งแพ็กเกจทั้งหมดใหม่ในโซลูชัน:

Update-Package -reinstall 

แก้ไขปัญหาสไตล์ของฉันอย่างรวดเร็วและสกปรก
blackorchid

20

คุณเปิดใช้งานโหมดการคืนแพคเกจในโครงการที่ไม่มีแพ็คเกจ / ไบนารีหรือไม่ มีปัญหาที่ทราบที่ต้องมีการติดตั้งแพคเกจอย่างถูกต้องเมื่อเปิดใช้งานโหมดการคืนค่า:

http://nuget.codeplex.com/workitem/1879


ลิงค์เดิมตาย นี่อาจเป็นการทดแทน: https://github.com/NuGet/Home/issues/1968


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

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

90
NuGet ทำให้ฉันล้มเหลวทุกวันฉันดูถูกอย่างเต็มที่
Jammer

14

VS 2017

เครื่องมือ> ตัวจัดการแพ็คเกจ NuGet> การตั้งค่าตัวจัดการแพคเกจ> ทั่วไปคลิกที่ "ล้างทั้งหมด NuGet แคช"


เมื่อตรวจสอบวิธีการแก้ปัญหานอกการควบคุมแหล่งที่มา (จัดการโดยใช้ Visual Studio Team Explorer ที่มี DevOps / Git) ไม่สามารถสร้างได้เนื่องจากการอ้างอิงที่ขาดหายไปและแพคเกจการกู้คืนไม่ได้ทำอะไรเลย วิธีนี้เป็นวิธีที่ถูกต้องสำหรับสถานการณ์นี้
PJRobot

12

ฉันพบปัญหานี้ในสองสถานการณ์

ก่อนอื่นเมื่อฉันพยายามสร้างโซลูชันจากบรรทัดคำสั่งโดยใช้ msbuild.exe ประการที่สองเมื่อฉันพยายามสร้าง sln และโครงการที่มีอยู่บน build ของฉันโดยใช้ TFS และ CI

ฉันได้รับข้อผิดพลาดที่อ้างว่ามีการอ้างอิงหายไป เมื่อตรวจสอบทั้งไดเรกทอรีในเครื่องของฉันและเซิร์ฟเวอร์ TFS ฉันเห็นว่าโฟลเดอร์ / packages ไม่ได้ถูกสร้างขึ้นและแพ็คเกจ nuget จะไม่ถูกคัดลอก ทำตามคำแนะนำที่ระบุไว้ในคำตอบของ Alexandre http://nuget.codeplex.com/workitem/1879ยังไม่ได้ผลสำหรับฉัน

ฉันได้เปิดใช้งานการคืนค่าแพคเกจผ่าน VS2010 และฉันได้เห็นงานสร้างจากภายใน VS2010 อีกครั้งการใช้ msbuild ล้มเหลววิธีแก้ปัญหาของฉันอาจไม่ถูกต้องทั้งหมด แต่สำหรับสภาพแวดล้อมของฉันสิ่งนี้ได้ทุกอย่างทำงานจากการสร้างบรรทัดคำสั่งภายในเครื่องและจาก CI build ใน TFS

ฉันเข้าสู่ \ nuget และเปลี่ยนบรรทัดนี้ในไฟล์. nuget \ NuGet.targets:

จาก:

<RestoreCommand>$(NuGetCommand) install "$(PackagesConfig)" -source "$(PackageSources)" -o "$(PackagesDir)"</RestoreCommand>

ถึง: (โปรดสังเกตโดยไม่ต้องใส่เครื่องหมายคำพูดล้อมรอบตัวแปร)

<RestoreCommand>$(NuGetCommand) install $(PackagesConfig) -source $(PackageSources) -o $(PackagesDir)</RestoreCommand>

ฉันเข้าใจว่าถ้าไดเรกทอรีของฉันมีช่องว่างในแฟ้มสิ่งนี้จะล้มเหลว แต่ฉันไม่มีช่องว่างในไดเรกทอรีของฉันและวิธีแก้ปัญหานี้ทำให้งานสร้างของฉันเสร็จสมบูรณ์ ... ในขณะนี้

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


ฉันมีปัญหากับเครื่องหมายคำพูดคู่และต้องแก้ไขแบบเดียวกับที่คุณทำ น่าผิดหวังมาก!
เกร็ก

5

หากมีสิ่งอื่นไม่ทำงานให้ลอง:

  1. ปิดโครงการ
  2. ลบโฟลเดอร์แพ็คเกจในโฟลเดอร์โซลูชันของคุณ
  3. เปิดโครงการอีกครั้งและเรียกคืนแพคเกจนักเก็ตอีกครั้ง

ทำงานให้ฉันและลองง่าย


2
สิ่งนี้ใช้ได้สำหรับฉัน ในขั้นตอนที่ 3 ฉันไม่จำเป็นต้องเรียกคืนแพ็คเกจด้วยตนเอง - พวกเขาจะกู้คืนโดยอัตโนมัติเมื่อฉันเปิดโครงการ
Tawab Wakil

5

หากไม่มีคำตอบอื่นใดที่เหมาะกับคุณลองทำสิ่งต่อไปนี้ซึ่งเป็นสิ่งเดียวที่ใช้ได้กับฉัน:

ค้นหา.csprojไฟล์ของคุณและแก้ไขในโปรแกรมแก้ไขข้อความ

ค้นหา<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">แท็กใน.csprojไฟล์ของคุณและลบทั้งบล็อก

ติดตั้งแพ็กเกจทั้งหมดใหม่ในโซลูชัน:

Update-Package -reinstall

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


สิ่งนี้ช่วยฉันจากการไม่กินถั่วอย่างสมบูรณ์ ขอบคุณ!
Jeff Hay

4

สำหรับคนอื่น ๆ ที่อาจพบปัญหานี้ฉันสามารถแก้ไขปัญหาได้โดยการปิด Visual Studio และเปิดโครงการอีกครั้ง เมื่อโปรเจ็กต์ถูกโหลดแพ็กเกจจะถูกกู้คืนระหว่างเฟสการกำหนดค่าเริ่มต้น


4

สำหรับฉันฉันมีแท็กเปล่า NuGetPackageImportStamp ใน. csproj

<NuGetPackageImportStamp>
    </NuGetPackageImportStamp>

มันควรจะมี GUID ที่ถูกต้อง

การลบแท็กดังกล่าวข้างต้นจากนั้น "คืนค่านักเก็ต" ใช้งานได้สำหรับฉัน


1

บางครั้งมีสิ่งผิดปกติเกิดขึ้นและการใช้ Visual Studio เพื่อกู้คืนอัตโนมัติไม่ทำงาน ในกรณีดังกล่าวคุณสามารถใช้ NuGet Package Manager Console ที่จะเปิดภายใน Visual Studio จากเครื่องมือ -> NuGet แพคเกจ Manager -> แพ็กเกจคอนโซลการจัดการ คำสั่งภายในคอนโซลนั้นง่าย และเพื่อรับความช่วยเหลือด้านบริบทขณะพิมพ์คำสั่งเพียงแค่กดปุ่มและมันจะให้ตัวเลือกทั้งหมดที่เริ่มต้นด้วยตัวอักษรที่คุณกำลังพิมพ์ ดังนั้นหากไม่ได้ติดตั้งแพ็คเกจตัวอย่างเช่น log4net ให้พิมพ์คำสั่งต่อไปนี้:

Install-Package log4net

คุณสามารถทำสิ่งต่าง ๆ ได้มากมายเช่นระบุรุ่นที่จะติดตั้งอัพเดตแพ็คเกจถอนการติดตั้งแพ็คเกจ ฯลฯ

ฉันต้องใช้คอนโซลเพื่อช่วยฉันเมื่อ Visual Studio ทำตัวเหมือนแปลก ๆ


1

การคืนค่าแพ็คเกจอัตโนมัติจะล้มเหลวด้วยเหตุผลใด ๆ ต่อไปนี้:

  1. คุณไม่ได้ลบไฟล์ NuGet.exe และ NuGet.targets ออกจากโฟลเดอร์. snuget ของโซลูชัน (ซึ่งสามารถพบได้ในโฟลเดอร์รูทโซลูชัน)
  2. คุณไม่ได้เปิดใช้งานการคืนค่าแพคเกจอัตโนมัติจากเครื่องมือ >> ตัวเลือก >> Nuget Package Manager >> การตั้งค่าทั่วไป
  3. คุณลืมลบการอ้างอิงในโครงการทั้งหมดของคุณไปยังไฟล์ Nuget.targets ด้วยตนเอง
  4. คุณต้องรีสตาร์ท Visual Studio (ตรวจสอบให้แน่ใจว่ากระบวนการถูกฆ่าจากตัวจัดการงานของคุณก่อนเริ่มต้นอีกครั้ง)

บทความต่อไปนี้แสดงรายละเอียดเพิ่มเติมเกี่ยวกับวิธีไปที่จุด 1-3: https://docs.nuget.org/consume/package-restore/migrating-to-automatic-package-restore


1
เกี่ยวกับจุด # 1 ของคุณลิงก์ที่คุณให้คำแนะนำของคุณขัดแย้ง: "ถ้าคุณใช้ TFS 1. ลบไฟล์ NuGet.exe และ NuGet.targets จากโฟลเดอร์. snuget ของโซลูชัน 2. เก็บไฟล์ NuGet.Config เพื่อข้ามต่อไป การเพิ่มแพ็คเกจลงในแหล่งควบคุม "
Andrew Dennison

1

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


1

วิธีแก้ปัญหาที่ดีที่สุดที่ฉันพบการสร้างโครงการใหม่ตั้งแต่เริ่มต้นจากนั้นนำเข้าไฟล์ต้นฉบับทั้งหมดด้วยรหัส โครงการของฉันไม่ซับซ้อนดังนั้นฉันจึงไม่มีปัญหา


1

ไม่มีวิธีแก้ปัญหาอื่นที่ทำงานในสถานการณ์ของฉัน:

การติดตั้ง / ถอนการติดตั้ง AspNetCore และถูกเก็บไว้ในแคช 'AspNetCore.All' จะปฏิเสธที่จะอัปเดต / ติดตั้ง / ลบอย่างถูกต้อง และไม่คำนึงถึงสิ่งที่ฉันทำมันจะใช้การอ้างอิงแคช (ซึ่งไม่เข้ากันกับ) เนื่องจากเป็นเวอร์ชั่นที่สูงกว่า

  1. สำรองข้อมูลทุกอย่าง บันทึกรายการการอ้างอิงที่คุณจะต้องติดตั้งใหม่ออกจาก VisualStudio
  2. เปิดไฟล์. proj ทั้งหมดในเท็กซ์เอดิเตอร์และลบทั้งหมด PackageReference
  3. ในแต่ละโครงการให้ลบbin, objโฟลเดอร์
  4. ลบโฟลเดอร์ "แพ็คเกจ" ที่คุณพบในโซลูชัน
  5. เปิดวิธีการแก้ปัญหาไปลงและTools > Nuget Package Manager > Package Manager Settings Clear all Nuget cachesตรวจสอบคอนโซลเนื่องจากอาจไม่สามารถลบบางรายการ - คัดลอกเส้นทางโฟลเดอร์และออกจาก visual studio
  6. ลบสิ่งใด ๆ จากโฟลเดอร์นั้นเปิดโซลูชันอีกครั้งและเริ่มการติดตั้งแพคเกจ nuget อีกครั้งตั้งแต่เริ่มต้น

หากยังไม่ได้ผลให้ทำซ้ำ แต่ยังค้นหาไดรฟ์ของคุณใน windows explorer เพื่อค้นหาnugetและลบสิ่งที่มองหา cachey


0

vs2015 ไม่มีปัญหาการเปิดใช้งานการคืนค่า nuget ทางออกของฉัน:

  1. เพิ่มโฟลเดอร์. nuget เพิ่มไฟล์ NuGet.Config และ NuGet.targets ในไดเรกทอรี. nuget

  2. แต่ละไฟล์โครงการเพิ่ม: build

  <RestorePackages>true</RestorePackages>

  <Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(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>

นี่เป็นวิธีเก่าแก่ของการทำมัน ดู @davenewza คำตอบและลิงก์ไปยังblog.davidebbo.com/2014/01/…
timB33

0

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

ฉันเห็นว่ามี 2 NUGET Package Sources ซึ่งสามารถดาวน์โหลดแพ็คเกจได้ (ภายในเครื่องมือ -> Nuget Package Manager-> การตั้งค่าตัวจัดการแพคเกจ) หนึ่งในแหล่งที่มาของแพคเกจไม่ทำงานและ Nuget พยายามดาวน์โหลดจากแหล่งนั้นเท่านั้น

สิ่งต่าง ๆ เกิดขึ้นเมื่อฉันเปลี่ยนแหล่งแพ็คเกจเพื่อดาวน์โหลดจาก: https://www.nuget.org/api/v2/อธิบายอย่างชัดเจนในการตั้งค่า


0

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


0

มีช็อตคัตที่จะทำให้การคืนค่า Nuget ทำงานได้ 1. ตรวจสอบให้แน่ใจว่าการเชื่อมต่ออินเทอร์เน็ตหรือ URL ของนักเก็ตนั้นเหมาะสมในเมนูตัวเลือก VS Tools 2. ดูที่โฟลเดอร์. nuget หรือ nuget ในการแก้ปัญหาอื่น - คัดลอกจากที่ใด ๆ

  1. ลบโฟลเดอร์แพ็คเกจหากมีอยู่

  2. เปิดคอนโซลตัวจัดการแพคเกจดำเนินการคำสั่งนี้

    • วางเส้นทางแบบเต็มของ nuget.exe เรียกคืนเส้นทางแบบเต็มของไฟล์. sln!
  3. ใช้คำสั่ง Install-pacakge หากบิลด์ไม่ผ่านสำหรับการอ้างอิงที่ขาดหายไป หวังว่าจะช่วย (HIH)

0

ใน VS2017 คลิกขวาที่โซลูชัน => เปิด CommandLine => บรรทัดคำสั่งของนักพัฒนา

เมื่อเปิดแล้วให้พิมพ์ (และกด Enter หลังจาก)

dotnet restore

ที่จะกู้คืนแพ็กเกจใด ๆ / ทั้งหมดและคุณจะได้รับเอาต์พุตคอนโซลที่ยอดเยี่ยมจากสิ่งที่ทำ ...

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