Usando setuptools
epbr
Não existe uma maneira padrão de gerenciar versão, mas a maneira padrão de gerenciar seus pacotes é setuptools
.
A melhor solução que encontrei no geral para gerenciar a versão é usar setuptools
com a pbr
extensão. Esta é agora a minha maneira padrão de gerenciar versão.
A configuração do seu projeto para o pacote completo pode ser um exagero para projetos simples, mas se você precisar gerenciar a versão, provavelmente estará no nível certo para definir tudo. Fazer isso também torna seu pacote liberável no PyPi para que todos possam fazer o download e usá-lo com o Pip.
O PBR move a maioria dos metadados das setup.py
ferramentas e para um setup.cfg
arquivo que é usado como fonte para a maioria dos metadados, que pode incluir a versão. Isso permite que os metadados sejam empacotados em um executável usando algo como pyinstaller
se necessário (nesse caso, você provavelmente precisará dessas informações ) e separa os metadados dos outros scripts de gerenciamento / configuração de pacotes. Você pode atualizar diretamente a string de versão setup.cfg
manualmente, e ela será puxada para a *.egg-info
pasta ao criar as versões do pacote. Seus scripts podem acessar a versão a partir dos metadados usando vários métodos (esses processos são descritos nas seções abaixo).
Ao usar o Git para VCS / SCM, essa configuração é ainda melhor, pois extrai muitos metadados do Git para que seu repo possa ser sua principal fonte de verdade para alguns dos metadados, incluindo versão, autores, changelogs, etc. Para a versão especificamente, ele criará uma string de versão para o commit atual com base nas tags git no repositório.
Como o PBR puxa a versão, o autor, o changelog e outras informações diretamente do seu repositório git, então alguns dos metadados setup.cfg
podem ser deixados de fora e gerados automaticamente sempre que uma distribuição é criada para o seu pacote (usando setup.py
)
Versão atual em tempo real
setuptools
extrairá as informações mais recentes em tempo real usando setup.py
:
python setup.py --version
Isso puxará a versão mais recente do setup.cfg
arquivo ou do repositório git, com base na confirmação mais recente que foi feita e nas tags existentes no repositório. Este comando não atualiza a versão em uma distribuição.
Atualizando a versão
Quando você cria uma distribuição com setup.py
( py setup.py sdist
por exemplo, por exemplo), todas as informações atuais serão extraídas e armazenadas na distribuição. Essencialmente, ele executa o setup.py --version
comando e armazena as informações da versão na package.egg-info
pasta em um conjunto de arquivos que armazenam metadados de distribuição.
Nota sobre o processo para atualizar os metadados da versão:
Se você não estiver usando o pbr para extrair dados da versão do git, basta atualizar o setup.cfg diretamente com as novas informações da versão (fácil o suficiente, mas verifique se essa é uma parte padrão do seu processo de lançamento).
Se você estiver usando o git e não precisar criar uma fonte ou distribuição binária (usando python setup.py sdist
ou um dos python setup.py bdist_xxx
comandos), a maneira mais simples de atualizar as informações do repositório git na <mypackage>.egg-info
pasta de metadados é apenas executar o python setup.py install
comando. Isso executará todas as funções do PBR relacionadas à extração de metadados do repositório git e atualizará a .egg-info
pasta local , instalará executáveis de scripts para quaisquer pontos de entrada que você definiu e outras funções que você poderá ver na saída ao executar este comando.
Observe que a .egg-info
pasta geralmente é excluída do armazenamento no repositório git em .gitignore
arquivos Python padrão (como o Gitignore.IO ), pois pode ser gerada a partir da sua fonte. Se for excluído, verifique se você possui um "processo de liberação" padrão para atualizar os metadados localmente antes da liberação e se qualquer pacote carregado no PyPi.org ou de outra forma distribuído deve incluir esses dados para ter a versão correta. Se você deseja que o repositório Git contenha essas informações, você pode excluir arquivos específicos de serem ignorados (por exemplo, adicionar !*.egg-info/PKG_INFO
a .gitignore
)
Acessando a versão de um script
Você pode acessar os metadados da compilação atual nos scripts Python no próprio pacote. Por versão, por exemplo, existem várias maneiras de fazer isso que encontrei até agora:
## This one is a new built-in as of Python 3.8.0 should become the standard
from importlib-metadata import version
v0 = version("mypackage")
print('v0 {}'.format(v0))
## I don't like this one because the version method is hidden
import pkg_resources # part of setuptools
v1 = pkg_resources.require("mypackage")[0].version
print('v1 {}'.format(v1))
# Probably best for pre v3.8.0 - the output without .version is just a longer string with
# both the package name, a space, and the version string
import pkg_resources # part of setuptools
v2 = pkg_resources.get_distribution('mypackage').version
print('v2 {}'.format(v2))
## This one seems to be slower, and with pyinstaller makes the exe a lot bigger
from pbr.version import VersionInfo
v3 = VersionInfo('mypackage').release_string()
print('v3 {}'.format(v3))
Você pode colocar um desses diretamente no seu __init__.py
para o pacote extrair as informações da versão da seguinte maneira, semelhante a algumas outras respostas:
__all__ = (
'__version__',
'my_package_name'
)
import pkg_resources # part of setuptools
__version__ = pkg_resources.get_distribution("mypackage").version