Python 如何在setuptools软件包中包含VCS信息

Python 如何在setuptools软件包中包含VCS信息,python,setuptools,Python,Setuptools,我正在(尝试)使用setuptools构建一个包。我试图使用版本号major.minor.mercurial\u revision,但它抱怨: The version specified ('1.0.7ae7970a82c1') is an invalid version, this may not work as expected with newer versions of setuptools, pip, and PyPI. Please see PEP 440 for more deta

我正在(尝试)使用setuptools构建一个包。我试图使用版本号
major.minor.mercurial\u revision
,但它抱怨:

The version specified ('1.0.7ae7970a82c1') is an invalid version, this may
not work as expected with newer versions of setuptools, pip, and PyPI.
Please see PEP 440 for more details.`
好的。我看了一下政治公众人物440,上面写着“不要那样做”:


我理解这里的逻辑。但是如何在项目元数据中包含hg修订版呢?对于
setup.py:setup()
的参数可以包含哪些内容,我找不到任何(最新的)文档,但是我找到的distutils似乎没有为此提供字段。

在Python代码中将其作为属性包含怎么样

echo '__revision__ = $HG_HASH' > mypackage/revision.py
安装后,您可以:

from mypackage.revision import __revision__
print 'build from', __revision__
或者您可以将其写入一个文件,并通过
MANIFEST.in
将其包含在源代码分发中

您甚至可以将其直接包含在
setup()
的参数中,这似乎只是忽略未知的关键字参数:

setup(name='Distutils',
      version='1.0',
      description='Python Distribution Utilities',
      author='Greg Ward',
      author_email='gward@python.net',
      url='https://www.python.org/sigs/distutils-sig/',
      packages=['distutils', 'distutils.command'],
      revision='7ae7970a82c1',
     )

这不会在任何地方被记录下来,但如果有人需要知道它以获取调试信息或其他信息,那么它总是可以通过检查获得。因为这依赖于
setup()
忽略未知参数——我不确定这是否是明确记录的行为——我不知道这个想法实际上是我推荐的。

在Python代码中把它作为属性包含怎么样

echo '__revision__ = $HG_HASH' > mypackage/revision.py
安装后,您可以:

from mypackage.revision import __revision__
print 'build from', __revision__
或者您可以将其写入一个文件,并通过
MANIFEST.in
将其包含在源代码分发中

您甚至可以将其直接包含在
setup()
的参数中,这似乎只是忽略未知的关键字参数:

setup(name='Distutils',
      version='1.0',
      description='Python Distribution Utilities',
      author='Greg Ward',
      author_email='gward@python.net',
      url='https://www.python.org/sigs/distutils-sig/',
      packages=['distutils', 'distutils.command'],
      revision='7ae7970a82c1',
     )
这不会在任何地方被记录下来,但如果有人需要知道它以获取调试信息或其他信息,那么它总是可以通过检查获得。因为这依赖于
setup()
忽略未知参数——我不确定这是否是明确记录的行为——我不知道这个想法实际上是我推荐的。

您可以使用

本地版本标识符必须符合以下方案:

[+]

在您的情况下,这将是
+
,这将导致
1.0+7ae7970a82c1

您可以使用

本地版本标识符必须符合以下方案:

[+]


在您的情况下,这将是
+
,这将导致
1.0+7ae7970a82c1

,因为您的源代码中有一个未跟踪的文件,这不是很好,并且您的构建脚本必须执行“echo”位。这都是非标准的,上面的答案解决了这一问题。如果您通过
setup.py
或其他文件在项目中包含修订信息,则显然是在发布过程中生成该文件。所以要么是(a)未跟踪,要么(b)在发布过程中自动更新/提交它。你当然是对的。事实上,这些问题有点正交;Remco的答案解决了让distutils接受我的版本号的问题,但是要从包的“内部”访问版本号需要
\uuuuuu revision\uuuuu
或者类似您建议的东西。因为这样一来,您的源代码中就有一个未跟踪的文件,这不是很好,而且您的构建脚本必须执行“echo”位。这都是非标准的,上面的答案解决了这一问题。如果您通过
setup.py
或其他文件在项目中包含修订信息,则显然是在发布过程中生成该文件。所以要么是(a)未跟踪,要么(b)在发布过程中自动更新/提交它。你当然是对的。事实上,这些问题有点正交;Remco的回答解决了让distutils接受我的版本号的问题,但要从软件包的“内部”访问版本号,需要一个
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。