O engenheiro de software Jordan Mora nos apresenta Python Poetry e sua implementação para um gerenciamento de dependências conveniente e descontraído.
Você já entrou em um novo projeto Python ou revisou um antigo e, enquanto configurava seu ambiente, começou a receber aqueles “não é possível instalar a dependência X porque a versão do pacote tem dependências conflitantes ”problemas com as dependências do projeto? Então você verificou o arquivo de requisitos e descobriu que a dependência ofensiva não tem uma versão fixada ou, pior, nem existe. Bem, você não está sozinho; aconteceu comigo uma ou duas vezes.
Quando isso acontece, a melhor solução é sempre:
- Verifique a versão com outro colega de trabalho
- Adicione-o ao arquivo de requisitos
- Execute novamente o processo de instalação
- Espero que isso não aconteça com a próxima dependência
- Repita
Você pode ver que é muito reativo, porque não impede que aconteça novamente e, mais cedo ou mais tarde, acontecerá. Esse pensamento permaneceu na minha cabeça. Existe uma solução para este problema comum? Algo como npm para projetos front-end?
A maneira antiga
A maneira usual de instalar dependências em um projeto Python é usando pip. Com pip, você adiciona uma dependência com o pip instalar X e, em seguida, escreva-o com a versão fixada (por exemplo, requests==2.26.0) no arquivo requirements.txt, para que da próxima vez, um novato só precise executar pip instalar -r requisitos.txt para instalá-los.
O problema com essa abordagem é que quando as dependências também possuem subdependências, talvez você nem sempre obtenha a mesma versão, pois elas não são especificadas no arquivo requirements.txt. Outro problema com esse processo é que você pode esquecer de adicionar a dependência ao arquivo de requisitos. É aqui que entra a Poesia Python.
O que torna a poesia Python atraente
Poesia usa um arquivo TOML em vez de um arquivo de texto para rastrear dependências e um arquivo de bloqueio para rastrear dependências e subdependências. Cada vez que as dependências do projeto forem instaladas, você sempre obterá as mesmas versões do arquivo de bloqueio. A poesia vai além e também salva o hash de um pacote, já que alguns mantenedores podem atualizar o pacote sem alterar a versão.
O Poetry vem com uma CLI conveniente para instalar dependências, portanto o pip não é mais necessário. Ao instalar as dependências, elas são automaticamente adicionadas ao arquivo TOML, evitando a terrível tarefa de lembrar os pacotes adicionados ao projeto.
Python Poetry reforça o uso de ambientes virtuais. Se você ainda não estiver usando um, ele criará um novo ambiente virtual para isolar dependências entre diferentes projetos. Se você estiver usando Docker, pode desativar esse recurso, pois não adianta usar ambientes virtuais dentro de containers.
Ao contrário da maneira antiga, o Poetry oferece a capacidade de atualizar todos os seus pacotes e, dependendo da especificação de dependência que você está usando, pode ser um patch ou uma atualização menor (recomenda-se uma pesquisa completa para atualizações maiores).
A especificação de dependência refere-se à restrição de versão que você aplica às suas dependências. Você pode usar restrições de circunflexo, til ou curinga, ou até mesmo especificar um intervalo de versões aceitáveis. Você também pode usar git, caminho e URL e dependências de origem.
Outro recurso interessante do Poetry é que quando você remove uma dependência que não precisa mais, ele também remove suas subdependências, o que não é o caso do pip. Isso evitará dependências órfãs em seu ambiente.
Por fim, o Poetry oferece a capacidade de separar as dependências principais, aquelas que você precisa para fazer seu projeto funcionar, das dependências de desenvolvimento, que são usadas principalmente para fins de depuração. Isso resulta em um ambiente de produção livre de dependências desnecessárias.
Devo observar que o Poetry também é capaz de empacotar e publicar bibliotecas, mas vou me concentrar apenas no gerenciamento de dependências.
Compondo seu primeiro poema
Não há melhor maneira de entender algo do que ver por si mesmo, então seguiremos um pequeno tutorial sobre como migrar um projeto existente para Python Poetry. Presumo que você já instalou o Python versão 3.7+ e o git. Se você estiver se sentindo aventureiro, você pode usar um projeto que você possui ou com o qual está trabalhando, mas fornecerei uma maquete do projeto Django para este tutorial. A versão do Python Poetry no momento da redação deste artigo é 1.3.1.
Primeiramente, você pode instalar o Python Poetry executando o comando:
curl -sSL python3-
Você pode verificar se o Poetry foi instalado com sucesso executando poesia –versão. Você também pode correr lista de poesia para exibir a lista de comandos disponíveis.
A seguir, vá para este repositório GitHub de demonstração e clone-o em sua máquina local; é apenas um projeto Django vazio com um arquivo requirements.txt.
Agora que temos o cenário pronto, vamos prosseguir com a migração.
Inicializando Poesia
A primeira etapa é inicializar Python Poetry em seu projeto, então vá em frente e execute poesia inicial dentro do repositório. Um prompt interativo aparecerá para configurar o arquivo TOML. Você pode usar as sugestões padrão, mas certifique-se de que sua versão do Python corresponda ao campo Versão compatível do Python. Quando você chegar ao “Gostaria de definir suas principais dependências de forma interativa?”Seção, basta enviar“não.”Em seguida, ele perguntará se você deseja definir suas dependências de desenvolvimento de forma interativa; novamente, escreva “não.”Por fim, será solicitado que você confirme suas configurações; enviar “sim.”
Migrando suas dependências
Como você já possui um arquivo requirements.txt, a maneira mais fácil de migrar suas dependências é executando o comando:
cat requirements.txt xargs poetry add
O Poetry adicionará cada dependência ao arquivo TOML e tentará resolver quaisquer conflitos, e então gravará o arquivo de bloqueio. Caso você não esteja utilizando um ambiente virtual, as dependências serão instaladas em um ambiente virtual recém-criado.
Agora que a poesia tem todas as suas dependências em sua lista, você pode verificá-la executando espetáculo de poesia.
Como o arquivo requisitos.txt não é mais necessário, você pode se livrar dele.
Limpando subdependências
Como você provavelmente tem subdependências listadas como dependências principais, podemos nos livrar delas. Quando você quiser atualizar dependências de alto nível, não haverá restrições.
Execute o comando:
poetry show --tree
E você verá quais são subdependências.
Tornando as dependências atualizáveis
A etapa final é tornar suas dependências atualizáveis. Pessoalmente, eu só uso atualizações de patch, pois geralmente são correções e patches de segurança. Faço atualizações menores e maiores somente depois de ler os changelogs e ter certeza de que é algo que queremos adicionar ao projeto.
Você pode usar a especificação de dependência (mencionada anteriormente no artigo) que melhor lhe convier. Você pode abrir o arquivo TOML novamente e editar a versão de cada dependência adicionando a restrição de versão (til, circunflexo, curinga, etc.) ao número da versão. No meu caso, usei restrições de til.
Agora, Django e Djangorestframework dependências podem receber atualizações (patch). Na próxima vez que uma atualização for lançada para qualquer uma dessas dependências, você poderá atualizá-las com o comando:
poetry update
Isso tentará atualizar todas as dependências. Você também pode especificar as dependências que deseja atualizar. Caso sejam encontradas atualizações, o Poetry resolverá os conflitos de dependência e executará a atualização. Depois disso, ele atualizará o arquivo de bloqueio.
Neste caso, se você executar a atualização e, supondo que tenha feito as mesmas alterações que eu fiz, você verá Djangorestframework será atualizado da versão 3.10.0 para 3.10.3, que é o patch mais recente no momento da redação deste artigo.
Você pode conferir o produto final aqui no branch migrado do repositório.
Próximos passos
A partir de agora, você pode usar Poetry para adicionar e remover dependências de e para seu projeto, apenas usando a CLI. Caso você faça uma atualização fora de sua restrição, você precisará executar o comando add com a nova versão.
Para iniciantes no projeto, obter exatamente as mesmas versões de pacote da última pessoa que atualizou o arquivo de bloqueio é tão fácil quanto executar instalação de poesia.
Conclusão
Semelhante ao npm, Python Poetry é uma ferramenta poderosa para gerenciamento de dependências que resolve muitos dos problemas presentes no uso do arquivo requisitos.txt junto com o pip. Ele também traz mais funcionalidades e a CLI é muito fácil de usar. Ele pode ser aplicado a projetos Python novos e existentes, facilitando a adição, remoção e atualização de dependências à medida que o projeto evolui.
Espero que esta ferramenta possa ser usada em muitos projetos daqui para frente. Provou ser uma das melhores ferramentas que já usei para ajudar a mim e minha equipe a manter um projeto atualizado sem se tornar uma tarefa complicada.
Se você estiver interessado em aprender mais sobre Poesia Python, confira a documentação de seguindo este link.
Se você gostou deste artigo, confira um de nossos outros artigos sobre Python.
- 8 melhores estruturas GUI Python
- 8 melhores bibliotecas Python para ciência de dados
- Melhores bibliotecas Python para desenvolvedores modernos
- 8 melhores bibliotecas de análise de sentimento em Python
- 4 melhores bibliotecas de web scraping em Python
Fonte: BairesDev