ฉันสามารถหลีกเลี่ยงการเพิ่ม. dll เหล่านี้เมื่อติดตั้งแพคเกจ NuGet ได้หรือไม่?


10

ฉันเริ่มด้วยการอ่านคำถามที่แนะนำนี้คล้ายกับของฉัน แต่ไม่มีวิธีแก้ปัญหา: ทำไม MSTest.TestAdapter จึงเพิ่ม DLLs ลงในแพ็คเกจ NuGet ของฉัน

คำอธิบายปัญหาด่วน

ฉันเขียนแพคเกจ NuGet และทุกครั้งที่ฉันติดตั้งNUnitและNUnit3TestAdapter .dllได้รับการเพิ่มเข้าในโครงการที่ฉันติดตั้ง ฉันต้องการค้นหาวิธีแก้ไขปัญหานี้

ทำซ้ำขั้นตอน

ฉันผลักที่เก็บคอมไพล์สองแห่งเพื่อสร้างปัญหาที่ฉันกำลังอธิบาย

ClientLibrary/ MainFramework(โครงการที่ฉันสร้างแพ็คเกจ NuGet) - https://github.com/harbourc/client-library-repro-nuget-issue

TargetProject(โปรเจ็กต์นั้นต้องติดตั้งใน) - https://github.com/harbourc/target-project-repro-nuget-issue

คุณสามารถโคลนที่เก็บทั้งสองคืนค่าแพ็คเกจ NuGet และสร้างปัญหาดังต่อไปนี้:

  1. ค้นหา ClientLibrary.1.0.0.nupkg ใน client-library-repro-nuget-issue / ClientLibrary /

  2. เปิดคอนโซลตัวจัดการแพคเกจสำหรับเป้าหมายโครงการ repro-nuget-issue และเรียกใช้

Install-Package C:\Path\To\client-library-repro-nuget-issue\ClientLibrary\ClientLibrary.1.0.0.nupkg
  1. จดบันทึกNUnitและNUnit3TestAdapter .dllของที่ถูกเพิ่มเข้าไปTargetProject- แม้ว่าจะTargetProjectมีNUnitและNUnit3TestAdapterติดตั้งแล้วก็ตาม

ภาพรวมอีกต่อไป

ผมได้สร้างแพคเกจ NuGet ของตัวเองสำหรับการใช้ภายในเรียกว่าและฉันกำลังพยายามที่จะติดตั้งในโครงการอื่นที่จะเรียกว่าClientLibrary TargetProjectนี่คือการแบ่งโครงสร้างอย่างรวดเร็ว:

  • FullSolution.sln
    • MainFramework.csproj
    • ClientLibrary.csproj-> .nupkgสร้างจากสิ่งนี้

โครงการแยก:

  • TargetProject.sln
    • TargetProject.csproj-> ติดตั้ง.nupkgลงบนสิ่งนี้

ClientLibraryมีการอ้างอิงถึงและใช้วิธีการมากมายจากMainFrameworkMainFramework

เมื่อติดตั้งClientLibrary.1.0.0.nupkgลงบนTargetProjectสิ่งต่อไปนี้.dllจะถูกเพิ่มเข้าไปในTargetProject:

nunit.engine.api.dll
nunit.engine.dll
NUnit3.TestAdapter.dll
NUnit3.TestAdapter.pdb

หากฉันลบสิ่งเหล่านี้.dllทุกอย่างจะทำงานได้ดีเพราะTargetProjectมีแพ็คเกจเหล่านั้นติดตั้งอยู่แล้ว พวกมันไม่จำเป็นมันน่ารำคาญที่จะต้องลบมันออกเมื่อทำการติดตั้ง

นี่คือวิธีที่ฉันเพิ่มClientLibraryแพ็กเกจ NuGet ไปที่TargetProject:

  1. สร้างClientLibraryและMainFrameworkโครงการเพื่อสร้าง. dll ของพวกเขา
  2. เปลี่ยนไดเรกทอรีเป็นClientLibraryโฟลเดอร์และเรียกใช้nuget spec

.nuspec ไฟล์ถูกสร้างขึ้น:

<?xml version="1.0"?>
<package >
  <metadata>
    <id>ClientLibrary</id>
    <version>1.0</version>
    <title>Client Library</title>
    <authors>Myself</authors>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>Client library for interacting with my application.</description>
    <dependencies>
      <group targetFramework=".NETFramework4.7.2" />
    </dependencies>
  </metadata>
</package>
  1. เรียกใช้nuget pack -IncludeReferencedProjects- เนื่องจากClientLibraryมีการพึ่งพาMainFramework(และแพ็คเกจอื่น ๆ ที่ใช้โดยMainFramework)

  2. นำทางไปยังTargetProjectเปิด Package Manager Console

  3. วิ่ง Install-Package C:\Path\To\ClientLibrary.1.0.0.nupkg

การติดตั้งทำงานได้สำเร็จและจากนั้น.dllฉันกำลังบ่นเกี่ยวกับการเพิ่ม

ปัญหา:

MainFrameworkมีNUnitและNUnit3TestAdapterแพคเกจติดตั้ง NuGet ClientLibrary ไม่. ดังนั้น.dll's ดูเหมือนจะเพิ่มเพราะพวกเขาจะติดตั้งบนแต่ไม่ได้ติดตั้งMainFramework ClientLibrary(จำClientLibraryข้อมูลอ้างอิงMainFramework.dll)

มีอื่น ๆแพคเกจติดตั้งได้ทั้งบนMainFrameworkและClientLibraryเหล่านี้ไม่ได้มีและ.dllของที่ได้รับการบันทึกTargetProjectเมื่อติดตั้งดังนั้นฉันสมมติว่าปัญหานี้เกิดจากการมีแพคเกจในปัจจุบันแต่ไม่ได้อยู่ในMainFrameworkClientLibrary

ฉันเชื่อว่าฉันสามารถ "แก้ไข" ปัญหานี้ได้โดยการติดตั้งNUnitและNUnit3TestAdapterเข้าสู่ระบบClientLibraryแต่ClientLibraryไม่ได้ใช้แพ็คเกจเหล่านั้นเลย

ฉันจะติดตั้งClientLibraryลงTargetProjectโดยไม่รวมถึงNUnitและNUnit3TestAdapter .dllของและไม่ต้องติดตั้งNUnitและNUnit3TestAdapterลงClientLibrary? ถ้าเป็นไปได้ผมอยากจะบอกClientLibrary.1.0.0.nupkgให้ใช้NUnitและNUnit3TestAdapterแพคเกจที่มีอยู่แล้วTargetProjectติดตั้งบน

หากคำตอบคือ "เป็นไปไม่ได้" นั่นเป็นเรื่องปกติ แต่ฉันต้องการคำอธิบาย - เป้าหมายโดยรวมของฉันสำหรับคำถามนี้คือการได้รับความเข้าใจที่ดีขึ้นเกี่ยวกับวิธีการทำงานของ NuGet และการพึ่งพาและเข้าใจว่าเหตุใดจึงเป็นปัญหาใน ที่แรก. ขอบคุณสำหรับการอ่าน.


1
คุณจะต้องจัดทำโครงการตัวอย่างเพื่อแสดงพฤติกรรม
Lex Li

@LexLi ฉันได้อัปเดตคำอธิบายโครงการของฉันด้วยที่เก็บตัวอย่างสองตัวอย่างที่แสดงพฤติกรรมพร้อมกับขั้นตอนการทำซ้ำ
Christine

3
รหัสแสดง aproach ที่ไม่ดีเพื่อให้มีการขึ้นต่อกันของ NUnit ใน MainFramework.csproj คุณสามารถย้ายพวกเขาไปที่โครงการทดสอบหน่วยแยกเช่น MainFramework.UnitTest.csproj
Lex Li

ที่ทำให้ความรู้สึก - ClientLibraryใช้เพียงบางส่วนของMainFrameworkดังนั้นMainFrameworkแน่นอนสามารถแบ่งออกเป็นMainFramework.FrameworkและMainFramework.Testที่NUnitการอ้างอิงเท่านั้นอยู่ในMainFramework.TestและClientLibraryเพียง MainFramework.FrameworkUtilizes ขอบคุณสำหรับการวิเคราะห์
คริสติน

คำตอบ:


7

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

ป้อนคำอธิบายรูปภาพที่นี่

ในด้านไม่ห้องสมุดลูกค้าจะรวม dll NUnit เพราะพวกเขาถูกเพิ่มเข้าไปในโครงการที่อ้างอิงห้องสมุดลูกค้า

ในขณะที่ในด้านการทำห้องสมุดลูกค้าจะไม่รวม NUnit dll ที่เพราะไม่ได้อ้างอิงโครงการทดสอบ


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