为了简化Python打包,我正在尝试迁移到使用pbr。然而,我无法弄清如何将软件包的版本暴露到“__version__”变量中。这非常重要,因为我有很多软件包用户依赖于“version”变量的存在。人们应该能够执行:
import somemodule
print(somemodule.__version__)
import somemodule
print(somemodule.__version__)
由于现有答案在一些安装设置方面不够清晰,所以这里提供一些更多的背景信息。
首先,如果手动跟踪版本,则在setup.cfg
中更新您的版本字符串。
否则,如果从git仓库获取版本和其他信息:
py setup.py sdist
生成您的发布包并更新基于git信息的本地文件(AUTHORS
、ChangeLog等)。注意:从更新的Git标签生成新版本的最快命令是python setup.py install
,但我看到有一个警告不要使用它。它对我来说工作得很好,但可能只是我的特定设置。使用sdist
或bdist_xxx
将生成一个完整的分发包,如果您没有使用它,需要将其删除。
__init__.py
文件my_package/init.py
all = ('__version__',)
from pbr.version import VersionInfo
# Check the PBR version module docs for other options than release_string()
__version__ = VersionInfo('<my_package>').release_string()
然后,在使用该软件包的脚本中:
my_script.py
import my_package
print(my_package.__version__)
欲查看更多详细信息,请参考pbr.version
模块文档。
我不确定这是否是最佳方法,但我发现另一个软件包正在做类似的事情:模拟。
__all__ = (
'__version__',
'version_info'
)
from pbr.version import VersionInfo
_v = VersionInfo('mock').semantic_version()
__version__ = _v.release_string()
version_info = _v.version_tuple()
setup.py
中使用 pbr 时,它不需要依赖关系,但当我尝试在我的命令行脚本中使用它时,我必须在 requirements.txt
中列出它。 - Lucassetup_requires=['pbr']
。但同意这不是一个很干净的解决方案... - AuHau
__init__.py
中的第一行不应该是__all__ = ('__version__',)
吗?请注意,要加上逗号将值变成元组,而不是字符串。 - akaihola