2016-07-28 9 views
1

Ich (versuche) setuptools zu verwenden, um ein Paket zu bauen. Ich habe versucht, eine Versionsnummer major.minor.mercurial_revision zu verwenden, aber es beschwert sich, dass:Wie man VCS Informationen in setuptools Pakete einbaut

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

Fein. Also schaue ich mir PEP 440 an, die im Grunde sagt "mach das nicht":

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. 

Ich verstehe die Logik hier. Aber wie kann ich die HG-Revision in den Projekt-Metadaten enthalten? Ich kann keine (aktuelle) Dokumentation dafür finden, was die Argumente zu setup.py:setup() beinhalten können, aber die Distutils, die ich gefunden habe here scheint kein Feld dafür zu bieten.

Antwort

0

Sie können dazu eine verwenden.

Lokale Versionsbezeichner dem folgenden Schema entsprechen:

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

In Ihrem Fall diese <major>.<minor>+<mercurial_version> würde, die in 1.0+7ae7970a82c1

0

Wie wäre es nur, es als Attribut in Ihren Python-Code aufzunehmen?

echo '__revision__ = $HG_HASH' > mypackage/revision.py 

Einmal installiert, können Sie:

from mypackage.revision import __revision__ 
print 'build from', __revision__ 

Oder man könnte es in eine Datei schreiben, und beinhaltet, dass in Ihrer Source-Distribution über MANIFEST.in.

Man könnte sogar direkt in den Argumenten zu setup() enthalten, die einfach unbekanntes Schlüsselwort Argumente zu ignorieren scheint: durch Inspektion

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', 
    ) 

Dies gilt nicht überall aufgenommen, aber es ist immer verfügbar, wenn jemand braucht um es zum Debuggen von Informationen oder etwas zu wissen. Weil dies auf setup() beruht, unbekannte Argumente ignorierend - was ich nicht sicher bin, ist ausdrücklich dokumentiertes Verhalten - weiß ich nicht, dass diese Idee tatsächlich eine ist, die ich empfehlen würde.

+0

Denn dann haben Sie ein bekam führen würde untracked Datei in Ihrem Quellcode, die nicht sehr nett ist, und Ihr Build-Skript muss das "Echo" -Bit tun. Es ist alles nicht Standard und die obige Antwort löst es. – lost

+0

Wenn Sie Revisionsinformationen in Ihr Projekt einbinden - über 'setup.py' oder eine andere Datei - erzeugen Sie diese Datei * offensichtlich als Teil Ihres Veröffentlichungsprozesses. Entweder ist es (a) nicht verfolgt oder (b) du aktualisierst es automatisch als Teil deines Freigabeprozesses. – larsks

+0

Hmm. Du hast natürlich Recht. Tatsächlich sind die Probleme ein wenig orthogonal; Remcos Antwort löst Fehler bei der Annahme meiner Versionsnummer, aber um * Zugriff * auf die Versionsnummer von "innerhalb" des Pakets zu bekommen, braucht man ein '__revision__' oder etwas, was Sie vorschlagen. – lost