2016-07-28 34 views
1

我(试图)使用setuptools来构建一个包。我试图使用版本号major.minor.mercurial_revision,但它抱怨说:如何在setuptools包中包含VCS信息

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.` 

好。所以我看看PEP440里面说基本上说“不要那么做”:

As hashes cannot be ordered reliably such versions are not permitted in the 
public version field. As with semantic versioning, the public .devN 
suffix may be used to uniquely identify such releases for publication, 
while the original DVCS based label can be stored in the project metadata. 

我理解这里的逻辑。但如何可以我在项目元数据中包含hg修订版?我无法找到setup.py:setup()的参数可以包含的任何(最新)文档,但是我发现的distutils之一here似乎没有为此提供一个字段。

回答

0

您可以使用local version identifier来完成此操作。

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

<public version identifier>[+<local version label>]

你的情况,这将是<major>.<minor>+<mercurial_version>,这将导致到1.0+7ae7970a82c1

0

把它作为一个属性包含在你的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='[email protected]', 
     url='https://www.python.org/sigs/distutils-sig/', 
     packages=['distutils', 'distutils.command'], 
     revision='7ae7970a82c1', 
    ) 

这不会取得任何记录,但它始终是可通过检查,如果有人需要知道它的调试信息或什么的。因为这依赖setup()忽略未知参数 - 我不确定是明确记录的行为 - 我不知道这个想法实际上是我会推荐的。

+0

因为那么你已经有了一个在你的源代码中未跟踪的文件,这不是很好,你的构建脚本必须做“回声”位。这都是非标准的,上面的答案解决了它。 – lost

+0

如果您在项目中包含修订版本信息 - 通过'setup.py'或其他文件 - 您显然会*生成*该文件作为发布过程的一部分。因此,无论是(a)未跟踪,还是(b)您都会自动更新/提交它作为发布过程的一部分。 – larsks

+0

嗯。你当然是对的。事实上,这些问题有点正交; Remco的答案解决了让distutils接受我的版本号,但是从包内的“内部”获取*版本号需要一个'__revision__'或者类似你的建议。 – lost

相关问题