ฉันจะให้ NuGet ติดตั้ง / อัพเดทแพ็คเกจทั้งหมดใน packages.config ได้อย่างไร


674

ฉันมีทางออกกับหลายโครงการในนั้น การอ้างอิงบุคคลที่สามส่วนใหญ่หายไป แต่มีpackages.configไฟล์สำหรับแต่ละโครงการ ฉันจะให้ NuGet ติดตั้ง / อัพเดทแพ็คเกจทั้งหมดที่จำเป็นได้อย่างไร สิ่งนี้จำเป็นต้องทำผ่านบรรทัดคำสั่งสำหรับแต่ละโครงการหรือไม่


10
โปรดพิจารณาการเปลี่ยนคำตอบที่ยอมรับเนื่องจาก NuGet ได้รวมเข้ากับ Visual Studio มากขึ้นและมีวิธีที่ง่ายกว่าในการแก้ปัญหานี้
skolima

2
ด้วยการเปิดตัว NuGet 2.5 ล่าสุดขณะนี้มีปุ่ม "อัปเดตทั้งหมด" ในตัวจัดการแพ็คเกจ: docs.nuget.org/docs/release-notes/…
Erik Schierboom

@ErikSchierboom ขอบคุณ! กระทู้นี้ควรได้รับการปรับปรุงเนื่องจากมีให้บริการแล้วในตอนนี้
Karl Cassar

โครงการที่เกี่ยวข้อง: chocolatey.org
Jayan

1
เพื่อประโยชน์ของผู้ค้นหาใน VS2013 คุณสามารถคลิกขวาที่โซลูชันและเลือก 'เปิดใช้งาน NuGet Package Restore' จากนั้นสร้าง
HockeyJ

คำตอบ:


870

คุณสามารถใช้nuget.exeเพื่อกู้คืนแพ็คเกจของคุณหรือด้วย NuGet 2.7 ขึ้นไปคุณสามารถรวบรวมโซลูชันของคุณใน Visual Studio ซึ่งจะคืนค่าแพ็คเกจที่ขาดหายไป

สำหรับ NuGet.exe คุณสามารถเรียกใช้คำสั่งต่อไปนี้สำหรับแต่ละโครงการ

nuget install packages.config

หรือด้วยNuGet 2.7 คุณสามารถกู้คืนแพ็คเกจทั้งหมดในโซลูชันโดยใช้บรรทัดคำสั่ง

nuget restore YourSolution.sln

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

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

หากต้องการอัปเดตแพ็คเกจทั้งหมดในโซลูชันของคุณก่อนอื่นให้กู้คืนแพ็กเกจจากนั้นคุณสามารถใช้ NuGet.exe เพื่ออัปเดตแพ็คเกจหรือจากภายใน Visual Studio คุณสามารถอัปเดตแพ็กเกจจากหน้าต่างคอนโซลตัวจัดการแพคเกจหรือสุดท้ายคุณสามารถใช้จัดการ กล่องโต้ตอบแพคเกจ

จากบรรทัดคำสั่งคุณสามารถอัพเดตแพ็คเกจในโซลูชันเป็นเวอร์ชันล่าสุดได้จาก nuget.org

nuget update YourSolution.sln

โปรดทราบว่านี่จะไม่เรียกใช้สคริปต์ PowerShell ในแพ็คเกจ NuGet ใด ๆ

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

Update-Package

นอกจากนี้คุณยังสามารถ จำกัด โครงการนี้ไม่เกินหนึ่งโครงการ

Update-Package -Project YourProjectName

หากคุณต้องการติดตั้งแพ็กเกจใหม่เป็นเวอร์ชันเดียวกับที่ติดตั้งไว้ก่อนหน้านี้คุณสามารถใช้-reinstallอาร์กิวเมนต์พร้อมUpdate-Packageคำสั่ง

Update-Package -reinstall

นอกจากนี้คุณยังสามารถ จำกัด โครงการนี้ไม่เกินหนึ่งโครงการ

Update-Package -reinstall -Project YourProjectName

-reinstallตัวเลือกที่จะถอนการติดตั้งครั้งแรกแล้วติดตั้งแพคเกจกลับมาอีกครั้งในโครงการ

หรือคุณสามารถอัพเดตแพ็คเกจโดยใช้Manage Packagesกล่องโต้ตอบ

ปรับปรุง:

  • 2013/07/10 - อัปเดตพร้อมข้อมูลเกี่ยวกับการคืนค่า nuget ใน NuGet 2.7
  • 2014/07/06 - อัปเดตด้วยข้อมูลเกี่ยวกับการคืนค่าแพคเกจอัตโนมัติใน Visual Studio และทำให้คำตอบล่าสุดพร้อมการเปลี่ยนแปลงอื่น ๆ กับ NuGet
  • 2014/11/21 - อัปเดตข้อมูลเกี่ยวกับ-reinstall

15
มีคำสั่งง่ายๆใน Visual Studio ที่จะทำเช่นนี้? ฉันเปิดใช้งานการกู้คืนอัตโนมัติเพื่อแก้ปัญหา แต่ "Build" ยังคงให้ข้อผิดพลาดมากมายกับฉันเนื่องจากการอ้างอิงที่ขาดหายไป (แพ็คเกจยังไม่ได้รับการกู้คืนจาก packages.config)
Borek Bernard

1
ผมไม่คิดอย่างนั้นไม่ต้องติดตั้งบางอย่างเช่นเครื่องมือ NuGet เพาเวอร์ - github.com/davidfowl/NuGetPowerTools อย่างไรก็ตามสิ่งนี้จะทำสิ่งเดียวกับการกู้คืนอัตโนมัติที่คุณมีอยู่แล้ว
แมตต์วอร์ด

2
นอกจากนี้ยังใช้งานได้กับการติดตั้งแพคเกจโดยทั่วไปไม่เพียง "คืนค่า" พวกเขา (ไม่มีความแตกต่างทางเทคนิคอย่างมากในการกู้คืนการติดตั้ง IS แต่ไม่ จำกัด เฉพาะผู้ที่ต้องการใช้คุณลักษณะการคืนค่าแพ็คเกจโซลูชัน) อย่างไรก็ตามคุณจำเป็นต้องตั้งค่าตัวแปรสภาพแวดล้อม EnableNuGetPackageRestore เพื่อจุดประสงค์นี้ ฉันตั้งค่าไว้ในสคริปต์ psake ของฉันก่อนเรียก "nuget install packages.config" ดังนี้: $ env: EnableNuGetPackageRestore = "true" สิ่งนี้ตั้งค่า var สำหรับกระบวนการ PS และกระบวนการที่วางไข่โดยไม่มีผลกับตัวแปรทั้งเครื่อง (และอาจเป็นบิลด์อื่น)
galaktor

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

3
ฉันต้องใช้เวลาอย่างน้อยหนึ่งชั่วโมงเพื่อหาทางแก้ปัญหาและในที่สุดมันก็เป็นของจริงUpdate-Package -reinstall -Project ProjectName
Wiz

529

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

Update-Package -Reinstall

ติดตั้งแพคเกจทั้งหมดใหม่ในโครงการเฉพาะของการแก้ปัญหาในปัจจุบัน ( ขอบคุณความไม่ธรรมดาและ ขี้เถ้า 999 ):

Update-Package -ProjectName 'YourProjectNameGoesHere' -Reinstall

60
ผมคิดว่านี่คือจริงๆสิ่งที่ OP ต้องการและวิธีที่ง่ายกว่าโซลูชั่นอื่น ๆ ทั้งหมด ...
jaminto

4
นี่เป็นตัวเลือก nuke หากคุณเพียงต้องการใช้งานได้ทันที
Chris

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

7
นี่ควรเป็นคำตอบสำหรับคำถามนี้คำตอบที่ได้รับการยอมรับนั้นใช้ได้ผล แต่นี่เป็นคำตอบที่เฉพาะเจาะจง +1 สำหรับสิ่งที่ต้องการ
krystan ให้เกียรติ

10
คุณอาจต้องการเพิ่มสวิตช์ -IgnoreDependencies ฉันเคยอัปเดตแพ็กเกจล้มเหลวเนื่องจากการพึ่งพาหนึ่งในแพ็กเกจที่ฉันใช้มีอยู่ในเวอร์ชันที่ใหม่กว่าที่ระบุไว้ใน packages.config ของฉัน
Mathias Falkenberg

167

มีอีกวิธีที่ใหม่กว่าและเร็วกว่าในการทำสิ่งนี้จากภายใน Visual Studio ลองอ่าน โพสต์นี้โดย David Ebbo และอ้างอิงหัวข้อความคิดเห็นหากคุณประสบปัญหา โดยทั่วไปคุณทำสิ่งต่อไปนี้ในพรอมต์ Manager Manager:

PM> Install-Package NuGetPowerTools
PM> Enable-PackageRestore

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

ปรับปรุง:

ฟังก์ชั่นนี้สร้างขึ้นในNuget 1.6พร้อมการรวม visual Studio ดังนั้นคุณไม่จำเป็นต้องติดตั้ง NuGetPowerTools หรือพิมพ์คำสั่ง สิ่งที่คุณต้องทำคือ

คลิกขวาที่โหนดโซลูชันใน Solution Explorer และเลือกเปิดใช้งานแพ็คเกจ NuGet

อ่านบทความนี้สำหรับรายละเอียดเพิ่มเติม


6
คำตอบที่ปรับปรุงแล้วที่นี่จะเป็นทางออกที่ดีที่สุดสำหรับคนส่วนใหญ่เนื่องจากไม่มี nuget.exe (แต่จะมี nuget ติดตั้งไว้ใน Visual Studio)
ทอดด์ทอมสัน

1
แต่แพคเกจการคืนค่าจริง ๆ แล้วดาวน์โหลด nuget.exe ให้คุณ
Konstantin

4
ฉันเพิ่งทำสิ่งนี้ และมันก็ยังล้มเหลวในการสร้างบอกว่าอ้างอิงหายไป Build บอกว่าแพคเกจทั้งหมดได้รับการติดตั้งแล้วฉันไปที่โฟลเดอร์ solution / packages ลบแพ็คเกจที่สงสัยแล้วทำการดาวน์โหลดและเริ่มทำงาน
Maslow

3
@Shy วิธีนี้เลิกใช้แล้วในความโปรดปรานของโซลูชันที่ไม่ได้แก้ไขไฟล์โครงการทั้งหมดของคุณ
มัฟฟินแมน

20

นี่คือวิธีแก้ไขปัญหาอื่นหากคุณใช้โครงการเว็บไซต์หรือไม่ต้องการเปิดใช้งานแพคเกจ NuGet

คุณสามารถใช้คอนโซลตัวจัดการแพคเกจเพื่อระบุแพคเกจทั้งหมดในไฟล์ package.config และติดตั้งใหม่

# read the packages.config file into an XML object
[xml]$packages = gc packages.config

# install each package 
$packages.packages.package | % { Install-Package -id $($_.id) -Version $($_.version) }

4
ฉันลองคำตอบแต่ละข้อด้านบนและไม่สามารถทำให้พวกเขาทำงานกับหนึ่งในวิธีแก้ปัญหาของฉัน แต่รูปแบบของอันนี้ก็เปลี่ยนไป $packages.packages.package | % { Update-Package -reinstall -id $($_.id) }
PerryJ

1
แพคเกจคืนค่า nuget เป็นฝันร้ายถ้าคุณใช้หลายวิธีใน csproj เดียวกัน ... ฉันปรบมือให้คำตอบนี้!
felickz

1
นี่ไม่ได้แก้ปัญหาของฉัน แต่มันทำให้ฉันรู้สึกดีขึ้น!
Devil's Advocate

นี่เป็นวิธีที่ยอดเยี่ยมและมีวิธีโยกย้ายแพ็คเกจไปยังโครงการใหม่: [xml] $ packages = gc c: \ PathToExisting \ packages.config #followed โดย # ติดตั้งแต่ละแพ็คเกจ $ packages.packages.package | % {ติดตั้งแพ็คเกจ - รหัส $ ($ _. id) - รุ่น $ (รุ่น $ _.)}
ตรวจสอบอีกครั้งใน

1
@PerryJ คุณสามารถพิมพ์Update-Package -Reinstallได้
BrainSlugs83

16
Update-Package -ProjectName 'YourProjectNameGoesHere' -Reinstall

นี่คือตัวอย่างที่ดีที่สุดและง่ายที่สุดที่ฉันพบ มันจะติดตั้ง nugets ทั้งหมดที่ระบุไว้ใน packages.config และมันจะรักษาเวอร์ชันปัจจุบัน แทนที่YourProjectNameGoesHereด้วยชื่อโครงการ


ฉันมีปัญหาบางอย่างเกี่ยวกับสิ่งนี้เพราะ packages.config ของฉันมีการอ้างอิงถึงสองแพคเกจที่มีรุ่นที่ระบุ แต่แพ็คเกจหนึ่งขึ้นอยู่กับอีกแพ็คเกจหนึ่งที่ไม่มีรุ่นเฉพาะ เมื่อฉันรันการอัปเดตก่อนอื่นก็จะถอนการติดตั้งแพ็กเกจทั้งหมดแล้วติดตั้งใหม่ไม่สำเร็จเนื่องจากการอ้างอิงที่ใหม่กว่าคือ 'อ้างอิงแล้ว' การลบทำงานได้ดีแม้ว่าตอนนี้แพ็คเกจของฉันจะว่างเปล่า ฉันต้องย้อนกลับ packages.config จากการควบคุมแหล่งที่มาและอัปเดตแพคเกจที่ขัดแย้งกันก่อนที่จะลองอัปเดตแบบเต็ม ...
Mathias Falkenberg

11

ด้วยการเปิดตัว NuGet 2.5 ล่าสุดขณะนี้มีปุ่ม "อัปเดตทั้งหมด" ในตัวจัดการแพ็คเกจ: http://docs.nuget.org/docs/release-notes/nuget-2.5#Update_All_button_to_allow_upages_all_packages_at_once


2
นอกจากนี้จาก Package Manager Console คุณสามารถเรียกใช้ "Update-Package" เพื่อทำแพ็กเกจทั้งหมดในโครงการของคุณ: nuget.codeplex.com/wikipage?title=Updating%20All%20Packages
kmp

7

ฉันใช้ visual studio 2015 และวิธีแก้ปัญหาที่กล่าวมาข้างต้นไม่ได้ผลสำหรับฉันดังนั้นฉันจึงทำสิ่งต่อไปนี้:

ลบโฟลเดอร์แพ็คเกจออกจากโซลูชันของฉันรวมถึงโฟลเดอร์ bin และ obj จากทุกโครงการในโซลูชันและให้สร้างใหม่

บางทีคุณอาจจะมีข้อผิดพลาดต่อไป:

ไม่สามารถค้นหา nuget.exe

เพื่อแก้ปัญหานี้: เปลี่ยนบรรทัดนี้ในไฟล์ NuGet.targets ของคุณและตั้งค่าเป็นจริง:

<DownloadNuGetExe Condition=" '$(DownloadNuGetExe)' == '' ">true</DownloadNuGetExe>

การอ้างอิง: https://stackoverflow.com/a/30918648และhttps://stackoverflow.com/a/20502049


4

หากคุณติดตั้ง Nuget 2.8 ให้เลือกช่องทำเครื่องหมาย

Tools >> Nuget Manager >> Package Manager Settings >> Automatically check for missing packages during build

ใน Visual Studio หากมีการตรวจสอบแล้วเพียงแค่สร้างโครงการใหม่จะคืนค่าไลบรารีอ้างอิงทั้งหมดของคุณ


ตัวเลือกที่สะดวกที่สุดจาก UI ของ Visual Studio คุณต้องตรวจสอบAllow NuGet to download missing packagesช่องทำเครื่องหมายเช่นกัน
RBT

4

หลังจาก 3 ชั่วโมงของการค้นหาและตรวจสอบ

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

หลังจากนั้นฉันมีปัญหาเดียวกับ PO ฉันก็ไม่สามารถเผยแพร่โครงการ API ของฉันไปยังเซิร์ฟเวอร์ได้

ที่และฉันเพิ่งใช้

อัพเดต - แพ็คเกจ - ติดตั้งใหม่ - รันคำสั่งนี้บน Package Manager Console

คำสั่งนี้จะติดตั้งแพ็กเกจทั้งหมดที่คุณใช้ในโซลูชันของคุณใหม่ (สำหรับทุกโครงการ)

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

ปรับปรุงแพคเกจ - ชื่อโครงการ 'NameOfProject' - ติดตั้งใหม่ - เรียกใช้คำสั่งนี้บนคอนโซลตัวจัดการแพคเกจ

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

ขอบคุณมากสำหรับการนี้เพื่อRodolpho บร็อค

นอกจากนี้ฉันขอแนะนำให้คุณเมื่อคุณดึงการเปลี่ยนแปลงจากเซิร์ฟเวอร์ระยะไกลเพื่อกดปุ่ม "เรียกคืนแพคเกจ" ที่จะแสดงโดย Visual Studio


3

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

แต่นั่นจะไม่ช่วยให้คุณไปถึงจุดนั้น - ฉันพบปัญหาที่คล้ายกันหลังจากเปิดใช้งานคุณลักษณะการคืนค่า (VS2013, NuGet 2.8.)

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

ปัญหาเกิดขึ้นเมื่อฉันสร้างสาขาที่วางจำหน่าย สำเนาของสาขา dev / main / trunk ในเครื่องของฉันมีไบนารีเพราะนั่นคือสิ่งที่ฉันได้ติดตั้ง / ดาวน์โหลดแพ็คเกจไว้ในตอนแรก
อย่างไรก็ตามในสาขารุ่นใหม่

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

ฉันลบโฟลเดอร์แพ็กเกจทั้งหมดใน$(SolutionDir)/packages(ใต้สาขารีลีส) จากนั้นรันการสร้างใหม่อย่างสมบูรณ์และในครั้งนี้การสร้างสำเร็จ
... และแน่นอนว่าฉันกลับไปและลบโฟลเดอร์แพ็คเกจออกจากแหล่งควบคุม (ในลำต้นและสาขาย่อย) ฉันยังไม่ชัดเจน (ยัง) ว่าrepositories.configควรลบไฟล์ด้วยหรือไม่

ส่วนประกอบหลายอย่างที่ติดตั้งให้คุณโดยเทมเพลตโครงการ - อย่างน้อยสำหรับโครงการเว็บ - เป็นแพ็คเกจ NuGet นั่นคือปัญหานี้ไม่ จำกัด เฉพาะแพ็คเกจที่คุณเพิ่ม
ดังนั้นเปิดใช้งานแพคเกจการคืนค่าทันทีหลังจากสร้างโครงการ / โซลูชันและก่อนที่คุณจะทำการเช็คอินครั้งแรกให้ล้างpackagesโฟลเดอร์ (และตรวจสอบให้แน่ใจว่าคุณยอมรับ.nugetโฟลเดอร์เพื่อควบคุมแหล่งที่มา)

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

ฉันยังทราบว่าUpdate-Package -reinstallจะแก้ไข.slnและ .csproj/ .vbprojไฟล์ อย่างน้อยนั่นก็เป็นสิ่งที่ทำในกรณีของฉัน IMHO ตัวไหนที่ทำให้ตัวเลือกนี้น่าสนใจน้อยกว่ามาก


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

3

ฉันพยายามUpdate-Package -reinstallแต่มันล้มเหลวในแพ็คเกจและหยุดการประมวลผลแพ็กเกจที่เหลืออยู่ทั้งหมดของโครงการในโซลูชัน

ฉันลงเอยด้วยสคริปต์ที่ระบุไฟล์ package.config ทั้งหมดและเรียกใช้Update-Package -Reinstall -ProjectName prj -Id pkgสำหรับแต่ละโครงการ / แพ็คเกจ

หวังว่ามันจะมีประโยชน์สำหรับใครบางคน:

$files = Get-ChildItem -Recurse -Include packages.config;

[array]$projectPackages = @();
$files | foreach { [xml]$packageFile = gc $_; $projectName = $_.Directory.Name; $packageFile.packages.package.id | foreach { $projectPackages += @( ,@( $projectName, $_ ) ) } }

$projectPackages | foreach { Update-Package -Reinstall -ProjectName $_[0] -Id $_[1] }

แก้ไข: นี่เป็นข้อผิดพลาดที่ฉันมี: อัปเดตแพ็คเกจ: ไม่พบแพ็คเกจ 'EntityFramework.BulkInsert-ef6' แพ็กเกจที่มีอยู่ต้องถูกกู้คืนก่อนที่จะทำการติดตั้งหรืออัพเดต คู่มือการใช้ Update-Package -Reinstall -ProjectName my_prj -Id EntityFramework.BulkInsert-ef6 งานทำงานได้ดีมาก


2
ขอบคุณ. ฉันกำลังร้องไห้ด้วยความปิติยินดี
cleftheris

ฉันกำลังร้องไห้ด้วยความดีใจเช่นกัน! ใช่!! ประหยัดเวลา เช่นเดียวกับ FYI หากคุณใช้บรรทัดนี้แทนบรรทัดสุดท้ายในสคริปต์ของ Sergei มันจะไม่ติดตั้งการพึ่งพา เพียงแค่ติดตั้งตรงใหม่: $ projectPackages | foreach {อัปเดตแพ็กเกจ -IgnoreDependencies - ติดตั้งใหม่ -ProjectName $ _ [0] -Id $ _ [1]}
ElMatador

2

สำหรับผู้ที่มาถึงที่นี่เนื่องจากการสร้างเซิร์ฟเวอร์ล้มเหลวคุณสามารถสร้างเป้าหมาย MSBuild ที่รันคำสั่ง exec เพื่อเรียกใช้คำสั่งnuget restoreดังด้านล่าง (ในกรณีนี้ nuget.exe อยู่ในโฟลเดอร์. nuget แทนที่จะเป็นบน เส้นทาง) ซึ่งสามารถเรียกใช้ในขั้นตอนการสร้าง TeamCity ทันทีก่อนที่จะสร้างโซลูชัน

<Target Name="BeforeBuild">
  <Exec Command="..\.nuget\nuget restore ..\MySolution.sln"/>
</Target>

1

ตอนนี้ Nuget Package Manager Console ใน Visual Studio 2012 จะให้ปุ่ม "คืนค่า" โดยอัตโนมัติทันทีที่พบว่ามีแพ็คเกจใด ๆ ที่ไม่ได้ติดตั้ง แต่อยู่ใน package.config คุณสมบัติดีเลิศ!


2
สิ่งนี้เป็นจริงสำหรับ Visual Studio 2010 เช่นกัน
paulroho

1

ที่ VS2012 V11 ถ้าฉันใช้ "- ติดตั้งใหม่" ที่ท้ายบรรทัดมันจะไม่ทำงาน

ดังนั้นฉันก็ใช้:

Update-Package -ProjectName 'NAME_OF_THE_PROJECT'

1

ฉันรู้ว่านี่เป็นโพสต์เก่า แต่คิดว่าอาจเป็นประโยชน์ หากคุณมีความต้องการที่จะเพิกเฉยต่อแพคเกจเฉพาะในระหว่างกระบวนการอัปเดต (เช่นแพ็คเกจใด ๆ ที่อัพเดตการอ้างอิง JavaScript) ให้ใช้สคริปต์ PowerShell ต่อไปนี้ (ตรวจสอบให้แน่ใจว่าซอร์สแพ็กเกจของคุณถูกตั้งค่าเป็น "ทั้งหมด" ในคอนโซลตัวจัดการแพคเกจ):

แก้ไข 2014-09-25 10:55 AM EST - แก้ไขข้อผิดพลาดในสคริปต์

$packagePath = "packages.config"
$projectName = "MyProjectName"

$packagesToIgnore = @(
    "bootstrap",
    "jQuery",
    "jquery-globalize",
    "jquery.mobile",
    "jQuery.jqGrid",
    "jQuery.UI.Combined",
    "jQuery.Validation",
    "Microsoft.jQuery.Unobtrusive.Validation",
    "Modernizr",
    "Moment.js"
)

[xml]$packageFile = gc $packagePath
$packagesToProcess = $packageFile.packages.package | Where-Object {$packagesToIgnore -notcontains $_.id}

$packagesToProcess | % { Update-Package -reinstall -projectname $projectName -id $($_.id) }

1

ไม่ทราบตั้งแต่เมื่อใด แต่ใน VS2019 คุณสามารถทำได้ในวิธีที่ง่ายกว่า:

  1. โซลูชันคลิกขวาในโซลูชัน Explorer
  2. เลือกจัดการแพคเกจ Nuget สำหรับโซลูชัน
  3. มี 4 แท็บ, เบราส์, ติดตั้ง, อัปเดต, รวมเข้าด้วยกัน
  4. Consolidate จะแสดงว่ามีโครงการใดที่ใช้แพ็คเกจที่แตกต่างกัน (และในกรณีส่วนใหญ่นั่นคือสาเหตุที่เราต้องการอัพเดทแพ็คเกจทั้งหมด)
  5. การอัปเดตจะแสดงว่ามีการอัปเดตใด ๆ ในโครงการใด ๆ เลือกทั้งหมดและคลิกอัปเดตงานจะเสร็จสิ้น

0

ใน Visual Studio 2017 - เมื่อคุณคอมไพล์โดยใช้ IDE - มันจะดาวน์โหลดแพ็คเกจ nuget ที่หายไปทั้งหมดและบันทึกในโฟลเดอร์ "แพ็คเกจ"

แต่ในการคอมไพล์เครื่องคอมไพล์ก็ทำได้โดยใช้ ในกรณีนั้นฉันดาวน์โหลด nuget.exe

ในระหว่างกระบวนการสร้างแต่ละครั้งก่อนดำเนินการ msbuild.exe มันจะดำเนินการ -> nuget.exe คืนค่า NAME_OF_SLN_File (หากมีไฟล์. DSL เพียงไฟล์เดียวคุณสามารถข้ามพารามิเตอร์นั้นได้)


ฉันพบว่าคุณสามารถใช้ MSBuild -t: restore บน SLN ที่บรรทัดคำสั่งเพื่อทำสิ่งนี้ MSbuild -t:restore Xxxx.sln
Mike Kelly
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.