【发布时间】:2021-01-15 14:26:28
【问题描述】:
我必须在源代码中嵌入代码版本有什么实际原因吗?明确地,我对setup.py 感兴趣,但也有人使用__version__。 “嵌入源代码”是指我必须将版本号作为文本写入文件中,而不是通过其他方式填充 python 字段。
在其他语言中,我设置了构建脚本以了解 git 标签,然后完全通过标签管理版本号。这意味着在 repo 中永远不会提交“碰撞版本号”。我所要做的就是标记新版本的提交并运行构建。
作为一个理论上的例子,我可能会:
def _get_version()
command = ['git', 'describe', '--tags', '--match' 'versions/[0-9]*.[0-9]*']
result = subprocess.run(command, stdout=subprocess.PIPE).stdout.decode('utf-8')
return result.replace('-', '+', 1).replace('versions/', '')
setuptools.setup(
name="example-pkg-YOUR-USERNAME-HERE", # Replace with your own username
version=_get_version(),
author="Example Author",
author_email="author@example.com",
description="A small example package",
long_description=long_description,
long_description_content_type="text/markdown",
url="https://github.com/pypa/sampleproject",
packages=setuptools.find_packages(),
classifiers=[
"Programming Language :: Python :: 3",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
],
python_requires='>=3.6',
)
我不清楚这是否可行。 setuptools.setup 的结果是在上传到包存储库之前还是在第三方下载时解析的?当然,git repo只有在上传之前才可用,不是别人通过pip下载的包。
同样,如果将其应用于 __version__ 文件,我是否认为这将完全无法填充?
【问题讨论】:
-
也许您可以使用 github 操作或等效工作流来生成 verison.py 文件,有趣的想法
-
我认为构建操作使用您的版本来构建构建的包文件名?我认为上传或 pip 安装期间的版本信息是从文件名中提取的?我不知道,也许我错了?
-
你可能对
setuptools_scm项目感兴趣,它可以自动执行版本和 git 标记。至于将__version__属性刻录到源中,有些人只是更喜欢这种简单性,the style guide 中的示例也显示了它,这可能有助于普及。简短的回答是,你的包的模块级别__version__属性只是一个常见的约定,根本不需要。 -
@wim 是的,我认为它可以追溯到更长时间。在现代 SCM 工具之前,通常在每个文件的开头在 cmets 中都有一个更改日志。因此,大多数文件都会写入代码版本。如果没有编译,它会使原本可以通过询问编译时属性来处理的主题变得复杂。所以python似乎已经确定了代码中版本号的想法。 :-(
标签: python versioning setuptools