NuGet สำหรับโซลูชันที่มีหลายโครงการ


153

สมมติว่าฉันมีวิธีแก้ปัญหาด้วย 3 โครงการ:

  • แกน
  • UI
  • การทดสอบ

แพคเกจ NuGet ที่ฉันใช้จะนำไปใช้กับทั้ง 3 โครงการ บางคนจะใช้กับ UI และการทดสอบและบางคนจะใช้กับการทดสอบ (เช่น NUnit)

อะไรคือวิธีที่ถูกต้องในการตั้งค่าโดยใช้ NuGet

  1. ฉันควรใช้ "เพิ่มการอ้างอิงแพคเกจห้องสมุด" ในทั้งสามโครงการเมื่อใดก็ตามที่ฉันต้องการการอ้างอิง?
  2. ฉันควรใช้ "เพิ่มการอ้างอิงแพ็กเกจห้องสมุด" ในครั้งแรกที่ฉันต้องการแพ็กเกจจากนั้นใช้เพิ่มการอ้างอิง -> เรียกดูการใช้งานในภายหลัง?

ในกรณีใดฉันควรมีไฟล์packages.configกี่ไฟล์?

คำตอบ:


239

สำหรับใครก็ตามที่เจอสิ่งนี้ตอนนี้มีตัวเลือกดังต่อไปนี้:

คลิกขวาที่โซลูชันของคุณ> จัดการแพคเกจ NuGet สำหรับโซลูชัน ...

... หรือ:

เครื่องมือ> เครื่องมือจัดการไลบรารี> จัดการแพคเกจ NuGet สำหรับโซลูชัน ...

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


5
จะเกิดอะไรขึ้นถ้าฉันต้องการติดตั้งแพคเกจสำหรับโซลูชันที่มีรุ่นเฉพาะ ตัวช่วยสร้างไม่ได้ให้ตัวเลือกแก่ฉัน ในคอนโซลฉันสามารถเรียกใช้แบบนั้นได้Install-Package RazorEngine -Version 3.3.0แต่จะใช้กับโปรเจ็กต์ที่เลือกในเมนูดรอปดาวน์เท่านั้น
MaciejLisCK

สิ่งนี้ได้รับการสนับสนุนใน Visual Studio 2010 ฉันเพิ่งถามคำถามที่นี่ - stackoverflow.com/questions/33163987/…
2645830

หากคุณมีโครงการที่มีขนาดใหญ่มากคุณจะเชื่อใจผู้จัดการแพ็คเกจเพื่ออัพเดทการอ้างอิงหรือไม่?
มิก

คุณมีความคิดใด ๆ เมื่อไม่มีปุ่ม "จัดการ" สำหรับแพ็คเกจเฉพาะหรือไม่? เช่น System.ServiceModel ฉันไม่สามารถจัดการไลบรารีนี้จากมุมมองโซลูชัน
Hoàng Long

@Mick ตรวจสอบแท็บรวมในกล่องโต้ตอบที่กล่าวถึง ... ฉันจะ!

76

ใช้คอนโซลเพื่อกำหนดเป้าหมายหลายโครงการ

Tools > Library Package Manager > Package Manager Console

จากนั้นใช้คำสั่งนี้

Get-Project PROJECT-NAMES-WITH-COMMAS | Install-Package PACKAGENAME

ตัวอย่างเช่น

Get-Project Core,UI | Install-Package FluentDateTime

4
+1: อย่างน้อยกับรุ่นปัจจุบันของ NuGet ฉันยังคงชอบวิธีนี้มากกว่ากล่องโต้ตอบ "จัดการแพคเกจ NuGet สำหรับการแก้ปัญหา" เนื่องจากโซลูชันของเรามีขนาดใหญ่มากและฉันไม่สามารถวางรายการชื่อโครงการลงในกล่องโต้ตอบนั้นได้
Yodan Tauber

21

ดีลนี้เหมาะกับฉัน:

PM> Get-Project -all | where {$_.Name -match "Songhay.Silverlight" -and
    $_.Name -notmatch "ApplicationLoader" -and $_.Name -notmatch ".Xml"}
    | ForEach-Object {Install-Package MvvmLight -project $_.Name}

2
นี่คือวิธีที่จะทำ! ตัวอย่างเช่นหากคุณต้องการแสดงรายการ json.net ทุกรุ่นสำหรับโครงการทั้งหมดของคุณในโซลูชันลองใช้สิ่งนี้:Get-Project -all | ForEach-Object {Get-Package -ProjectName $_.Name -Filter Newtonsoft.Json}
jonypony3

1
@EdwardMMeshuris คำสั่งที่ดีมาก แต่จะไม่ได้รับการจับคู่ที่แน่นอนสำหรับชื่อแพคเกจ นี่คือการปรับปรุงเล็กน้อยสำหรับการจับคู่ที่ตรงกันGet-Project -all | ForEach-Object {Get-Package -ProjectName $_.Name -filter PACKAGE_NAME} | where-object { $_.id -eq 'PACKAGE_NAME' }
Dark_Knight

12

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

คุณสามารถกรองGet-Project -Allคำสั่งและกำหนดเป้าหมายชุดย่อยของรายการโครงการ


8

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

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


4
หมายเหตุ: หากคุณไม่อัปเดตแพ็คเกจห้องสมุดทั้งหมดคุณจะพบกับแอสเซมบลีรุ่นเดียวกัน 3 เวอร์ชัน .NET สามารถทำงานกับ 3 รุ่นที่แตกต่างกันหากอยู่ใน GAC หรือมีชื่อแตกต่างกัน แต่เพราะพวกเขาจะมีชื่อเดียวกัน คุณจะจบลงด้วยการสร้างไม่ทำงานเพราะรุ่นเก่าถูกคัดลอกไปยังรุ่นที่ใหม่กว่า
graffic

2

ในPackage Manager Consoleคุณสามารถเขียนคำสั่งต่อไปนี้:

Get-Project -all | ForEach-Object {Get-Package -ProjectName $_.Name -filter 
PACKAGE_NAME} | where-object { $_.id -eq 'PACKAGE_NAME' } | Install-Package 
PACKAGE_NAME -Version VERSION

คุณสามารถใช้คำสั่งนั้นเพื่อติดตั้งหรืออัพเดทได้เช่นกัน (Update-Package)

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