Tôi có thể làm việc xung quanh để thêm các dll này khi cài đặt gói NuGet không?


10

Tôi đã bắt đầu bằng cách đọc qua câu hỏi gợi ý này tương tự câu hỏi của tôi, nhưng không có giải pháp: Tại sao MSTest.TestAd CHƯƠNG lại thêm DLL của nó vào gói NuGet của tôi?

Mô tả sự cố nhanh

Tôi đã viết một gói NuGet và mỗi lần tôi cài đặt nó NUnitNUnit3TestAdapter .dlltôi sẽ được thêm vào dự án mà tôi đã cài đặt. Tôi muốn tìm một giải pháp khắc phục vấn đề này.

Bước repro

Tôi đã đẩy hai kho git tái tạo vấn đề mà tôi đang mô tả.

ClientLibrary/ MainFramework(dự án mà tôi đã tạo gói NuGet) - https://github.com/harbourc/client-l Library-repro-nuget- phát hành

TargetProject(dự án gói đó sẽ được cài đặt vào) - https://github.com/harbourc/target-project-repro-nuget- phát hành

Bạn có thể sao chép cả hai kho lưu trữ, khôi phục các gói NuGet của chúng và tái tạo vấn đề như sau:

  1. Xác định vị trí ClientL Library.1.0.0.nupkg trong client-library-repro-nuget-vấn đề / ClientL Library /

  2. Mở bảng điều khiển quản lý gói cho vấn đề mục tiêu-dự án-repro-nuget và chạy

Install-Package C:\Path\To\client-library-repro-nuget-issue\ClientLibrary\ClientLibrary.1.0.0.nupkg
  1. Lưu ý NUnitNUnit3TestAdapter .dllđược thêm vào TargetProject- ngay cả khi TargetProjectđã có NUnitNUnit3TestAdapterđược cài đặt.

Tổng quan dài hơn

Tôi đã tạo gói NuGet của riêng mình để sử dụng nội bộ, được gọi ClientLibraryvà tôi đang cố gắng cài đặt nó vào một dự án khác, được gọi TargetProject. Đây là một sự cố nhanh chóng của cấu trúc:

  • FullSolution.sln
    • MainFramework.csproj
    • ClientLibrary.csproj-> .nupkgđược tạo từ này

Dự án riêng:

  • TargetProject.sln
    • TargetProject.csproj-> cài đặt .nupkgvào đây

ClientLibrarycó một tài liệu tham khảo MainFrameworkvà sử dụng nhiều phương pháp từ MainFramework.

Khi cài đặt ClientLibrary.1.0.0.nupkglên TargetProject, các mục sau .dllsẽ được thêm vào TargetProject:

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

Nếu tôi xóa chúng .dll, mọi thứ sẽ hoạt động tốt, vì TargetProjectdù sao cũng đã cài đặt các gói đó. Chúng không cần thiết, thật khó chịu khi phải xóa chúng khi cài đặt.

Đây là cách tôi thêm ClientLibrarygói NuGet vào TargetProject:

  1. Xây dựng ClientLibraryMainFrameworkcác dự án để tạo ra các dll của họ
  2. Thay đổi thư ClientLibrarymục vào thư mục và chạynuget spec

.nuspec tập tin được tạo ra:

<?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. Chạy nuget pack -IncludeReferencedProjects- Vì ClientLibrarycó sự phụ thuộc vào MainFramework(và một số gói khác được sử dụng bởi MainFramework)

  2. Điều hướng đến TargetProject, mở Bảng điều khiển quản lý gói

  3. Chạy Install-Package C:\Path\To\ClientLibrary.1.0.0.nupkg

Cài đặt chạy thành công, và sau đó .dlltôi đang phàn nàn về việc được thêm vào.

Vấn đề:

MainFrameworkđã cài đặt NUnitNUnit3TestAdaptercác gói NuGet. ClientLibrary không làm. Vì vậy, .dlldường như được thêm vào vì chúng được cài đặt trên MainFramework, nhưng KHÔNG được cài đặt trên ClientLibrary. (Hãy nhớ, ClientLibrarytham khảo MainFramework.dll.)

các gói khác được cài đặt trên cả hai MainFrameworkClientLibrary, và các gói này không .dllđược thêm vào TargetProjectkhi cài đặt, vì vậy tôi cho rằng vấn đề là do có các gói có trong MainFrameworknhưng KHÔNG có ClientLibrary.

Tôi tin rằng tôi có thể "khắc phục" sự cố này bằng cách cài đặt NUnitvà tải NUnit3TestAdapterlên ClientLibrary, nhưng ClientLibrarythực tế không sử dụng các gói đó, vì vậy có vẻ như không cần thiết.

Làm thế nào tôi có thể cài đặt ClientLibraryvào TargetProjectmà không bao gồm các NUnitNUnit3TestAdapter .dll's, và không cần phải cài đặt NUnitNUnit3TestAdapterlên ClientLibrary? Nếu có thể, tôi muốn nói ClientLibrary.1.0.0.nupkgđể sử dụng NUnitNUnit3TestAdaptercác gói đã được cài đặt trên TargetProject.

Nếu câu trả lời là "Không thể", điều đó tốt, nhưng tôi muốn một lời giải thích - mục tiêu chung của tôi cho câu hỏi này là để hiểu rõ hơn về cách thức hoạt động của NuGet và phụ thuộc và hiểu tại sao điều này lại là một vấn đề trong địa điểm đầu tiên. Cảm ơn bạn đã đọc.


1
Bạn sẽ phải cung cấp các dự án mẫu để minh họa hành vi.
Lex Li

@LexLi Tôi đã cập nhật mô tả dự án của mình với hai kho lưu trữ mẫu minh họa hành vi, cùng với các bước repro.
Christine

3
Mã này cho thấy một aproach xấu có các phụ thuộc NUnit trong MainFramework.csproj. Bạn có thể chuyển chúng sang một dự án thử nghiệm đơn vị riêng biệt, chẳng hạn như MainFramework.UnitTest.csproj không?
Lex Li

Điều đó có ý nghĩa - ClientLibrarychỉ sử dụng một số phần của MainFramework, vì vậy MainFrameworkchắc chắn có thể được chia thành MainFramework.FrameworkMainFramework.Test, nơi mà các NUnitphụ thuộc chỉ tồn tại MainFramework.TestClientLibrarychỉ sử dụng MainFramework.Framework. Cảm ơn đã phân tích.
Christine

Câu trả lời:


7

Nói chung, cách tốt nhất là giữ tất cả các thử nghiệm của bạn và các gói NuGet tương ứng trong dự án của riêng họ. Sau đó, đảm bảo không có dự án nào tham chiếu dự án thử nghiệm.

nhập mô tả hình ảnh ở đây

Về phía không , Thư viện khách hàng sẽ bao gồm các dll NUnit vì chúng đã được thêm vào một dự án mà Thư viện khách hàng tham khảo.

Trong khi về phía làm , Thư viện khách sẽ không bao gồm các dll NUnit vì không tham chiếu dự án thử nghiệm.


2
Cảm ơn bạn về sự cố và giải thích - Tôi đã thực hiện thực tiễn này bằng cách chia nhỏ dự án của tôi giống như bạn và một người dùng khác đã đề xuất. Điều này cảm thấy giống như thực hành tốt hơn nhiều so với những gì tôi đã làm trước đây, và vấn đề của tôi cũng đã được giải quyết.
Christine
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.