2015-05-19 53 views
5

說我有一包用egg_info -b mytag生成的腳本控制檯腳本如是什麼形式「包===版」的setuptools的要求,目的

from setuptools import setup 
setup(
    name='eg_package', 
    version='0.0.1', 
    description='Trivial test package', 
    packages=[ 
     'eg_package', 
    ], 
    entry_points={ 
     'console_scripts': [ 
      'foo = eg_package.main:main', 
     ] 
    }, 
) 

如果我設置和明確構建標籤具有__requires__ = 'eg-package===0.0.1mytag',即具有3「=」符號。發生這種情況的標籤不是像b1這樣的傳統版本。

起初我以爲這是一個錯誤,但setuptools文檔表明它是一個有效的需求標識符。但是,它不適用於舊版本的setuptools,這會對我們的系統造成問題。

我的問題是"==="是什麼意思,爲什麼現代setuptools使用它?

+1

您可以找到''在=== PEP440 HTTPS的官方說明:// WWW。 python.org/dev/peps/pep-0440/#arbitrary-equality – cel

+0

謝謝,這非常明智。我習慣了早期版本的setuptools的更寬鬆的規則,但我很高興被迫變成更嚴格的版本字符串。遺憾的是這在[docs](https://pythonhosted.org/setuptools/search.html)或[包裝指南](https://packaging.python.org/en/latest/)中未提及。 。 –

+0

我的特別問題是運行最新setuptools的構建系統正在構建debian軟件包,這些軟件包將被安裝到沒有最新setuptools的vanilla ubuntu系統中=>不支持PEP440需求描述。 –

回答

2

Requirement specifier section in pip docs鏈接到official docs for requirement specifiers implemented by setuptoolspkg_resources。它指定了正式的語法,但在語義上沒有提及任何內容。 Overview docs解釋語義,但是說上顯然vv.7介於加入~====什麼東西(安裝使用Python 2.7.9)和16

當文檔失敗,它的時間來諮詢的來源。下載setuptools hg repo並註釋pkg_resources/__init__.py最終將我們帶到changeset 3125與消息「通過使用包裝庫實現PEP 440」。

事實上,PEP 440, Version Specifiers section解釋的語法和語義:

通過在承諾和相關packaging包,我來到了這些明顯的結論,檢查其他文件:

  • ~=永遠不會產生;當處理時,它根據PEP中概述的規則充當過濾器。
  • ===當被處理時,信號回落到較舊的setuptools版本語法和比較邏輯。無論何時產生的版本字符串不符合PEP ,都會生成它。

pkg_resources._vendor.packaging.specifiers._compare_compatible() pkg_resources.parse_version()產生pkg_resources.SetuptoolsLegacyVersion而不是pkg_resources.SetuptoolsVersion