Políticas nas versões de dependências do NuGet ao desenvolver uma biblioteca

5

Estou construindo uma biblioteca C # e tenho algumas dependências por meio dos pacotes do NuGet. Estou tentando minimizar a barreira de entrada e usar as versões iniciais dos pacotes de dependência. Por exemplo eu uso Newtonsoft.Json da v6.0.1, mas a versão atual é v9x.

Isso ocorre quando as pessoas instalam meu pacote, mas não têm a versão mais recente do Json.Net - para não forçá-las a atualizar suas referências. Isso funciona, mas eu não gosto muito disso - eu tenho que trabalhar com uma versão de biblioteca desatualizada. E para os casos em que as pessoas realmente têm a versão mais recente, elas são forçadas a adicionar bindingRedirect em seus app.config ou web.config .

Existe uma maneira melhor de lidar com o inferno de versionamento? Eu estou esperando por alguma mágica onde eu possa dizer "compile este código, inclua esta biblioteca dependente, mas ignore o número da versão". Isso é possível?

    
por trailmax 18.11.2016 / 00:24
fonte

2 respostas

5

Não há nenhum inferno de controle de versão. Este é especificamente o objetivo do NuGet: as diferentes versões do mesmo pacote podem ser instaladas lado a lado. A única limitação é que você não pode fazer referência a diferentes versões no mesmo projeto . Mas quais versões de bibliotecas são referenciadas pelos pacotes dos quais eu dependo são irrelevantes para o meu projeto.

Na maioria dos casos, você não pode evitar essa situação se usar bibliotecas de terceiros. Imagine que você dependa de uma biblioteca de terceiros A e de uma biblioteca de terceiros B. A biblioteca A usa uma versão específica do Json.Net. A biblioteca B usa outra versão. O que você faz? Você pede ao autor de uma dessas bibliotecas para atualizar ou fazer downgrade das dependências? Você joga uma das bibliotecas e passa os dois anos seguintes reescrevendo-a apenas para usar uma versão específica do Json.Net?

Como autor de uma biblioteca, você não deve se preocupar com a versão do Json.Net que seus clientes usam em seus projetos, ou sobre as versões do Json.Net usadas por bibliotecas de terceiros, porque você ganhou acertar de qualquer maneira. Um cliente usará a versão 6; outro - versão 8. Sua biblioteca será instalada lado a lado com outras bibliotecas usando a versão 7 e as que usam a versão 9.

This is for cases when people install my package, but don't have the latest version of Json.Net - not to force them to update their references.

Isso funciona em um caso raro de pessoas que estão usando a versão 6.0.1 da biblioteca. E falha para todos que usam a versão 6.0.0. E 5. *. E 4. *. E 6.0.2. E 6.0.3. Você entendeu a foto.

A única coisa que você deve se preocupar é a imagem que você dá do seu projeto. Se você usa uma versão desatualizada, as pessoas podem pensar:

Ew, this looks old. Why is this guy using a library which is not used any longer for the last three years? I think he just doesn't maintain his project any longer. I'll try one which is actually maintained.

Por outro lado, se você estiver usando a versão mais recente de uma biblioteca de terceiros, o que poderia acontecer? A pessoa pode descobrir que sua biblioteca está usando uma versão mais recente e decide atualizar seu próprio projeto. Ou continue usando a versão antiga, porque essa também é uma opção válida.

    
por 18.11.2016 / 01:00
fonte
0

Para acompanhar a minha solução: eu dependo de todas as versões mais recentes das bibliotecas que preciso, o pacote NuGet que produzi especifica a dependência das versões mais recentes dos pacotes NuGet dependentes.

Para resolver o problema da versão mais antiga de bibliotecas no código do cliente bindingRedirect in web.config ou app.config pode ser aplicado para apontar para qualquer versão da biblioteca instalada:

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
            <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
            <bindingRedirect oldVersion="0.0.0.0-9.0.0.0" newVersion="X.X.X.X" />
        </dependentAssembly>
    </assemblyBinding>
</runtime>

em que X.X.X.X é a versão instalada da biblioteca. Embora, nesse caso, os clientes precisem tomar cuidado ao instalar meu NuGet para que suas dependências não sejam atualizadas.

    
por 30.11.2016 / 12:34
fonte