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

我必须在python源代码中嵌入代码版本,有什么实际原因吗?,python,versioning,setuptools,Python,Versioning,Setuptools,我必须在源代码中嵌入代码版本,有什么实际原因吗?明确地说,我感兴趣,但也有一些使用\uuuuuuuuuuuuuuuu版本。“嵌入源代码”是指我必须将版本号作为文本写入文件中,而不是通过其他方式填充python字段 在其他语言中,我将构建脚本设置为了解git标记,然后完全通过标记管理版本号。这意味着在repo中永远不会有一个提交来“增加版本号”。我所要做的就是标记新版本的提交并运行构建 作为一个理论上的例子,我可以: def_get_version() command=['git'、'descri

我必须在源代码中嵌入代码版本,有什么实际原因吗?明确地说,我感兴趣,但也有一些使用
\uuuuuuuuuuuuuuuu版本
。“嵌入源代码”是指我必须将版本号作为文本写入文件中,而不是通过其他方式填充python字段

在其他语言中,我将构建脚本设置为了解git标记,然后完全通过标记管理版本号。这意味着在repo中永远不会有一个提交来“增加版本号”。我所要做的就是标记新版本的提交并运行构建

作为一个理论上的例子,我可以:

def_get_version()
command=['git'、'descripe'、'--tags'、'--match''versions/[0-9]*.[0-9]*']
结果=subprocess.run(命令,stdout=subprocess.PIPE).stdout.decode('utf-8')
返回结果.replace('-','+',1).replace('versions/','')
setuptools.setup(
name=“example pkg YOUR USERNAME HERE”#替换为您自己的用户名
版本=\u获取\u版本(),
author=“示例作者”,
作者_电子邮件=”author@example.com",
description=“一个小示例包”,
长描述=长描述,
长\u描述\u内容\u type=“text/markdown”,
url=”https://github.com/pypa/sampleproject",
packages=setuptools.find_packages(),
分类器=[
“编程语言::Python::3”,
“许可证::OSI已批准::MIT许可证”,
“操作系统::独立于操作系统”,
],
python_需要='>=3.6',
)
我不清楚的是这是否有效。是否在上载到软件包存储库之前或由第三方下载时对
setuptools.setup
的结果进行分析?当然,git回购只有在上传之前才可用,而不是在其他人通过pip下载包时可用


同样,我认为如果应用于
\uuu版本\uu
文件,这将完全无法填充,这是正确的吗?

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

人们一直认为将其包含到包中是一种良好的做法,因为当您编写需要检查库版本的代码时,它可能会很有用(在中首次提到并阐明了
\uuuu version\uuu
“dundler”),但由于Python 3.8嵌入:

>>来自importlib.metadata导入版本
>>>版本(“车轮”)
'0.35.1'

因此,您的解决方案可以很好地工作,但我建议您改用它,这将阻止您自己管理子流程。

也许您可以使用github操作或等效工作流来生成verison.py文件,但我认为构建操作使用您的版本来构建构建包文件名?我认为上传或pip安装过程中的版本信息是从文件名中提取出来的?我不知道,也许我错了?你们可能对自动化版本和git标签的项目感兴趣。至于将
\uuuuu version\uuuuuu
属性烧制到源代码中,有些人只是更喜欢这种简单性,中的一个示例也显示了这一点,这可能有助于普及。简而言之,您的软件包的模块级
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
属性只是一种常见的约定,实际上根本不是必需的。在使用现代SCM工具之前,在每个文件的开头都有更改日志注释是很常见的。因此,大多数文件都会编写代码版本。在没有编译的情况下,它会使原本可以通过询问编译时属性来处理的主题变得复杂。因此,python似乎已经确定了在代码中使用版本号的想法:-(