【问题标题】:Is there any practical reason why I must have a code version embedded in python source code?为什么我必须在 python 源代码中嵌入代码版本有什么实际原因吗?
【发布时间】: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


【解决方案1】:

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

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

>>> from importlib.metadata import version
>>> version("wheel")
'0.35.1'

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

【讨论】:

    猜你喜欢
    • 2015-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-29
    • 2023-02-20
    相关资源
    最近更新 更多