Frage Wie verteilt man Dateien in einem Python-sdist, die nicht VCS-verfolgt werden?


Ich würde gerne den richtigen Weg finden, Dateien in ein Python-sdist aufzunehmen, die nicht von git verfolgt werden.

Kontext

Das .mo Dateien aus meinem Projekt werden nicht von verfolgt git (wie einige andere .txt Dateien, die zum Zeitpunkt der Installation erstellt werden müssen).

Ich habe eine kleine Funktion in geschrieben setup.py um sie zur Installationszeit zu erstellen, die ich einrufe setup():

setup(
    .
    .
    .
    data_files=create_extra_files(),
    include_package_data=True,
    .
    .
    .
)

Beachten Sie, dass sie gehören sollten data_dir weil Die Dokumentation sagt:

Mit der Option data_files können zusätzliche Dateien angegeben werden   durch die Modulverteilung: Konfigurationsdateien, Nachrichtenkataloge,   Datendateien, alles, was nicht in die vorherigen Kategorien passt.

Also, das funktioniert gut mit python3 setup.py install (und bdist auch). Das .mo Dateien werden am richtigen Ort erzeugt und gespeichert.

Aber wenn ich will, dass es funktioniert sdist, dann muss ich sie einschließen MANIFEST.in (z.B. recursive-include mathmaker *.mo). Dokumentation sagt in der Tat:

In Version 3.1 geändert: Alle Dateien, die mit data_files übereinstimmen, werden zur MANIFEST-Datei hinzugefügt    wenn keine Vorlage bereitgestellt wird. Sehen Angeben der zu verteilenden Dateien.

(Der Link hilft nicht viel).

Ich zögere es zu erwähnen *.mo Dateien in MANIFEST.in da sie nicht von git verfolgt werden. Und Check-Manifest mag diese Art von Situation nicht, es beklagt sich darüber, dass lists of files in version control and sdist do not match!

Also, gibt es eine Möglichkeit, diese hässliche Situation zu beheben?

Schritte, um die Situation zu reproduzieren

Umwelt und Projekt

Erstellen Sie eine dedizierte virtuelle Umgebung (python3.4 +) in dem Verzeichnis Ihrer Wahl, um eine Verschmutzung Ihrer Umgebung zu vermeiden:

$ pyvenv-3.4 v0
$ source v0/bin/activate
(v0) $

Reproduzieren folgenden Baum in a project0 Verzeichnis:

.
├── .gitignore
├── MANIFEST.in
├── README.rst
├── setup.py
└── project0
    ├── __init__.py
    ├── main.py
    └── data
        └── dummy_versioned.po

Woher README.rst, __init__.py und dummy_versioned.po sind leer.

Inhalt der anderen Dateien:

  • .gitignore:

    build/
    dist/
    *.egg-info
    project0/data/*.txt
    *~
    
  • MANIFEST.in:

    recursive-include project0 *.po
    recursive-include project0 *.txt
    
  • main.py:

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    
    
    def entry_point():
        with open('project0/data/a_file.txt', mode='rt') as f:
            print(f.read())
    
  • setup.py:

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    
    import platform
    from setuptools import setup, find_packages
    
    
    def create_files():
        txt_file_path = 'project0/data/a_file.txt'
        with open(txt_file_path, mode='w+') as f:
            f.write("Some dummy platform information: " + platform.platform())
        return [('project0/data', [txt_file_path])]
    
    
    setup(
        name='project0',
        version='0.0.1',
        author='J. Doe',
        author_email='j.doe@someprovider.com',
        url='http://myproject.url',
        packages=find_packages(),
        data_files=create_files(),
        include_package_data=True,
        entry_points={
            'console_scripts': ['myscript0 = project0.main:entry_point'],
        }
    )
    

Starten Sie ein Lokal git Repo:

(v0) $ git init
(v0) $ git add .

Installieren check-manifest:

(v0) $ pip3 install check-manifest

Installieren und testen

install funktioniert:

(v0) $ python3 setup.py install
.
.
.
copying project0/data/a_file.txt -> build/lib/project0/data
.
.
.
Finished processing dependencies for project0==0.0.1
(v0) $ myscript0 
Some dummy platform information: Linux-3.16.0-29-generic-x86_64-with-Ubuntu-14.04-trusty

Wenn du rm project0/data/a_file.txt, dann myscript0 funktioniert nicht mehr, aber neu installieren und es funktioniert wieder wie erwartet.

Der Aufbau der SDist beinhaltet auch a_file.txt:

(v0) $ python3 setup.py sdist
.
.
.
hard linking project0/data/a_file.txt -> project0-0.0.1/project0/data
.
.
.

Beachten Sie, dass diese Datei im sdist enthalten sein muss, damit sie (wie im Abschnitt "Kontext" unten erklärt) erforderlich ist recursive-include project0 *.txt im MANIFEST.in. Würden Sie diese Linie entfernen, python3 setup.py sdist Ich würde es nicht erwähnen a_file.txt mehr (vergessen Sie nicht, irgendwelche vorherigen zu entfernen build/ oder dist/ Verzeichnisse, um dies zu beobachten).

Fazit

Also, alles funktioniert wie es ist, aber es gibt diese Diskrepanz: a_file.txt wird nicht von verfolgt git, aber ist in enthalten MANIFEST.in.

check-manifest sagt deutlich:

lists of files in version control and sdist do not match!
missing from VCS:
  project0/data/a_file.txt

Also, gibt es einen richtigen Weg, um mit dieser Situation umzugehen?


14
2017-07-18 14:35


Ursprung


Antworten:


Soweit ich dein Problem habe Sie möchten Dateien hinzufügen, die mit dem Git-Repository verteilt werden sollen, aber Sie möchten ihre Änderungen nicht verfolgen.

Dies kann durch diese vier einfachen Schritte erfolgen:

Schritt 0: Stellen Sie zuerst sicher, dass Sie den Inhalt in der path/a_file.txtDatei stimmt mit dem Inhalt überein, den Sie verteilen möchten. Soweit ich weiß, kann es nicht leer sein. Wenn Sie diese Datei einfach haben wollen, fügen Sie ihr ein Zeilen- / Leerzeichen hinzu.

Schritt 1: Fügen Sie die Datei (en) zu git using hinzu git add path/a_file.txt

Schritt 2: Commit die Dateien (git commit path/a_file.txt)

Schritt 3: Aktualisiere Git's Index und sag git, dass es weiter ignorieren soll Änderungen an den Dateien git update-index --assume-unchanged path/a_file.txt

Wenn Sie jemals Änderungen an dieser Datei vornehmen möchten, die erneut verfolgt werden soll, können Sie einfach die verwenden --no-assume-unchanged Flag, um es zu setzen aktiv in Git-Index und dann die Änderungen festschreiben.

Hinweis dass die Schaffung eines .gitignore Datei, die git anweist, die Dateien (auf allen Maschinen, die das Repository klonen) zu ignorieren und zu verwenden git add --force path/a_file.txt wird nicht funktionieren seit Git Willen (force) füge es dem Index hinzu und auch Verfolgen Sie die Änderungen.


1
2018-04-26 05:52