【问题标题】:How to include VCS information in setuptools packages如何在 setuptools 包中包含 VCS 信息
【发布时间】:2016-07-28 14:40:58
【问题描述】:

我正在(尝试)使用 setuptools 来构建一个包。我试图使用版本号 major.minor.mercurial_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.`

很好。所以我看一下 PEP 440,它基本上说“不要那样做”:

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() 的参数可以包含哪些内容,但我发现 here 的 distutils 似乎没有为此提供字段。

【问题讨论】:

    标签: python setuptools


    【解决方案1】:

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

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

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

    在您的情况下,这将是 <major>.<minor>+<mercurial_version>,这将导致 1.0+7ae7970a82c1

    【讨论】:

      【解决方案2】:

      将其作为属性包含在 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() 忽略未知参数——我不确定这是明确记录的行为——我不知道这个想法实际上是我推荐的。

      【讨论】:

      • 因为你的源代码中有一个未跟踪的文件,这不是很好,你的构建脚本必须做“回声”位。这都是非标准的,上面的答案解决了它。
      • 如果您在项目中包含修订信息(通过setup.py 或其他文件),您显然是在生成该文件作为发布过程的一部分。因此,要么 (a) 未跟踪,要么 (b) 您在发布过程中自动更新/提交它。
      • 嗯。你当然是对的。事实上,这些问题有点正交。 Remco 的答案解决了让 distutils 接受我的版本号,但是从包的“内部”获取版本号 access 需要 __revision__ 或类似你建议的东西。
      猜你喜欢
      • 1970-01-01
      • 2014-07-20
      • 2011-11-23
      • 1970-01-01
      • 2015-03-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-04
      相关资源
      最近更新 更多