Prefácio
Hoje em dia, existem muitas opções viáveis para hospedar um repositório PyPI. Existem muitos pacotes disponíveis que implementam um servidor de repo PyPI, sendo os mais notáveis:
- Armazém (este é o servidor rodando por trás do pypi.org)
- pypiserver
- pypi-server
- devpi
Existem também outros pacotes, mais ou menos exóticos, como PyPICloud , que carrega arquivos de pacotes diretamente para a instância do Amazon S3. . O Artifactory do JFrog também suporta pacotes python, embora não em edição livre, então só faz sentido se você já está pagando por uma licença. Você pode até criar um repositório local do PyPI usando nada além do stdlib do python, veja minha resposta no SO .
Além disso, este tópico foi discutido várias vezes sobre o SO, com as perguntas mais populares sendo Como criar meu próprio pypi? e < a href="https://stackoverflow.com/questions/18052217"> como criar o índice de repositório pypi local próprio sem espelho? Cuidado com o fato de a primeira pergunta ser bastante antiga e conter principalmente respostas desatualizadas, sendo a segunda mais atualizado.
devpi
No meu trabalho, avaliamos as soluções disponíveis há dois anos e estamos aderindo a devpi
desde então. Desenvolvido pelas mesmas pessoas que estão por trás da popular ferramenta de teste pytest
e da ferramenta de automação de tarefas de CI tox
, devpi
é uma ferramenta versátil que:
- pode hospedar vários repositórios (chamados de índices), permitindo agrupar o acesso ao pacote;
- age como um espelho PyPI por padrão, isso pode ser desativado por demanda;
- fornece um controle de acesso baseado em função para o upload de pacotes;
- oferece uma interface de usuário da web opcional que pode ser personalizada por meio do modelo de página;
- oferece replicação do servidor principal - todas as réplicas sincronizarão automaticamente a base de pacotes do mestre nas alterações;
- pode hospedar a documentação do pacote (Sphinx);
- pode acionar a execução de teste no upload do pacote e exibir os resultados da execução de teste se conectado ao servidor de IC, como o Jenkins;
- tem uma API de plug-in para estender no servidor e no cliente CLI (com base na biblioteca
pluggy
; a mesma usada para estendertox
oupytest
se você estiver familiarizado com eles); Você pode personalizar muitas coisas escrevendo seus próprios plugins, da autenticação aos backends de armazenamento. Existem também vários plugins internos disponíveis na página do Github .
O recurso mais poderoso da IMO são os índices. Um índice define um conjunto de pacotes que podem ser instalados a partir do URL do índice. Por exemplo, imagine uma única devpi
instance com dois índices configurados: index foo
oferece pacote A
e índice bar
oferece B
. Agora você tem dois URLs de repositório:
$ pip install A --index-url=https://my.pypi.org/foo
será bem-sucedido, mas
$ pip install A --index-url=https://my.PyPI.org/bar
falhará. Os índices podem herdar um ao outro no sentido de estender a própria base de pacote, portanto, se bar
herdar foo
, você poderá instalar os dois A
e B
de bar
index.
Isso nos permite configurar facilmente uma política de restrição de pacotes: digamos que temos dois grupos principais de usuários (devs e QA), cada grupo com seu próprio conjunto de pacotes necessários, também desenvolvemos pacotes oferecidos aos clientes e ferramentas para interna usar. Não há problema em agrupá-los com índices:
root/pypi
├── company/base <- contains common packages like pip or setuptools
│ └── company/internal <- in-house tools
│ ├── company/dev <- packages necessary for development
│ │ ├── developer/sandbox <- private index for single developer
│ │ └── developer2/sandbox
│ └── company/qa <- packages for QA (test automation etc)
└── customer/release <- customer packages
Agora, por exemplo, o desenvolvedor configura o URL de índice https://my.pypi.org/developer/sandbox
uma vez e tem acesso a todos os novos pacotes enviados para, por exemplo. company/base
, enquanto o cliente configura o URL de índice https://my.pypi.org/customer/release
, não podendo acessar nenhum pacote de company/internal
.
O root/pypi
é um meta-índice especial: está sempre presente; se um índice o herda, todas as solicitações para instalar pacotes que não estão contidos no índice são intermediadas por proxy para pypi.org. Para desativar o espelhamento pypi.org, simplesmente não herde de root/pypi
.
A política de restrição de uploads também é fácil de configurar por índice: todos os desenvolvedores podem fazer o upload para seus próprios sandboxes privados e company/dev
; todos os QAs podem fazer upload para company/qa
; somente admin pode fazer o upload para company/base
, fazer o upload para company/internal
e os índices do cliente são feitos pelo servidor de IC em compilações noturnas bem-sucedidas.
Consulte devpi docs para todo o processo de instalação e configuração; os documentos são bastante extensos e cobrem a maioria das questões que surgirão.