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, NUnit
dan NUnit3TestAdapter
.dll
ditambahkan 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:
Temukan ClientLibrary.1.0.0.nupkg di client-library-repro-nuget-issue / ClientLibrary /
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
- Perhatikan
NUnit
danNUnit3TestAdapter
.dll
yang ditambahkan keTargetProject
- meskipunTargetProject
sudah memilikiNUnit
danNUnit3TestAdapter
diinstal.
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
->.nupkg
dihasilkan dari ini
Proyek terpisah:
TargetProject.sln
TargetProject.csproj
-> instal.nupkg
ke ini
ClientLibrary
memiliki referensi ke MainFramework
, dan menggunakan banyak metode dari MainFramework
.
Saat menginstal ClientLibrary.1.0.0.nupkg
ke TargetProject
, berikut ini .dll
sedang 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 TargetProject
sudah menginstal paket-paket itu. Mereka tidak perlu, itu hanya menjengkelkan harus menghapusnya saat menginstal.
Inilah cara saya menambahkan ClientLibrary
paket NuGet ke TargetProject
:
- Bangun
ClientLibrary
danMainFramework
proyek untuk menghasilkan .dlls mereka - Ubah direktori menjadi
ClientLibrary
folder 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>
Jalankan
nuget pack -IncludeReferencedProjects
- KarenaClientLibrary
memiliki ketergantungan padaMainFramework
(dan beberapa paket lain yang digunakan olehMainFramework
)Arahkan ke
TargetProject
, buka Package Manager Console- Lari
Install-Package C:\Path\To\ClientLibrary.1.0.0.nupkg
Instalasi berjalan dengan sukses, dan kemudian itu .dll
saya keluhkan tentang ditambahkan.
Masalah:
MainFramework
telah NUnit
dan NUnit3TestAdapter
paket NuGet diinstal. ClientLibrary
tidak. Jadi, .dll
sepertinya ditambahkan karena sudah diinstal MainFramework
, tetapi TIDAK diinstal ClientLibrary
. (Ingat, ClientLibrary
referensi MainFramework.dll
.)
Ada paket lain yang diinstal pada keduanya MainFramework
dan ClientLibrary
, dan ini tidak memiliki .dll
yang ditambahkan pada TargetProject
saat instalasi, jadi saya berasumsi masalah disebabkan oleh memiliki paket hadir MainFramework
tetapi TIDAK masuk ClientLibrary
.
Saya percaya saya bisa "memperbaiki" masalah ini dengan menginstal NUnit
dan NUnit3TestAdapter
ke ClientLibrary
, tetapi ClientLibrary
tidak benar-benar menggunakan paket tersebut sama sekali, sehingga tampaknya tidak perlu.
Bagaimana saya bisa menginstal ClientLibrary
ke TargetProject
tanpa menyertakan NUnit
dan NUnit3TestAdapter
.dll
, dan tanpa harus menginstal NUnit
dan NUnit3TestAdapter
ke ClientLibrary
? Jika memungkinkan, saya ingin memberi tahu ClientLibrary.1.0.0.nupkg
untuk menggunakan NUnit
dan NUnit3TestAdapter
paket 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.
ClientLibrary
hanya menggunakan beberapa bagianMainFramework
, jadiMainFramework
pasti dapat dibagi menjadiMainFramework.Framework
danMainFramework.Test
, di manaNUnit
dependensi hanya adaMainFramework.Test
, danClientLibrary
hanya memanfaatkanMainFramework.Framework
. Terima kasih atas analisisnya.Jawaban:
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.
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.
sumber