Benötigen Python-Projekte eine MANIFEST.in und was sollte darin enthalten sein?

120

Das Handbuch "Python Distribute" (war auf python-distribute.org, aber diese Registrierung ist abgelaufen) fordert mich auf, doc/txtDateien einzuschließen, und .pyDateien werden in die MANIFEST.inDatei ausgeschlossen

In der Sourcing-Dokumentation wird angegeben, dass nur sdist verwendet MANIFEST.inund nur die von Ihnen angegebenen .pyDateien und Dateien enthält. Es sagt mir auch, dass ich verwenden soll python setup.py sdist --manifest-only, um ein zu generieren MANIFEST, aber Python sagt mir, dass dies nicht existiert

Ich schätze, dass diese aus verschiedenen Versionen von Python stammen und das Distributionssystem völlig durcheinander ist, aber vorausgesetzt, ich verwende Python 3 und setuptools(das neue, das Distribute enthält, aber jetzt Setuptools genannt wird, nicht die alten Setuptools, die nur für Distributionswerkzeuge veraltet waren wieder in Distribute gebracht und in Setuptools umbenannt werden .....)

und ich folge der 'Standard'-Ordnerstruktur und setup.py-Datei,

  1. Benötige ich eine MANIFEST.in?
  2. Was soll drin sein?
  3. Wann werden all diese verschiedenen Paketsysteme und -methoden zu einem einzigen einfachen Prozess zusammengefasst?
Neil Walker
quelle

Antworten:

117

Betreff: "Brauche ich ein MANIFEST.in?

Nein, Sie müssen nicht verwenden MANIFEST.in. Beide distutilsund setuptoolsenthalten im Quellverteilungspaket alle in setup.py- modules, package python files README.txtund test/test*.py. Wenn dies alles ist, was Sie im Distributionspaket haben möchten, müssen Sie es nicht verwenden MANIFEST.in.

Wenn Sie die einzuschließenden Standarddateien bearbeiten (hinzufügen oder entfernen) möchten, müssen Sie verwenden MANIFEST.in.

Re: Was sollte drin sein?

Das Verfahren ist einfach:

  1. Stellen Sie sicher, dass setup.pySie (mithilfe von setupArgumenten) alle Dateien enthalten, die für die Ausführung des Programms wichtig sind (Module, Pakete, Skripte ...).

  2. Stellen Sie klar, ob einige Dateien hinzugefügt oder ausgeschlossen werden müssen. Wenn beides nicht benötigt wird, ist keine Verwendung erforderlich MANIFEST.in.

  3. Wenn MANIFEST.innötig, erstellen Sie es. Normalerweise fügen Sie dort tests*/*.pyDateien hinzu, README.rstwenn Sie diese nicht verwenden README.txt, docsDateien und möglicherweise einige Datendateien für die Testsuite, falls erforderlich.

Beispielsweise:

include README.rst
include COPYING.txt

Um es zu testen, führen Sie python setup.py sdistden unter erstellten Tarball aus und untersuchen Sie ihn dist/.

Wann werden all diese verschiedenen Paketsysteme ...

Ein Vergleich der heutigen Situation und vor zwei Jahren - die Situation ist viel besser - setuptoolsist der richtige Weg. Sie können die Tatsache ignorieren, distutilsist ein bisschen gebrochen und ist niedriges Niveau Basis für setuptoolsso setuptoolswird von euch kümmern , diese Dinge zu verstecken.

BEARBEITEN : Die letzten Projekte, die ich pbrzum Erstellen von Verteilungspaketen mit drei Zeilen setup.pyund Rest in setup.cfgund verwende requirements.txt. Keine Notwendigkeit, sich um MANIFEST.inandere seltsame Dinge zu kümmern . Auch wenn das Paket etwas mehr Dokumentation verdient. Siehe http://docs.openstack.org/developer/pbr/

Jan Vlcinsky
quelle
1
Nach meiner begrenzten Erfahrung müssen Sie, wenn Sie Dateien einschließen möchten, die nicht in einem Python-Modul enthalten sind (dir mit init .py), MANIFEST.in verwenden und den Befehl sdist(means: source Distribution ) verwenden. Wenn Sie bedenken , dass bdistund bdist_wheelsind binär und nur in Ihrem Python - Pfad installiert werden soll, ist dies sinnvoll. (Wohin würden diese Nicht-Modul-Dateien und -Verzeichnisse gehen? In /usr/local/lib/python2.7/dist-packages/? Sicher nicht.) Aber es ist erwähnenswert, da es verwirrend ist, das erstellte Archiv zu sehen und die Dateien nicht zu enthalten.
Bruno Bronosky
7
Um das Unvermeidliche package_dataund die data_filesEmpfehlungen, die außerhalb des Geltungsbereichs liegen, zu vermeiden, werde ich fortfahren. package_datalistet Dateien auf, die mit Ihrem Paket installiert werden und in dist-packages/yourpackagedie übersprungen worden wären, weil sie keinen * .py-Namen haben. data_fileslistet Dateien auf, die außerhalb Ihres Pakets installiert werden. Jeder Eintrag gibt einen Zielpfad an, dem ein Präfix vorangestellt wird, sys.prefixwenn er relativ ist, oder direkt erstellt wird (sofern die Berechtigungen dies zulassen), wenn er mit a beginnt /.
Bruno Bronosky
2
@JanVlcinsky Es ist wichtig zu wissen, was ist und [was noch wichtiger ist] nicht in verschiedenen Distributionsformaten enthalten ist. Ich habe ein öffentliches Projekt, das ich nur über die Quelldistribution verteile, da ich eine boto.sample.cfg-Datei (die einen gefälschten AWS IAM-Berechtigungsnachweis enthält) außerhalb des Pakets (im Stammverzeichnis) einbinde und die Binärdistributionen diese nicht enthalten. Ich erstelle private binäre Builds für die Bereitstellung in der Produktion mit data_files = [('/ etc /', ['boto.cfg'])]. Wenn Sie Nicht-Py-Dateien verteilen möchten, müssen Sie wissen, wie diese Dinge funktionieren.
Bruno Bronosky
2
@ MichaelGoerz Ehrlich gesagt sollten sie nicht. Diese Antwort ist uralt und es pbrist auch eine schlechte Idee, darauf hinzuweisen.
Arne
1
@Ame Ich stimme zu, die Dinge gingen weiter. Derzeit konvertiere ich die meisten meiner Projekte von pbr zu Poesie
Jan Vlcinsky
7

Alte Frage, neue Antwort:

Nein, das brauchst du nicht MANIFEST.in. Um jedoch das setuptoolszu tun, was Sie (normalerweise) meinen, müssen Sie das verwenden setuptools_scm, das MANIFEST.inan zwei Schlüsselstellen die Rolle übernimmt :

  • Es stellt sicher, dass alle relevanten Dateien gepackt werden, wenn der sdistBefehl ausgeführt wird (wobei alle relevanten Dateien als "alle Dateien unter Quellcodeverwaltung" definiert sind).
  • Bei Verwendung include_package_data, um Paketdaten als Teil des buildoder einzuschließen bdist_wheel. (wieder: Dateien unter Quellcodeverwaltung)

Das historische Verständnis von MANIFEST.inist: Wenn Sie kein Versionsverwaltungssystem haben, benötigen Sie einen anderen Mechanismus, um zwischen "Quelldateien" und "Dateien, die sich zufällig in Ihrem Arbeitsverzeichnis befinden" zu unterscheiden. Ihr Projekt befindet sich jedoch unter Quellcodeverwaltung (richtig ??), sodass dies nicht erforderlich ist MANIFEST.in. Weitere Infos in diesem Artikel .

Klaas van Schelven
quelle