Bisakah saya mencari cara menambahkan .dlls ini ketika menginstal paket NuGet?

10

Saya mulai dengan membaca pertanyaan yang disarankan ini mirip dengan saya, tetapi tidak ada resolusi: Mengapa MSTest.TestAdapter menambahkan DLL-nya ke dalam paket NuGet saya?

Deskripsi Masalah Cepat

Saya menulis paket NuGet, dan setiap kali saya menginstalnya, NUnitdan NUnit3TestAdapter .dllditambahkan ke proyek yang saya instal. Saya ingin mencari solusi yang memperbaiki masalah ini.

Langkah repro

Saya telah mendorong dua repositori git yang mereproduksi masalah yang saya jelaskan.

ClientLibrary/ MainFramework(proyek dari mana saya menghasilkan paket NuGet) - https://github.com/harbourc/client-library-repro-nuget-issue

TargetProject(memproyeksikan paket yang akan diinstal) - https://github.com/harbourc/target-project-repro-nuget-issue

Anda dapat mengkloning kedua repositori, memulihkan paket NuGet mereka, dan mereproduksi masalah sebagai berikut:

  1. Temukan ClientLibrary.1.0.0.nupkg di client-library-repro-nuget-issue / ClientLibrary /

  2. Buka konsol manajer paket untuk menjalankan target-project-repro-nuget dan menjalankannya

Install-Package C:\Path\To\client-library-repro-nuget-issue\ClientLibrary\ClientLibrary.1.0.0.nupkg
  1. Perhatikan NUnitdan NUnit3TestAdapter .dllyang ditambahkan ke TargetProject- meskipun TargetProjectsudah memiliki NUnitdan NUnit3TestAdapterdiinstal.

Tinjauan yang lebih panjang

Saya telah membuat paket NuGet saya sendiri untuk penggunaan internal, dipanggil ClientLibrary, dan saya mencoba untuk menginstalnya ke proyek lain, dipanggil TargetProject. Berikut ini rincian strukturnya:

  • FullSolution.sln
    • MainFramework.csproj
    • ClientLibrary.csproj-> .nupkgdihasilkan dari ini

Proyek terpisah:

  • TargetProject.sln
    • TargetProject.csproj-> instal .nupkgke ini

ClientLibrarymemiliki referensi ke MainFramework, dan menggunakan banyak metode dari MainFramework.

Saat menginstal ClientLibrary.1.0.0.nupkgke TargetProject, berikut ini .dllsedang ditambahkan ke TargetProject:

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

Jika saya menghapus ini .dll, semuanya berfungsi dengan baik, karena TargetProjectsudah menginstal paket-paket itu. Mereka tidak perlu, itu hanya menjengkelkan harus menghapusnya saat menginstal.

Inilah cara saya menambahkan ClientLibrarypaket NuGet ke TargetProject:

  1. Bangun ClientLibrarydan MainFrameworkproyek untuk menghasilkan .dlls mereka
  2. Ubah direktori menjadi ClientLibraryfolder dan jalankannuget spec

.nuspec file dihasilkan:

<?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. Jalankan nuget pack -IncludeReferencedProjects- Karena ClientLibrarymemiliki ketergantungan pada MainFramework(dan beberapa paket lain yang digunakan oleh MainFramework)

  2. Arahkan ke TargetProject, buka Package Manager Console

  3. Lari Install-Package C:\Path\To\ClientLibrary.1.0.0.nupkg

Instalasi berjalan dengan sukses, dan kemudian itu .dll saya keluhkan tentang ditambahkan.

Masalah:

MainFrameworktelah NUnitdan NUnit3TestAdapterpaket NuGet diinstal. ClientLibrary tidak. Jadi, .dllsepertinya ditambahkan karena sudah diinstal MainFramework, tetapi TIDAK diinstal ClientLibrary. (Ingat, ClientLibraryreferensi MainFramework.dll.)

Ada paket lain yang diinstal pada keduanya MainFrameworkdan ClientLibrary, dan ini tidak memiliki .dllyang ditambahkan pada TargetProjectsaat instalasi, jadi saya berasumsi masalah disebabkan oleh memiliki paket hadir MainFrameworktetapi TIDAK masuk ClientLibrary.

Saya percaya saya bisa "memperbaiki" masalah ini dengan menginstal NUnitdan NUnit3TestAdapterke ClientLibrary, tetapi ClientLibrarytidak benar-benar menggunakan paket tersebut sama sekali, sehingga tampaknya tidak perlu.

Bagaimana saya bisa menginstal ClientLibraryke TargetProjecttanpa menyertakan NUnitdan NUnit3TestAdapter .dll, dan tanpa harus menginstal NUnitdan NUnit3TestAdapterke ClientLibrary? Jika memungkinkan, saya ingin memberi tahu ClientLibrary.1.0.0.nupkguntuk menggunakan NUnitdan NUnit3TestAdapterpaket yang sudah diinstal pada TargetProject.

Jika jawabannya "Tidak mungkin", itu baik-baik saja, tetapi saya ingin penjelasan - tujuan keseluruhan saya untuk pertanyaan ini adalah untuk mendapatkan pemahaman yang lebih baik tentang bagaimana NuGet dan dependensi bekerja, dan memahami mengapa ini menjadi masalah dalam tempat pertama. Terima kasih telah membaca.

Christine
sumber
1
Anda harus memberikan contoh proyek untuk menggambarkan perilaku tersebut.
Lex Li
@LexLi Saya telah memperbarui deskripsi proyek saya dengan dua repositori sampel yang menggambarkan perilaku, bersama dengan langkah-langkah repro.
Christine
3
Kode ini menunjukkan aproach buruk untuk memiliki dependensi NUnit di MainFramework.csproj. Bisakah Anda memindahkan mereka ke proyek uji unit terpisah, seperti MainFramework.UnitTest.csproj?
Lex Li
Itu masuk akal - ClientLibraryhanya menggunakan beberapa bagian MainFramework, jadi MainFrameworkpasti dapat dibagi menjadi MainFramework.Frameworkdan MainFramework.Test, di mana NUnitdependensi hanya ada MainFramework.Test, dan ClientLibraryhanya memanfaatkan MainFramework.Framework. Terima kasih atas analisisnya.
Christine

Jawaban:

7

Secara umum, praktik terbaik untuk menyimpan semua tes Anda dan paket NuGet yang sesuai dalam proyek mereka sendiri. Kemudian pastikan tidak ada proyek referensi proyek uji.

masukkan deskripsi gambar di sini

Di sisi jangan , Perpustakaan Klien akan menyertakan dll NUnit karena mereka ditambahkan ke proyek yang dirujuk oleh Perpustakaan Klien.

Sedangkan di sisi lakukan , Perpustakaan Klien tidak akan menyertakan dll NUnit karena tidak ada referensi proyek pengujian.

sspaniel
sumber
2
Terima kasih atas gangguan dan penjelasannya - Saya menerapkan praktik ini dengan membagi proyek saya seperti yang Anda dan pengguna lain sarankan. Ini terasa seperti praktik yang jauh lebih baik daripada apa yang saya lakukan sebelumnya, dan masalah saya juga telah diselesaikan.
Christine