โซลูชันการกำหนดเป้าหมายใหม่จาก. Net 4.0 ถึง 4.5 - วิธีการกำหนดแพคเกจ NuGet ใหม่อีกครั้งอย่างไร


205

ฉันย้ายข้อมูลโซลูชันที่กำหนดเป้าหมายเป็น. NET 4.0 ใน VS2010 ไปเป็น VS2012 และตอนนี้ฉันต้องการกำหนดเป้าหมายใหม่เป็น. Net 4.5

สิ่งที่ฉันไม่แน่ใจเกี่ยวกับแพ็คเกจ NuGet คืออะไร ตัวอย่างเช่น EF5 ซึ่งฉันอัปเดตจาก EF4 ใน VS2010 กลายเป็น EF 4.4 จริง ๆ ตามที่คุณเห็นที่นี่:

    <Reference Include="EntityFramework, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>..\packages\EntityFramework.5.0.0\lib\net40\EntityFramework.dll</HintPath>
    </Reference>

ฉันยังสามารถดูต่อไปนี้ใน packages.config สำหรับโครงการ:

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="EntityFramework" version="5.0.0" targetFramework="net40" />
</packages>

ดังนั้นคำถามของฉันคือ:

แนวปฏิบัติที่ดีที่สุดในการกำหนดเป้าหมายแพคเกจ NuGet ใหม่ทั้งหมดที่ตั้งค่าให้เป็นเป้าหมายคือ. NET 4.0 ไปยังเป้าหมาย. NET 4.5


คำตอบ:


266

NuGet 2.1เสนอคุณสมบัติที่ทำให้สิ่งนี้ง่ายขึ้นมากเพียงทำได้update-package -reinstall -ignoreDependenciesจาก Package Manager Console

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

เหตุผลแพ็กเกจต้องถูกถอนการติดตั้งและติดตั้งใหม่คือ:

  • เมื่อติดตั้งแพคเกจเราจะกำหนดกรอบเป้าหมายของโครงการของคุณ
  • จากนั้นเราจะจับคู่เนื้อหาแพ็คเกจกับค้นหา \ lib \ folder ที่เหมาะสม (และ \ content \ โฟลเดอร์)
  • การอ้างอิงแอสเซมบลีจะถูกเพิ่มด้วยคำแนะนำเส้นทางที่ชี้ไปที่โฟลเดอร์ \ lib \ ของแพ็คเกจพร้อมโฟลเดอร์ย่อยด้านขวา (ตัวอย่างเช่น \ lib \ net40)
  • ไฟล์เนื้อหาจะถูกคัดลอกจากโฟลเดอร์ packages \ content \ ด้วยโฟลเดอร์ย่อยที่เหมาะสม (ตัวอย่างเช่น \ content \ net40)
  • เราบันทึก targetFramework ที่ใช้ในการติดตั้งแพคเกจภายในไฟล์ packages.config
  • หลังจากที่คุณเปลี่ยนกรอบงานเป้าหมายของโครงการของคุณคำแนะนำเส้นทางยังคงชี้ไปที่ net40
  • เมื่อคุณถอนการติดตั้งแพคเกจเราจะตรวจสอบ targetFramework ที่บันทึกไว้ใน packages.config เพื่อดู libs / เนื้อหาของเฟรมเวิร์กเป้าหมายที่จะลบออกจากโครงการของคุณ
  • เมื่อคุณติดตั้งแพคเกจใหม่เราจะตรวจสอบเฟรมเวิร์กเป้าหมายที่อัปเดตและการอ้างอิง / คัดลอก libs / เนื้อหาที่ถูกต้อง

ใช้ VS 2012 กับโครงการ ASP.NET MVC 4 และหลังจากกำหนดเป้าหมาย. NET Framework อีกครั้งจาก 4.0 เป็น 4.5 ฉันดำเนินการupdate-package -reinstallใน Package Manager Console แพคเกจทั้งหมดเริ่มถอนการติดตั้งและอัปเดตและ Windows 8 เริ่มต้นใหม่อย่างฉับพลันและเมื่อได้รับข้อมูลกลับบอกว่า "พีซีของคุณมีปัญหาและเริ่มการทำงานใหม่คุณต้องการส่งข้อมูลไปยัง Microsoft หรือไม่" :( กลัว ... โดยวิธีนี้เป็นรุ่น NuGet ที่ฉันติดตั้งตอนนี้: 2.2.40116.9051เปิดปัญหาที่นี่: nuget.codeplex.com/workitem/3049
Leniel Maccaferri

12
ตัวเลือกการติดตั้งซ้ำไม่เคยมีผลกับฉันเลย มันอาจลบตามลำดับที่ผิดและข้อผิดพลาดใน "ไม่สามารถลบ X เพราะ Y ขึ้นอยู่กับมัน" หรือบางครั้งก็ไม่ได้อ่านแพ็คเกจ ครั้งล่าสุดที่ฉันลองใช้มันจะลบ EntityFramework และจะไม่เพิ่มเข้าไปอีก
CodingWithSpike

4
update-package- ติดตั้งซ้ำไม่ใช่โซลูชันสำหรับฉัน นอกจากนี้ยังอัปเดตแพ็คเกจจำนวนมากแทนที่จะปล่อยให้เป็นเวอร์ชั่นที่เราใช้และทดสอบกับ ตัวอย่างเช่น Ninject ถูกย้ายไปที่ v3 และนั่นเป็นการเปลี่ยนแปลงเวอร์ชันที่แตกหัก
Steve Owen

13
อย่าแม้แต่พยายาม update-page -reinstall สิ่งนี้ช่างเป็นระเบียบเมื่อมันวิ่งบนเครื่องท้องถิ่นของฉันซึ่งฉันต้องหยุดไม่ให้ NuGet Package manager จัดการต่อไป มันลบ jQuery 1.10 เวอร์ชั่นของฉันและแทนที่ด้วย 1.4.4 ด้วยเหตุผลบางอย่าง เพียงทำด้วยตนเองและช่วยตัวเองให้ยุ่งยาก
JustinMichaels

2
เห็นด้วยกับสิ่งที่ยุ่งเหยิงและนั่นก็เป็นสองปีต่อจากโพสต์นี้ พบรุ่นที่ต่ำกว่าของนักเก็ตบางตัวและทำให้มีการอ้างอิงมากขึ้น และหลังจากนั้นเกือบสองชั่วโมงในการอัปเดต (บนเวิร์กสเตชันระดับไฮเอนด์ตั้งแต่ต้นปี 2557) 20 โครงการในการแก้ปัญหา
Arve Systad

42

สำหรับผู้ที่มีปัญหาเกี่ยวกับupdate-package -reinstall <packagename>คำสั่งให้ลองรันด้วย-ignoreDependenciesflag เช่นนี้

update-package -reinstall <packagename> -ignoreDependencies

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

ข้อมูลเพิ่มเติมที่นี่


ขอบคุณที่ช่วยประหยัดปัญหาได้มากจริงๆ การเฝ้าดู Nuget พยายามติดตั้งการอ้างอิง 10 ครั้งขึ้นไปที่ EnterpriseLibrary มีแนวโน้มที่จะสร้างในโครงการ 30+ โครงการกำลังมุ่งหน้าสู่งานที่ต้องทำตลอดวัน วิธีนี้จะนำไปสู่นาที
David Keaveny

อย่างที่คนอื่น ๆ พูดถึงมีแนวโน้มที่จะทำลายทุกอย่าง
Gleno

9
คุณสามารถทำสิ่งนี้ได้โดยอัตโนมัติสำหรับโซลูชันทั้งหมดโดยเปลี่ยนเพียงเล็กน้อยเมื่อทำงานภายใต้คอนโซลตัวจัดการแพคเกจ:get-package | % { update-package $_.Id -reinstall -ProjectName $_.ProjectName -ignoreDependencies }
Kaleb Pederson

2
@KalebPederson จากประสบการณ์ของฉันคำสั่งใช้งานได้กว้าง?

1
@ BjörnAliGöransson - ขออภัยถ้าฉันยังไม่ชัดเจนเพียงพอ คำตอบนี้เป็นวิธีการอัปเดตแพ็กเกจเดียวทั่วทั้งโซลูชัน สคริปต์ของฉันจะผ่านทุกแพคเกจของ NuGet ในโซลูชันและกำหนดใหม่ในโซลูชัน คำตอบนั้นเหมาะสำหรับโครงการเดียว แต่สคริปต์ที่ฉันให้อาจดีกว่าถ้าคุณมีแพ็คเกจจำนวนมากที่ต้องทำการกำหนดเป้าหมายใหม่
Kaleb Pederson

22

หลังจากลองคำตอบที่ยอมรับไม่สำเร็จฉันอยากจะแนะนำคำสั่งที่มีความเสี่ยงน้อยกว่า:

Update-Package <PackageName> -ProjectName <ProjectName> -Reinstall -IgnoreDependencies

สำหรับข้อมูลเพิ่มเติม: http://blog.nuget.org/20121231/a-quick-tutorial-on-update-package-command.html


1
ตามเอกสารที่มีการเชื่อมโยง-reinstallจะติดตั้งรุ่นเดียวกันดังนั้นไม่เห็นประโยชน์ใด ๆ -safeจากการใช้ ฉันพลาดอะไรไปรึเปล่า?
Kaleb Pederson

4

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

ในกรณีของฉันสิ่งที่ทำงานคือการอัพเกรดแต่ละโครงการหนึ่งที่เวลาโดยการเพิ่ม-ProjectName projectnameกับupdate-packageคำสั่ง ในกรณีนี้packages.configจะได้รับการอัปเดตเนื่องจากแต่ละโครงการได้รับการอัพเกรด

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


3
ฉันพบปัญหาเดียวกัน UpdatePackage -Reinstallลบ package.config และการอ้างอิงโครงการสำหรับโครงการสองสามรายการ (โดยเฉพาะรายการที่มีชุดประกอบปลอมขึ้นมา) เราหลีกเลี่ยงปัญหานี้โดยยกเลิกการเปลี่ยนแปลงทั้งหมดที่เกิดขึ้นกับโครงการที่เมาแล้วทำงาน:Update-Package -reinstall -ProjectName "PROJECTNAME" -IgnoreDependencies
MSC

1

ด้วย Visual Studio สำหรับ Mac 2019 การคลิกขวาที่โฟลเดอร์แพคเกจจะแสดงตัวเลือก 'Retarget' ในเมนู วิธีนี้แก้ไขปัญหาการกำหนดเป้าหมายใหม่สำหรับแพ็คเกจทั้งหมดในโครงการที่จำเป็นต้องมีการกำหนดเป้าหมายใหม่ ดูเหมือนว่าจะไม่มี NuGet Package Manager ภายใต้เมนูเครื่องมือใน Visual Studio สำหรับ Mac (อย่างน้อยในเหมือง) ดังนั้นฉันจึงไม่สามารถเปิดใช้ Package Manager Console

ตัวเลือกเมนูกำหนดเป้าหมายใหม่ภายใต้เมนูแพคเกจคลิกขวา

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