Em face disso, parece que requirements.txt
e setup.py
são duplicatas tolas, mas é importante entender que enquanto a forma é semelhante, a função pretendida é muito diferente.
O objetivo de um autor de pacote, ao especificar dependências, é dizer "onde quer que você instale este pacote, esses são os outros pacotes necessários para que este pacote funcione".
Por outro lado, o autor da implantação (que pode ser a mesma pessoa em um momento diferente) tem um trabalho diferente, pois diz "aqui está a lista de pacotes que reunimos e testamos e que agora preciso instalar".
O autor do pacote escreve para uma ampla variedade de cenários, porque eles estão enviando seu trabalho para serem usados de maneiras que talvez não conheçam e não têm como saber quais pacotes serão instalados junto com o pacote. Para ser um bom vizinho e evitar conflitos de versão de dependência com outros pacotes, eles precisam especificar o maior número de versões de dependência possível. Isto é o que install_requires
nos setup.py
faz.
O autor da implantação grava para um objetivo muito diferente e muito específico: uma única instância de um aplicativo ou serviço instalado, instalado em um computador específico. Para controlar com precisão uma implantação e garantir que os pacotes corretos sejam testados e implantados, o autor da implantação deve especificar a versão exata e o local de origem de cada pacote a ser instalado, incluindo dependências e dependências. Com essa especificação, uma implantação pode ser aplicada repetidamente em várias máquinas ou testada em uma máquina de teste, e o autor da implantação pode ter certeza de que os mesmos pacotes são implantados sempre. Isto é o que a requirements.txt
faz.
Então você pode ver que, embora ambos pareçam uma grande lista de pacotes e versões, essas duas coisas têm tarefas muito diferentes. E é definitivamente fácil misturar tudo e errar! Mas a maneira correta de pensar sobre isso é que requirements.txt
é uma "resposta" à "pergunta" feita pelos requisitos em todos os vários setup.py
arquivos de pacotes. Em vez de escrevê-lo manualmente, geralmente é gerado dizendo ao pip para olhar para todos os setup.py
arquivos em um conjunto de pacotes desejados, encontrar um conjunto de pacotes que julgue adequado a todos os requisitos e, depois de instalados, "congelar" "essa lista de pacotes em um arquivo de texto (é daí que o pip freeze
nome vem).
Então, a dica:
setup.py
deve declarar as versões de dependência mais baixas possíveis que ainda sejam viáveis. Seu trabalho é dizer com o que um pacote específico pode funcionar.
requirements.txt
é um manifesto de implantação que define todo um trabalho de instalação e não deve ser considerado vinculado a nenhum pacote. Seu trabalho é declarar uma lista exaustiva de todos os pacotes necessários para fazer uma implantação funcionar.
- Como essas duas coisas têm conteúdo e motivos de existência tão diferentes, não é possível simplesmente copiar uma na outra.
Referências:
install_requires
é usado para declarar dependências nos pacotes que são necessários para o pacote funcionar e são usados pelo desenvolvedor do pacote, enquantorequirements.txt
é usado para automatizar a instalação de ambientes, o que permite a instalação de software extra e a fixação da versão e são usados pelos administradores de sistemas que implementam o pacote. pacote. Seu papel e público-alvo diferem significativamente; portanto, tentar combiná-los como os desejos do OP é um verdadeiro erro de design.