ฉันมีสถานการณ์ที่คล้ายกันซึ่งมีแหล่งแพคเกจภายนอกและภายในที่อ้างอิงโครงการในโซลูชันมากกว่าหนึ่งรายการ ฉันเพิ่งได้ทำงานกับหนึ่งในรหัสฐานของเราวันนี้และดูเหมือนว่าจะทำงานกับเวิร์กสเตชันนักพัฒนาและสร้างเซิร์ฟเวอร์ของเรา กระบวนการด้านล่างมีสถานการณ์นี้ในใจ (แม้ว่าจะไม่ยากที่จะปรับตัวให้มีโฟลเดอร์แพคเกจทั่วไปที่อื่น)
- codebase
- โครงการ A
- โครงการ B
- โครงการ C
- โซลูชั่น
- โซลูชันที่ 1
- โซลูชันที่ 2
- โซลูชันที่ 3
- แพ็คเกจ (นี่เป็นแพคเกจทั่วไปที่แชร์โดยโซลูชันทั้งหมด)
คำตอบที่อัปเดตแล้วของ NuGet 3.5.0.1484 ด้วย Visual Studio 2015 อัปเดต 3
กระบวนการนี้ง่ายขึ้นเล็กน้อยเมื่อเทียบกับตอนแรกที่ฉันจัดการกับมันและคิดว่าถึงเวลาที่จะต้องอัปเดตแล้ว โดยทั่วไปกระบวนการจะเหมือนกันเพียงไม่กี่ก้าวเท่านั้น ผลลัพธ์เป็นกระบวนการที่แก้หรือให้สิ่งต่อไปนี้:
- ทุกสิ่งที่จำเป็นต้องได้รับการมุ่งมั่นในการควบคุมซอร์สโค้ดสามารถมองเห็นและติดตามได้ในโซลูชัน
- การติดตั้งแพ็คเกจใหม่หรืออัพเดทแพ็คเกจโดยใช้ Package Manager ใน Visual Studio จะใช้เส้นทางที่เก็บข้อมูลที่ถูกต้อง
- หลังจากการกำหนดค่าเริ่มต้นไม่มีการแฮ็คไฟล์. csproj
- ไม่มีการดัดแปลงเวิร์คสเตชั่นสำหรับนักพัฒนา (รหัสพร้อมสร้างเมื่อเช็คเอาต์)
มีข้อเสียที่เป็นไปได้บางประการที่ต้องระวัง (ฉันยังไม่พบ YMMV) ดูคำตอบและความคิดเห็นของ Benolด้านล่าง
เพิ่ม NuGet.Config
คุณจะต้องการสร้างไฟล์ NuGet.Config ในรูทของโฟลเดอร์ \ Solutions \ ตรวจสอบให้แน่ใจว่านี่เป็นไฟล์ที่เข้ารหัส UTF-8 ที่คุณสร้างหากคุณไม่แน่ใจว่าจะทำเช่นไรให้ใช้ไฟล์ -> สร้าง -> เมนูของ Visual Studio จากนั้นเลือกเทมเพลตไฟล์ XML เพิ่มไปที่ NuGet กำหนดค่าต่อไปนี้:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<config>
<add key="repositoryPath" value="$\..\Packages" />
</config>
</configuration>
สำหรับการตั้งค่า repositoryPath คุณสามารถระบุพา ธ สัมบูรณ์หรือพา ธ สัมพัทธ์ (แนะนำ) โดยใช้ $ token $ token นั้นขึ้นอยู่กับที่ตั้งของ NuGet.Config (จริง ๆ แล้ว $ token นั้นสัมพันธ์กับหนึ่งระดับต่ำกว่าตำแหน่งของ NuGet.Config) ดังนั้นถ้าฉันมี \ Solutions \ NuGet.Config และฉันต้องการ \ Solutions \ แพ็คเกจฉันจะต้องระบุ $ \ .. \ แพคเกจเป็นค่า
ถัดไปคุณจะต้องเพิ่มโฟลเดอร์โซลูชันให้กับโซลูชันที่เรียกว่า "NuGet" (คลิกขวาที่โซลูชันของคุณเพิ่ม -> โฟลเดอร์โซลูชันใหม่) โซลูชันโฟลเดอร์เป็นโฟลเดอร์เสมือนที่มีอยู่ในโซลูชัน Visual Studio เท่านั้นและจะไม่สร้างโฟลเดอร์จริงบนไดรฟ์ (และคุณสามารถอ้างอิงไฟล์ได้จากทุกที่) คลิกขวาที่โฟลเดอร์โซลูชัน "NuGet" แล้วเพิ่ม -> รายการที่มีอยู่แล้วเลือก \ Solutions \ NuGet.Config
เหตุผลที่เราทำเช่นนี้คือเพื่อให้สามารถมองเห็นได้ในโซลูชันและควรช่วยให้แน่ใจว่ามีความมุ่งมั่นอย่างถูกต้องในการควบคุมซอร์สโค้ดของคุณ คุณอาจต้องการทำขั้นตอนนี้สำหรับแต่ละโซลูชันใน codebase ของคุณที่เข้าร่วมกับโครงการที่ใช้ร่วมกันของคุณ
โดยการวางไฟล์ NuGet.Config ใน \ Solutions \ ด้านบนไฟล์. sln ใด ๆ เรากำลังใช้ประโยชน์จากข้อเท็จจริงที่ว่า NuGet จะนำทางโครงสร้างโฟลเดอร์ซ้ำ ๆ จาก "ไดเรกทอรีทำงานปัจจุบัน" เพื่อค้นหาไฟล์ NuGet.Config เพื่อใช้งาน "ไดเรกทอรีการทำงานปัจจุบัน" หมายถึงสิ่งต่าง ๆ ที่นี่หนึ่งคือเส้นทางการดำเนินการของ NuGet.exe และอื่น ๆ เป็นที่ตั้งของไฟล์. sln
สลับไปยังโฟลเดอร์แพ็คเกจของคุณ
อันดับแรกฉันขอแนะนำให้คุณดำเนินการตามแต่ละโฟลเดอร์โซลูชันและลบ \ Packages \ โฟลเดอร์ที่มีอยู่ (คุณจะต้องปิด Visual Studio ก่อน) สิ่งนี้ทำให้ง่ายต่อการดูว่า NuGet วางโฟลเดอร์ \ Packages \ ที่เพิ่งกำหนดค่าไว้ของคุณอย่างไรและทำให้แน่ใจว่าลิงก์ใด ๆ ไปยังโฟลเดอร์ \ Packages \ ผิดจะล้มเหลวและสามารถแก้ไขได้
เปิดโซลูชันของคุณใน Visual Studio และเริ่มสร้างใหม่ทั้งหมด ไม่ต้องสนใจข้อผิดพลาดของบิลด์ทั้งหมดที่คุณจะได้รับซึ่งเป็นสิ่งที่คาดว่าจะเกิด สิ่งนี้ควรเริ่มจากคุณลักษณะการกู้คืนแพ็คเกจของ NuGet เมื่อเริ่มกระบวนการสร้างอย่างไรก็ตาม ตรวจสอบว่าโฟลเดอร์ \ Solutions \ Packages \ ของคุณถูกสร้างขึ้นในจุดที่คุณต้องการ หากยังไม่ได้ตรวจสอบการกำหนดค่าของคุณ
ตอนนี้สำหรับแต่ละโครงการในโซลูชันของคุณคุณจะต้อง:
- คลิกขวาที่โครงการและเลือกยกเลิกการโหลดโครงการ
- คลิกขวาที่โครงการและเลือกแก้ไข your-xxx.csproj
- ค้นหาการอ้างอิงถึง \ packages \ และอัปเดตไปยังตำแหน่งใหม่
- ส่วนใหญ่จะเป็น <HintPath> ข้อมูลอ้างอิง แต่ไม่ใช่ทั้งหมด ตัวอย่างเช่น WebGrease และ Microsoft.Bcl.Build จะมีการตั้งค่าเส้นทางแยกต่างหากที่จะต้องมีการปรับปรุง
- บันทึก. csproj จากนั้นคลิกขวาที่โครงการและเลือกโหลดโครงการอีกครั้ง
เมื่อไฟล์. csproj ทั้งหมดของคุณได้รับการอัปเดตแล้วให้เริ่มสร้างใหม่ทั้งหมดอีกครั้งและคุณไม่ควรมีข้อผิดพลาดในการสร้างเกี่ยวกับการอ้างอิงที่หายไปอีก ณ จุดนี้คุณเสร็จแล้วและตอนนี้มี NuGet กำหนดค่าให้ใช้โฟลเดอร์แพคเกจที่ใช้ร่วมกัน
ในฐานะของ NuGet 2.7.1 (2.7.40906.75) พร้อม VStudio 2012
สิ่งแรกที่ควรคำนึงถึงคือ nuget.config ไม่ได้ควบคุมการตั้งค่าพา ธ ทั้งหมดในระบบแพ็คเกจ nuget นี่เป็นความสับสนโดยเฉพาะอย่างยิ่งที่จะคิดออก โดยเฉพาะอย่างยิ่งปัญหาคือ msbuild และ Visual Studio (การเรียกใช้ msbuild) ไม่ใช้พา ธ ใน nuget.config แต่จะแทนที่มันในไฟล์ nuget.targets
การเตรียมสิ่งแวดล้อม
ก่อนอื่นฉันจะเข้าไปยังโฟลเดอร์โซลูชันของคุณแล้วลบ \ packages \ folder ทั้งหมดที่มีอยู่ออก วิธีนี้จะช่วยให้มั่นใจได้ว่าแพ็คเกจทั้งหมดติดตั้งอย่างชัดเจนในโฟลเดอร์ที่ถูกต้องและเพื่อช่วยค้นหาการอ้างอิงเส้นทางที่ไม่ดีตลอดโซลูชัน ถัดไปฉันจะตรวจสอบให้แน่ใจว่าคุณได้ติดตั้งส่วนขยาย Visual Studio ล่าสุด nuget ฉันจะตรวจสอบให้แน่ใจว่าคุณได้ติดตั้ง nuget.exe ล่าสุดในแต่ละโซลูชัน เปิดพร้อมท์คำสั่งและไปที่แต่ละโฟลเดอร์ $ (SolutionDir) \ .nuget \ และดำเนินการคำสั่งต่อไปนี้:
nuget update -self
การตั้งค่าเส้นทางโฟลเดอร์แพคเกจทั่วไปสำหรับ NuGet
เปิดแต่ละ $ (SolutionDir) \ .nuget \ NuGet.Config และเพิ่มสิ่งต่อไปนี้ภายในส่วน <configuration>:
<config>
<add key="repositorypath" value="$\..\..\..\Packages" />
</config>
หมายเหตุ:คุณสามารถใช้พา ธ สัมบูรณ์หรือพา ธ สัมพัทธ์ โปรดทราบว่าหากคุณใช้เส้นทางสัมพัทธ์กับ $ ว่ามันสัมพันธ์กับหนึ่งระดับต่ำกว่าที่ตั้งของ NuGet.Config (เชื่อว่านี่เป็นข้อผิดพลาด)
การตั้งค่าเส้นทางโฟลเดอร์แพคเกจทั่วไปสำหรับ MSBuild และ Visual Studio
เปิดแต่ละ $ (SolutionDir) \ .nuget \ NuGet.targets และแก้ไขหัวข้อต่อไปนี้ (โปรดทราบว่าสำหรับผู้ที่ไม่ใช่ Windows จะมีส่วนอื่นอยู่ด้านล่าง):
<PropertyGroup Condition=" '$(OS)' == 'Windows_NT'">
<!-- Windows specific commands -->
<NuGetToolsPath>$([System.IO.Path]::Combine($(SolutionDir), ".nuget"))</NuGetToolsPath>
<PackagesConfig>$([System.IO.Path]::Combine($(ProjectDir), "packages.config"))</PackagesConfig>
<PackagesDir>$([System.IO.Path]::Combine($(SolutionDir), "packages"))</PackagesDir>
</PropertyGroup>
อัพเดทแพ็คเกจ
<PackagesDir>$([System.IO.Path]::GetFullPath("$(SolutionDir)\..\Packages"))</PackagesDir>
หมายเหตุ: GetFullPath จะแก้ไขเส้นทางสัมพัทธ์ของเราให้เป็นเส้นทางสัมบูรณ์
การกู้คืนแพ็คเกจ nuget ทั้งหมดลงในโฟลเดอร์ทั่วไป
เปิดพรอมต์คำสั่งและข้ามไปแต่ละ $ (SolutionDir) \ .nuget และดำเนินการคำสั่งต่อไปนี้:
nuget restore ..\YourSolution.sln
ณ จุดนี้คุณควรมีโฟลเดอร์ \ packages \ เดียวในตำแหน่งทั่วไปของคุณและไม่มีในโฟลเดอร์โซลูชันใด ๆ ของคุณ ถ้าไม่เช่นนั้นยืนยันเส้นทางของคุณ
แก้ไขการอ้างอิงโครงการ
เปิดไฟล์. csproj ทุกไฟล์ในเท็กซ์เอดิเตอร์และค้นหาการอ้างอิงใด ๆ กับ \ packages และอัพเดตไปยังพา ธ ที่ถูกต้อง ส่วนใหญ่จะเป็น <HintPath> ข้อมูลอ้างอิง แต่ไม่ใช่ทั้งหมด ตัวอย่างเช่น WebGrease และ Microsoft.Bcl.Build จะมีการตั้งค่าเส้นทางแยกต่างหากที่จะต้องมีการปรับปรุง
สร้างโซลูชันของคุณ
เปิดโซลูชันของคุณใน Visual Studio และเริ่มสร้าง หากมันบ่นเกี่ยวกับแพ็คเกจที่ขาดหายไปซึ่งจำเป็นต้องกู้คืนอย่าถือว่าแพคเกจนั้นขาดหายไปและจำเป็นต้องกู้คืน (ข้อผิดพลาดอาจทำให้เข้าใจผิด) อาจเป็นเส้นทางที่ไม่ดีในหนึ่งในไฟล์. csproj ของคุณ ตรวจสอบก่อนว่าจะกู้คืนแพ็คเกจหรือไม่
มีข้อผิดพลาดในการสร้างเกี่ยวกับแพ็คเกจที่หายไปหรือไม่
หากคุณได้ตรวจสอบแล้วว่าเส้นทางในไฟล์. csproj ของคุณนั้นถูกต้องคุณมีสองทางเลือกที่จะลอง หากนี่คือผลลัพธ์ของการอัปเดตรหัสของคุณจากการควบคุมซอร์สโค้ดคุณสามารถลองตรวจสอบสำเนาที่สะอาดและสร้างไฟล์นั้นได้ สิ่งนี้ใช้ได้กับหนึ่งในนักพัฒนาของเราและฉันคิดว่ามีสิ่งประดิษฐ์ในไฟล์. suo หรืออะไรทำนองนั้นที่คล้ายกัน ตัวเลือกอื่นคือบังคับให้แพคเกจการคืนค่าด้วยตนเองโดยใช้บรรทัดคำสั่งในโฟลเดอร์. nuget ของการแก้ปัญหาที่เป็นปัญหา:
nuget restore ..\YourSolution.sln
$
หน้าทางสัมพัทธ์ นอกจากนี้คำตอบสำหรับคำถามของคุณเกี่ยวกับไฟล์ NuGet.Config อยู่ที่นี่ด้วย อันดับแรกจะดูใน. nuget จากนั้นในไดเรกทอรีหลักทั้งหมดจากนั้นไปที่ไฟล์ 'global' ใน AppData ของคุณ: จากนั้นให้นำไปใช้ในลำดับ REVERSE (ไม่ว่ามันจะหมายถึงอะไร)