为什么我必须在 python 源代码中嵌入代码版本,有什么实际原因吗?

Phi*_*ing 5 python versioning setuptools

为什么我必须在源代码中嵌入代码版本,有什么实际原因吗?显然我感兴趣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',
)
Run Code Online (Sandbox Code Playgroud)

我不清楚的是这是否有效。是setuptools.setup在上传到包存储库之前还是由第三方下载时解析的结果?当然,git repo 仅在上传之前可用,而不是在其他人通过 pip 下载包时可用。

同样,我认为如果应用于__version__文件将完全无法填充,我是否正确?

jer*_*myr 5

从技术上讲,您不必将版本嵌入到您的包中。将版本传递给setuptools.setup()将确保它将保存在包元数据中以供打包机制处理(例如 setuptools、pip、诗歌等)。

将它包含在包中被认为是一种很好的做法,因为当您编写需要检查库版本的代码时它可能很有用(__version__“dundler”在PEP 8 中首次提到并在PEP 396 中进行了澄清),但可能不再需要,因为 Python 3.8 嵌入了importlib.metadata

>>> from importlib.metadata import version
>>> version("wheel")
'0.35.1'
Run Code Online (Sandbox Code Playgroud)

因此,您的解决方案可以正常工作,但我建议您改用setuptools-scm,这将阻止您自己管理子流程。