hackage o pacote de dependências e à prova do futuro das bibliotecas
Pergunta
Na secção de dependências de um cabal do arquivo:
Build-Depends: base >= 3 && < 5, transformers >= 0.2.0
Devo estar fazendo algo como
Build-Depends: base >= 3 && < 5, transformers >= 0.2.0 && < 0.3.0
(colocar limites superior em versões de pacotes que dependem)
ou não?
Vou usar um exemplo real:a minha "Lista" pacote em Hackage (Lista de monad transformer e classe)
- Se eu não colocar o limite - o meu pacote poderia quebrar por uma alteração na "transformers"
- Se eu não colocar o limite - um usuário que usa de "transformers", mas está usando uma versão mais recente de que ele não será capaz de usar
lift
eliftIO
comListT
porque é apenas um exemplo de uma destas classes de transformadores-0.2.x
Eu acho que os aplicativos devem sempre colocar limites superiores para que eles nunca quebrar, então, esta pergunta é de apenas cerca de bibliotecas:
Eu uso a versão superior de limite de dependências ou não?
Solução
Há um explícito política Recomendando os limites superiores - consulte em particular a Seção 3 ("Dependências na Cabala"). As outras respostas dão mais uma justificativa para esta política.
Em resumo - o limite superior deve estar na forma de < A.(B+1)
onde A e B são os primeiros elementos da versão atual (A.B.C...
). Isso ocorre porque aumentando A.B
deve significar que a versão quebra APIs antigas.
Outras dicas
Pense nos modos de falha:
Com o limite superior, o seu pacote constrói ou balas de cabala sobre uma dependência de construção insatisfeita. A culpa é claramente atribuída.
Sem o limite superior, o cliente possui uma versão recente dos Transformers e não é compatível com versões anteriores. Seu software não consegue construir; GHC BLATS sobre como seu código não compila. Seu software parece ruim.
Coloque no limite superior.
IMO colocar limites superior no aceitos números de versão é a coisa certa a fazer.Dada a semântica dos números de versão utilizado por Hackage certamente não existe nenhuma garantia que o pacote irá trabalhar, neste caso, transformadores 0.3.0.
Eu não vi nenhum debate real sobre isso embora e não parece ser uma recomendação geral para usar limites superiores, exceto para o pacote base.