Posso solucionar a adição desses .dlls ao instalar o pacote NuGet?

10

Comecei lendo esta pergunta sugerida semelhante à minha, mas não havia solução: por que o MSTest.TestAdapter adiciona suas DLLs ao meu pacote NuGet?

Descrição Rápida do Problema

Eu escrevi um pacote NuGet, e cada vez que eu instalá-lo, NUnite NUnit3TestAdapter .dll's ser adicionados ao projeto que eu instalado. Quero encontrar uma solução que resolva esse problema.

Etapas de reprodução

Enviei dois repositórios git que reproduzem o problema que estou descrevendo.

ClientLibrary/ MainFramework(projeto a partir do qual eu gerei o pacote NuGet) - https://github.com/harbourc/client-library-repro-nuget-issue

TargetProject(projeto em que o pacote deve ser instalado) - https://github.com/harbourc/target-project-repro-nuget-issue

Você pode clonar os dois repositórios, restaurar os pacotes NuGet e reproduzir o problema da seguinte maneira:

  1. Localize ClientLibrary.1.0.0.nupkg em client-library-repro-nuget-issue / ClientLibrary /

  2. Abra o console do gerenciador de pacotes para o target-project-repro-nuget-issue e execute

Install-Package C:\Path\To\client-library-repro-nuget-issue\ClientLibrary\ClientLibrary.1.0.0.nupkg
  1. Observe os NUnite NUnit3TestAdapter .dlladicionados TargetProject, embora TargetProjectjá os tenha instalado NUnite NUnit3TestAdapterinstalado.

Visão geral mais longa

Criei meu próprio pacote NuGet para uso interno, chamado ClientLibrary, e estou tentando instalá-lo em outro projeto, chamado TargetProject. Aqui está um rápido detalhamento da estrutura:

  • FullSolution.sln
    • MainFramework.csproj
    • ClientLibrary.csproj-> .nupkggerado a partir disso

Projeto separado:

  • TargetProject.sln
    • TargetProject.csproj-> instalar .nupkgneste

ClientLibrarytem uma referência MainFrameworke usa muitos métodos de MainFramework.

Ao instalar ClientLibrary.1.0.0.nupkgno TargetProject, os seguintes .dllitens são adicionados a TargetProject:

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

Se eu excluir esses .dllitens, tudo funcionará bem, porque TargetProjectesses pacotes já estão instalados de qualquer maneira. Eles não são necessários, é apenas irritante ter que excluí-los durante a instalação.

Aqui está como estou adicionando o ClientLibrarypacote NuGet a TargetProject:

  1. Compilar ClientLibrarye MainFrameworkprojetos para gerar seus .dlls
  2. Mude o diretório para a ClientLibrarypasta e executenuget spec

.nuspec arquivo é gerado:

<?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. Executar nuget pack -IncludeReferencedProjects- porque ClientLibrarydepende MainFramework(e vários outros pacotes usados ​​por MainFramework)

  2. Navegue para TargetProject, abra o Package Manager Console

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

A instalação é executada com sucesso e, em seguida .dll, é sobre isso que eu estou reclamando.

Problema:

MainFrameworkpossui NUnite NUnit3TestAdapterpacotes NuGet instalados. ClientLibrary não. Portanto, os .dllparecem ser adicionados porque estão instalados MainFramework, mas NÃO instalados ClientLibrary. (Lembre-se de ClientLibraryreferências MainFramework.dll.)

Existem outros pacotes instalados em ambos MainFrameworke ClientLibrary, e esses não têm .dllos que são adicionados TargetProjectna instalação, portanto, estou assumindo que o problema seja causado pela presença de pacotes, MainFrameworkmas NÃO por ClientLibrary.

Eu acredito que eu posso "consertar" este problema instalando NUnite NUnit3TestAdaptersobre ClientLibrary, mas ClientLibraryna verdade não usar esses pacotes em tudo, por isso parece desnecessário.

Como posso instalar ClientLibraryno TargetProjectsem incluir os NUnite NUnit3TestAdapter .dll, sem ter que instalá NUnit- NUnit3TestAdapterlos ClientLibrary? Se possível, gostaria de dizer ClientLibrary.1.0.0.nupkgpara usar os pacotes NUnite NUnit3TestAdapterque estão instalados TargetProject.

Se a resposta for "Não é possível", tudo bem, mas eu gostaria de uma explicação - meu objetivo geral para esta pergunta é entender melhor como o NuGet e as dependências funcionam e entender por que isso foi um problema no primeiro lugar. Obrigado pela leitura.

Christine
fonte
11
Você precisará fornecer projetos de amostra para ilustrar o comportamento.
Lex Li
@LexLi Atualizei a descrição do meu projeto com dois repositórios de exemplo que ilustram o comportamento, juntamente com as etapas de reprodução.
Christine
3
O código mostra uma abordagem incorreta para ter dependências NUnit no MainFramework.csproj. Você pode movê-los para um projeto de teste de unidade separado, como MainFramework.UnitTest.csproj?
Lex Li
Isso faz sentido - ClientLibraryusa apenas algumas partes de MainFramework, portanto, MainFrameworkcertamente pode ser dividido em MainFramework.Frameworke MainFramework.Test, onde as NUnitdependências só existem MainFramework.Teste são utilizadas ClientLibraryapenas MainFramework.Framework. Obrigado pela análise.
Christine

Respostas:

7

Em geral, é uma boa prática manter todos os seus testes e pacotes NuGet correspondentes em seu próprio projeto. Em seguida, verifique se nenhum dos projetos faz referência ao projeto de teste.

insira a descrição da imagem aqui

No lado não , a Biblioteca do Cliente incluirá as DLLs do NUnit porque elas foram adicionadas a um projeto mencionado pela Biblioteca do Cliente.

Considerando que, com afazeres lado, Biblioteca cliente não incluirá o NUnit dlls porque nem referência o projeto de teste.

sspaniel
fonte
2
Obrigado pelo detalhamento e explicação - implementei essa prática dividindo meu projeto como você e outro usuário sugeriram. Parece uma prática muito melhor do que o que eu estava fazendo anteriormente, e meu problema também foi resolvido.
Christine