Sou acadêmico, e não programador, e tenho muitos anos de experiência escrevendo programas em Python para meu próprio uso, para apoiar minha pesquisa. Meu projeto mais recente provavelmente será útil para muitos outros, além de mim, e estou pensando em lançá-lo como uma biblioteca Python de código aberto.
No entanto, parece haver alguns obstáculos a atravessar entre um projeto pessoal em funcionamento e uma biblioteca que pode ser instalada e usada sem dor por outras pessoas. Esta pergunta é sobre os primeiros passos que devo tomar para começar a trabalhar em direção a um lançamento público.
Atualmente, eu tenho um único repositório git que contém meu código que usa a biblioteca e a própria biblioteca, e eu uso o git como um botão de desfazer de emergência, caso algo quebre. Tudo isso funciona bem para um único usuário, mas obviamente não é apropriado se eu quiser liberá-lo. Onde eu quero terminar é que minha biblioteca está em um repositório separado e pode ser instalada por outras pessoas usando pip
e possui uma API estável.
Aprender a usar o setuptools etc. provavelmente não é tão difícil assim que pretendo publicá-lo - meu problema é saber como devo trabalhar para chegar a esse ponto.
Então, minha pergunta é: quais são os primeiros passos que você deve tomar para começar a preparar um projeto de biblioteca Python para consumo público? Como devo reorganizar minha estrutura de diretórios, repositório git etc. para começar a trabalhar para o lançamento público da biblioteca?
De maneira mais geral, seria muito útil se houver recursos que sejam úteis ao tentar fazer isso pela primeira vez. Indicadores sobre as melhores práticas e erros a serem evitados etc. também seriam muito úteis.
Alguns esclarecimentos: as respostas atuais estão tratando de uma pergunta do tipo "como posso tornar minha biblioteca Python uma boa para outras pessoas usarem?" Isso é útil, mas é diferente da pergunta que pretendia fazer.
Atualmente, estou no início de uma longa jornada para lançar meu projeto. O núcleo da minha implementação funciona (e funciona muito bem), mas estou me sentindo sobrecarregado com a quantidade de trabalho que tenho pela frente e estou procurando orientações sobre como navegar no processo. Por exemplo:
Atualmente, o código da minha biblioteca está acoplado ao meu próprio código específico de domínio que o utiliza. Ele vive em uma subpasta e compartilha o mesmo repositório git. Eventualmente, ele precisará ser transformado em uma biblioteca independente e colocado em seu próprio repositório, mas continuo procrastinando isso porque não sei como fazê-lo. (Nem como instalar uma biblioteca no 'modo de desenvolvimento' para que eu ainda possa editá-la, nem como manter os dois repositórios git em sincronia.)
Minhas doutrinas são concisas, porque sei que eventualmente terei que usar o Sphinx ou alguma outra ferramenta. Mas essas ferramentas parecem não ser fáceis de aprender, então isso se torna um subprojeto importante e eu continuo adiando.
Em algum momento, preciso aprender a usar o setuptools ou alguma outra ferramenta para empacotá-lo e rastrear as dependências, que são bastante complexas. Não tenho certeza se preciso fazer isso agora ou não, e a documentação é um labirinto absoluto para um novo usuário, por isso continuo decidindo fazê-lo mais tarde.
Eu nunca tive que fazer testes sistemáticos, mas definitivamente o farei para este projeto, então tenho que (i) aprender o suficiente sobre testes para saber qual metodologia é adequada para o meu projeto; (ii) aprender quais ferramentas estão disponíveis para minha metodologia escolhida; (iii) aprender a usar minha ferramenta escolhida; (iv) implementar conjuntos de testes etc. para o meu projeto. Este é um projeto em si.
Pode haver outras coisas que eu tenho que fazer também. Por exemplo, jonrsharpe postou um link útil que menciona git-flow, tox, TravisCI, virtualenv e CookieCutter, nenhum dos quais eu tinha ouvido falar antes. (O post é de 2013, então eu também tenho que trabalhar para descobrir quanto ainda está atual.)
Quando você junta tudo isso, é uma enorme quantidade de trabalho, mas tenho certeza de que posso fazer tudo se continuar insistindo e não tiver pressa. Meu problema é saber como dividi-lo em etapas gerenciáveis que podem ser executadas uma de cada vez.
Em outras palavras, estou perguntando quais são as medidas concretas mais importantes que posso tomar agora, para alcançar um produto liberável eventualmente. Se eu tiver um fim de semana gratuito, em quais dessas coisas devo me concentrar? Qual (se houver) pode ser feito isoladamente dos outros, para que eu possa pelo menos dar um passo sem precisar fazer a coisa toda? Qual é a maneira mais eficiente de aprender essas coisas para que eu ainda tenha tempo para me concentrar no próprio projeto? (Tendo em mente que tudo isso é essencialmente um projeto de hobby, não é meu trabalho.) Existe algo que eu realmente não preciso fazer , economizando uma quantidade enorme de tempo e esforço?
Todas as respostas são muito apreciadas, mas gostaria especialmente de receber respostas que se concentrem nesses aspectos de gerenciamento de projetos, com referência específica ao desenvolvimento moderno do Python.