Cas*_*bel 32
最好将此作为包装的一部分,而不是在每次提交后执行.
有两个主要选项:
使用git-archive到包装,并使用export-subst属性.不幸的是,您可以替代的东西仅限于占位符git log --format=....例如,您可以__version__ = $Format:%H$在您的文件中写入,放入<filename> export-subst.gitattributes,并在运行git archive时,将其更改为您要归档的提交的完整哈希值.这只是你要求的,但我更喜欢下一个选项.
自己做它作为打包过程的一部分(通常是编译包的构建过程)和使用git describe.这将为你提供一个漂亮的漂亮字符串v1.7.4.1-59-ge3d3f7d,意思是"59提交超过标记v1.7.4.1,在提交时ge3d3f7d",然后你可以在打包/构建时以某种方式插入代码中的正确位置.这就是Git本身所做的事情; 结果被转储到一个文件,其内容被读入makefile,然后通过-D预处理器选项传递给构建,并直接放入各种文件名(例如发布tarball).
如果你真的,真的想在每次提交后都这样做,你可以使用post-commit钩子,但是只有你(以及你提供钩子的那些)才能拥有它,而且很可能会失去同步 - 你还必须有一个结账后挂钩,依此类推.对于创建需要此版本号的任何进程来自己获取它真的更好.
你也可以使用涂抹/清洁过滤器,它更像你真正想要的(而不是简单地在每次提交后).
Pin*_*ino 11
除了 Versioneer 之外的另一种可能性是setuptools_scm.
通过添加以下内容setup.py(或相应地修改它),我已经成功地实现了与 OP 非常相似的东西:
from setuptools import setup
setup(
...,
use_scm_version=True,
setup_requires=['setuptools_scm'],
...,
)
Run Code Online (Sandbox Code Playgroud)
并且,为了__version__自动更新,将此添加到__init__.py我的包中:
from pkg_resources import get_distribution, DistributionNotFound
try:
__version__ = get_distribution(__name__).version
except DistributionNotFound:
# package is not installed
pass
Run Code Online (Sandbox Code Playgroud)
对于那些在2018年发现此问题的人,您还可以使用Versioneer。启用后,它将version在构建时根据最新的Git标签自动在模块中setup.py和__version__模块中设置。
例如,如果您在标记处构建项目1.0.0,则Versioneer会将项目的版本设置为1.0.0。如果再执行两次提交,则无需检入就进行编辑,然后进行构建,Versioneer会将版本设置为1.0.0+2.g1076c97.dirty。
当然,您可以自定义Versioneer将哪些标签识别为版本标签。
这也是大型项目(例如pandas和matplotlib)如何处理其版本控制的方式。
| 归档时间: |
|
| 查看次数: |
13340 次 |
| 最近记录: |