从git标记获取版本(通过pbr)

2024-09-28 19:00:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我用pbr来包装。它从git标记获取版本并将其应用于设置.py在

现在我还想在软件包中提供这个版本。例如有一个__version__属性。我可以使用pbr库来完成这项工作吗?在

还有另一个库:versioneer也从git标记中提取版本,但这会增加一个额外的要求。我更喜欢从pbr获得此功能


Tags: py标记git功能版本属性versionversioneer
3条回答

如果您可以将pbr作为包的运行时依赖项,那么可以使用pbr.version中的^{}类:

from pbr.version import VersionInfo

package_name='my_package'
info = VersionInfo(package_name)

print(info.version_string())

(另见How to load package version into __version__ variable if you are using pbr?

考虑一下setuptools_scm,它在可用时从git或hg标记中提取一个版本,或者生成一个适当的开发版本(例如,hgvs-1.2.5.dev6+hb5d989061852.d20181124)。该版本与硬编码版本一样写入包元数据。不需要非标准的运行时支持。在

虽然我在许多项目中使用过setuptools\u scm,但我没有使用PBR。我很好奇,做了一个简单的演示:

snafu$ head setup.py setup.cfg pbrversiontest/*.py
==> setup.py <==
from setuptools import setup

setup(
    setup_requires=[
        "pbr",
        "setuptools_scm"
    ],
    pbr=True,
    use_scm_version=True,
)

==> setup.cfg <==
[metadata]
name = pbrversiontest
summary = test whether we can use pbr and setuptools_scm

[files]
packages =
    pbrversiontest

==> pbrversiontest/__init__.py <==
# This is straight from setuptools_scm README
from pkg_resources import get_distribution, DistributionNotFound
try:
    __version__ = get_distribution(__name__).version
except DistributionNotFound:
    # package is not installed
    pass

==> pbrversiontest/__main__.py <==
# this isn't required   only for the demo
import pbrversiontest

print("version is " + pbrversiontest.__version__)

在开发目录中,您可能会有这样一个会话:

^{pr2}$

在正确设置setuptoolspbr之后,可以使用以下几种方法:

import pkg_resources  # part of setuptools

# I don't like this one because the version method is hidden
v1 = pkg_resources.require("my_package_name")[0].version
print('v1 {}'.format(v1))

# This is my favorite - the output without .version is just a longer string with
# both the package name, a space, and the version string
v2 = pkg_resources.get_distribution('my_package_name').version
print('v2 {}'.format(v2))

from pbr.version import VersionInfo

# This one seems to be slower, and with pyinstaller makes the exe a lot bigger
v3 = VersionInfo('my_package_name').release_string()
print('v3 {}'.format(v3))

# Update, new option as of Python 3.8 (credit: sinoroc)
# In Python 3.8, importlib.metadata is part of the stdlib,
# which removes run-time dependencies on `pbr` or `setuptools`
import importlib.metadata

__version__ = importlib.metadata.version('my_package_name')

如果需要从命令行执行此操作,可以执行以下操作:

^{pr2}$

或者甚至运行设置.py脚本中的脚本(如果包始终在本地安装):

from subprocess import Popen, PIPE

(output, err) = Popen('py setup.py  version'.split(' '),
                      stdout=PIPE, stderr=PIPE, text=True).communicate()
if err: print('ERROR: "{}"'.format(err))
else: print('setup.py  version = {}'.format(output))

注意:有关使用子进程启动和读取stdout等的更多详细信息,尤其是在Python的旧版本(3.7之前)上。在

然后可以将__version__添加到包__init__.py中,如下所示:

__all__ = (
    '__version__',
    'my_package_name'
)

# Or substitute a different method and assign the result to __version__
import pkg_resources  # part of setuptools

__version__ = pkg_resources.get_distribution("my_package_name").version

其他一些问题和解答可能有助于设置以及如何更新版本和其他信息的详细信息,特别是如果从Git repo获取信息(来自标记、作者和ChangeLog信息的版本):

相关问题 更多 >