ฉันมีทางออกกับหลายโครงการในนั้น การอ้างอิงบุคคลที่สามส่วนใหญ่หายไป แต่มีpackages.config
ไฟล์สำหรับแต่ละโครงการ ฉันจะให้ NuGet ติดตั้ง / อัพเดทแพ็คเกจทั้งหมดที่จำเป็นได้อย่างไร สิ่งนี้จำเป็นต้องทำผ่านบรรทัดคำสั่งสำหรับแต่ละโครงการหรือไม่
ฉันมีทางออกกับหลายโครงการในนั้น การอ้างอิงบุคคลที่สามส่วนใหญ่หายไป แต่มีpackages.config
ไฟล์สำหรับแต่ละโครงการ ฉันจะให้ NuGet ติดตั้ง / อัพเดทแพ็คเกจทั้งหมดที่จำเป็นได้อย่างไร สิ่งนี้จำเป็นต้องทำผ่านบรรทัดคำสั่งสำหรับแต่ละโครงการหรือไม่
คำตอบ:
คุณสามารถใช้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
กล่องโต้ตอบ
ปรับปรุง:
-reinstall
Update-Package -reinstall -Project ProjectName
ติดตั้งแพ็กเกจทั้งหมดใหม่ใน PROJECTS ทั้งหมดของโซลูชันปัจจุบัน:
Update-Package -Reinstall
ติดตั้งแพคเกจทั้งหมดใหม่ในโครงการเฉพาะของการแก้ปัญหาในปัจจุบัน ( ขอบคุณความไม่ธรรมดาและ ขี้เถ้า 999 ):
Update-Package -ProjectName 'YourProjectNameGoesHere' -Reinstall
มีอีกวิธีที่ใหม่กว่าและเร็วกว่าในการทำสิ่งนี้จากภายใน Visual Studio ลองอ่าน โพสต์นี้โดย David Ebbo และอ้างอิงหัวข้อความคิดเห็นหากคุณประสบปัญหา โดยทั่วไปคุณทำสิ่งต่อไปนี้ในพรอมต์ Manager Manager:
PM> Install-Package NuGetPowerTools
PM> Enable-PackageRestore
หลังจากนั้นเมื่อคุณสร้างโซลูชันแพคเกจจะถูกติดตั้งโดยอัตโนมัติหากพวกเขาหายไป
ปรับปรุง:
ฟังก์ชั่นนี้สร้างขึ้นในNuget 1.6พร้อมการรวม visual Studio ดังนั้นคุณไม่จำเป็นต้องติดตั้ง NuGetPowerTools หรือพิมพ์คำสั่ง สิ่งที่คุณต้องทำคือ
คลิกขวาที่โหนดโซลูชันใน Solution Explorer และเลือกเปิดใช้งานแพ็คเกจ NuGet
อ่านบทความนี้สำหรับรายละเอียดเพิ่มเติม
นี่คือวิธีแก้ไขปัญหาอื่นหากคุณใช้โครงการเว็บไซต์หรือไม่ต้องการเปิดใช้งานแพคเกจ 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) }
$packages.packages.package | % { Update-Package -reinstall -id $($_.id) }
Update-Package -Reinstall
ได้
Update-Package -ProjectName 'YourProjectNameGoesHere' -Reinstall
นี่คือตัวอย่างที่ดีที่สุดและง่ายที่สุดที่ฉันพบ มันจะติดตั้ง nugets ทั้งหมดที่ระบุไว้ใน packages.config และมันจะรักษาเวอร์ชันปัจจุบัน แทนที่YourProjectNameGoesHere
ด้วยชื่อโครงการ
ด้วยการเปิดตัว NuGet 2.5 ล่าสุดขณะนี้มีปุ่ม "อัปเดตทั้งหมด" ในตัวจัดการแพ็คเกจ: http://docs.nuget.org/docs/release-notes/nuget-2.5#Update_All_button_to_allow_upages_all_packages_at_once
ฉันใช้ visual studio 2015 และวิธีแก้ปัญหาที่กล่าวมาข้างต้นไม่ได้ผลสำหรับฉันดังนั้นฉันจึงทำสิ่งต่อไปนี้:
ลบโฟลเดอร์แพ็คเกจออกจากโซลูชันของฉันรวมถึงโฟลเดอร์ bin และ obj จากทุกโครงการในโซลูชันและให้สร้างใหม่
บางทีคุณอาจจะมีข้อผิดพลาดต่อไป:
ไม่สามารถค้นหา nuget.exe
เพื่อแก้ปัญหานี้: เปลี่ยนบรรทัดนี้ในไฟล์ NuGet.targets ของคุณและตั้งค่าเป็นจริง:
<DownloadNuGetExe Condition=" '$(DownloadNuGetExe)' == '' ">true</DownloadNuGetExe>
การอ้างอิง: https://stackoverflow.com/a/30918648และhttps://stackoverflow.com/a/20502049
หากคุณติดตั้ง Nuget 2.8 ให้เลือกช่องทำเครื่องหมาย
Tools >> Nuget Manager >> Package Manager Settings >> Automatically check for missing packages during build
ใน Visual Studio หากมีการตรวจสอบแล้วเพียงแค่สร้างโครงการใหม่จะคืนค่าไลบรารีอ้างอิงทั้งหมดของคุณ
Allow NuGet to download missing packages
ช่องทำเครื่องหมายเช่นกัน
หลังจาก 3 ชั่วโมงของการค้นหาและตรวจสอบ
ฉันมีปัญหากับมันเพราะเรามีสมาชิกสองคนในทีม (โดยใช้การควบคุมแหล่ง GitHub) เนื่องจากเราไม่ได้ จำกัด ไฟล์สำหรับแพ็คเกจสำหรับการส่งไปยังพื้นที่เก็บข้อมูลระยะไกลหนึ่งในสมาชิกในทีมถูกส่งแพคเกจไปยังเซิร์ฟเวอร์และฉันดึงการเปลี่ยนแปลงนั้น ท้องถิ่นของฉัน
หลังจากนั้นฉันมีปัญหาเดียวกับ PO ฉันก็ไม่สามารถเผยแพร่โครงการ API ของฉันไปยังเซิร์ฟเวอร์ได้
ที่และฉันเพิ่งใช้
อัพเดต - แพ็คเกจ - ติดตั้งใหม่ - รันคำสั่งนี้บน Package Manager Console
คำสั่งนี้จะติดตั้งแพ็กเกจทั้งหมดที่คุณใช้ในโซลูชันของคุณใหม่ (สำหรับทุกโครงการ)
ติดตั้งแพ็กเกจทั้งหมดใหม่ใน PROJECTS ทั้งหมดของโซลูชันปัจจุบัน:
ปรับปรุงแพคเกจ - ชื่อโครงการ 'NameOfProject' - ติดตั้งใหม่ - เรียกใช้คำสั่งนี้บนคอนโซลตัวจัดการแพคเกจ
คำสั่งนี้จะติดตั้งแพ็กเกจของคุณทั้งหมดที่เกี่ยวข้องกับโครงการที่คุณระบุหลังจาก "-ProjectName" และฉันคิดว่ามันดีกว่าเพราะฉันรอครึ่งชั่วโมงเพื่อติดตั้งแพ็คเกจทั้งหมดในโซลูชัน
ขอบคุณมากสำหรับการนี้เพื่อRodolpho บร็อค
นอกจากนี้ฉันขอแนะนำให้คุณเมื่อคุณดึงการเปลี่ยนแปลงจากเซิร์ฟเวอร์ระยะไกลเพื่อกดปุ่ม "เรียกคืนแพคเกจ" ที่จะแสดงโดย Visual Studio
ผมเชื่อว่าสิ่งแรกที่คุณต้องทำคือการเปิดใช้งานแพคเกจเรียกคืนคุณลักษณะ ดูเพิ่มเติมที่นี่ ทำในระดับโซลูชัน (ไม่ใช่โครงการ)
แต่นั่นจะไม่ช่วยให้คุณไปถึงจุดนั้น - ฉันพบปัญหาที่คล้ายกันหลังจากเปิดใช้งานคุณลักษณะการคืนค่า (VS2013, NuGet 2.8.)
มันกลับกลายเป็นว่าฉันได้มุ่งมั่นที่จะควบคุมแพ็กเกจไปยังแหล่งควบคุมเมื่อฉันทำโปรเจ็กต์แต่ Visual Studio (และปลั๊กอินควบคุมแหล่งที่มา) ตั้งใจละเว้นไบนารีเมื่อทำการเช็คอิน
ปัญหาเกิดขึ้นเมื่อฉันสร้างสาขาที่วางจำหน่าย สำเนาของสาขา dev / main / trunk ในเครื่องของฉันมีไบนารีเพราะนั่นคือสิ่งที่ฉันได้ติดตั้ง / ดาวน์โหลดแพ็คเกจไว้ในตอนแรก
อย่างไรก็ตามในสาขารุ่นใหม่
.nupkg
ไฟล์แพ็คเกจทั้งหมดอยู่ที่นั่น - ดังนั้น NuGet จึงไม่คิดว่าจะมีอะไรที่จะกู้คืนฉันลบโฟลเดอร์แพ็กเกจทั้งหมดใน$(SolutionDir)/packages
(ใต้สาขารีลีส) จากนั้นรันการสร้างใหม่อย่างสมบูรณ์และในครั้งนี้การสร้างสำเร็จ
... และแน่นอนว่าฉันกลับไปและลบโฟลเดอร์แพ็คเกจออกจากแหล่งควบคุม (ในลำต้นและสาขาย่อย) ฉันยังไม่ชัดเจน (ยัง) ว่าrepositories.config
ควรลบไฟล์ด้วยหรือไม่
ส่วนประกอบหลายอย่างที่ติดตั้งให้คุณโดยเทมเพลตโครงการ - อย่างน้อยสำหรับโครงการเว็บ - เป็นแพ็คเกจ NuGet นั่นคือปัญหานี้ไม่ จำกัด เฉพาะแพ็คเกจที่คุณเพิ่ม
ดังนั้นเปิดใช้งานแพคเกจการคืนค่าทันทีหลังจากสร้างโครงการ / โซลูชันและก่อนที่คุณจะทำการเช็คอินครั้งแรกให้ล้างpackages
โฟลเดอร์ (และตรวจสอบให้แน่ใจว่าคุณยอมรับ.nuget
โฟลเดอร์เพื่อควบคุมแหล่งที่มา)
คำเตือน: ฉันเห็นคำตอบอื่นที่นี่ใน SO ซึ่งระบุว่าการล้างpackages
โฟลเดอร์เป็นส่วนหนึ่งของความละเอียด นั่นทำให้ฉันอยู่ในเส้นทางที่ถูกต้องดังนั้นฉันจึงต้องการให้เครดิตผู้แต่ง แต่ฉันไม่สามารถค้นหาคำถาม / คำตอบนั้นได้อีก ฉันจะโพสต์การแก้ไขหากฉันสะดุดมัน
ฉันยังทราบว่าUpdate-Package -reinstall
จะแก้ไข.sln
และ .csproj
/ .vbproj
ไฟล์ อย่างน้อยนั่นก็เป็นสิ่งที่ทำในกรณีของฉัน IMHO ตัวไหนที่ทำให้ตัวเลือกนี้น่าสนใจน้อยกว่ามาก
ฉันพยายาม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
งานทำงานได้ดีมาก
สำหรับผู้ที่มาถึงที่นี่เนื่องจากการสร้างเซิร์ฟเวอร์ล้มเหลวคุณสามารถสร้างเป้าหมาย MSBuild ที่รันคำสั่ง exec เพื่อเรียกใช้คำสั่งnuget restoreดังด้านล่าง (ในกรณีนี้ nuget.exe อยู่ในโฟลเดอร์. nuget แทนที่จะเป็นบน เส้นทาง) ซึ่งสามารถเรียกใช้ในขั้นตอนการสร้าง TeamCity ทันทีก่อนที่จะสร้างโซลูชัน
<Target Name="BeforeBuild">
<Exec Command="..\.nuget\nuget restore ..\MySolution.sln"/>
</Target>
ตอนนี้ Nuget Package Manager Console ใน Visual Studio 2012 จะให้ปุ่ม "คืนค่า" โดยอัตโนมัติทันทีที่พบว่ามีแพ็คเกจใด ๆ ที่ไม่ได้ติดตั้ง แต่อยู่ใน package.config คุณสมบัติดีเลิศ!
ที่ VS2012 V11 ถ้าฉันใช้ "- ติดตั้งใหม่" ที่ท้ายบรรทัดมันจะไม่ทำงาน
ดังนั้นฉันก็ใช้:
Update-Package -ProjectName 'NAME_OF_THE_PROJECT'
ฉันรู้ว่านี่เป็นโพสต์เก่า แต่คิดว่าอาจเป็นประโยชน์ หากคุณมีความต้องการที่จะเพิกเฉยต่อแพคเกจเฉพาะในระหว่างกระบวนการอัปเดต (เช่นแพ็คเกจใด ๆ ที่อัพเดตการอ้างอิง 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) }
ไม่ทราบตั้งแต่เมื่อใด แต่ใน VS2019 คุณสามารถทำได้ในวิธีที่ง่ายกว่า:
ใน Visual Studio 2017 - เมื่อคุณคอมไพล์โดยใช้ IDE - มันจะดาวน์โหลดแพ็คเกจ nuget ที่หายไปทั้งหมดและบันทึกในโฟลเดอร์ "แพ็คเกจ"
แต่ในการคอมไพล์เครื่องคอมไพล์ก็ทำได้โดยใช้ ในกรณีนั้นฉันดาวน์โหลด nuget.exe
ในระหว่างกระบวนการสร้างแต่ละครั้งก่อนดำเนินการ msbuild.exe มันจะดำเนินการ -> nuget.exe คืนค่า NAME_OF_SLN_File (หากมีไฟล์. DSL เพียงไฟล์เดียวคุณสามารถข้ามพารามิเตอร์นั้นได้)
MSbuild -t:restore Xxxx.sln