2010-12-30 9 views
0

Ich machte ein Perl-Skript, das ein Deb-Binärpaket von Grund auf neu erstellt. Ich erstellte die Daten, Kontrolle, etc. Aber wenn ich dpkg -i auf meinem Deb-Paket ausführen beschwert es sich, dass es Dateien aus Daten nicht möglich ist. Beispiel: kann '.dpkg-new' nicht erstellen (während der Verarbeitung von ''): Keine solche Datei oder Verzeichnis.Warum schlägt meine Hand erstellt Deb-Paket bei der Installation mit "nicht in der Lage zu erstellen" auf Dateien?

Ich habe heruntergeladen einige .deb-Pakete zu betrachten, und sie verwenden nicht das Preinst-Skript, um die Verzeichnisstruktur zu erstellen.

Ich denke, ich mache etwas falsch, ich denke, meine eigenen Verzeichnisse in preinst zu erstellen, aber es scheint nicht richtig ... vielleicht fehlt mir etwas?

Muss ich Verzeichnisse erstellen, in denen meine Dateien aus Daten in der Preinst Sh kopiert werden, oder sollte dpkg es tun und ich mache etwas falsch?

Antwort

1

Sie sollten nicht versuchen, manuell ein .deb-Binärpaket zu erstellen. Die Datei Debian New Maintainers' Guide behandelt, wie man mit den richtigen Werkzeugen anfängt, ein Debian-Paket zu erstellen.

Ihr handgemachtes Paket kann für Sie richtig aussehen, aber weil es nicht installiert ist, ist es offensichtlich fehlerhaft, entweder nicht bemerkt oder auf eine ernstere Weise, die für Sie nicht sichtbar ist (zum Beispiel die meisten Leute) merke nicht, dass ein .deb eigentlich ein Archiv ist.

+6

"Do not do it" löst nicht wirklich das Problem, wissen zu wollen, wie dpkg arbeitet. –

2

Zusätzlich zu dem, was @Arowrowmaster sagte, überprüfen Sie die http://www.debian.org/doc/debian-policy/ für einige detaillierte Erklärung der Dateien. Nachdem Sie das Paket selbst erstellt haben, können Sie es mit dem Tool lintian überprüfen, um festzustellen, ob etwas offensichtlich ist, das Sie übersehen haben könnten.

2

Wenn jemand nach einer Lösung für das Problem sucht:
"Erstellen Sie ein Deb-Paket aus einer RPM-Datei."

Ich habe mein eigenes Perl-Build-Skript viel einfacher als das erwähnte gemacht, damit ich es leicht pflegen kann.

Einige nützliche Kenntnisse in den Prozess gewonnen:
0. Die deb ist ein Archiv, das 3 Dateien enthält, ist die Reihenfolge der Dateien wichtig.
1. Die Skripte von control.tar.gz müssen ausführbar gemacht werden.
2. Es ist gut, ein Vorinstallations-Skript zu haben, um Verzeichnisse zu erstellen, wenn keine Verzeichnisse vorhanden sind.
3. manchmal entschließt sich dpkg, die Zips zu entpacken (dies passierte, wenn die Zip-Datei die einzige Datei in der Datei data.tar.gz war). Überprüfen Sie dies in einem Postinstall-Skript.
4. Wenn Sie einige Dateien tar.gz sicher sein, chmod zu dem Verzeichnis, das die Verzeichnisstruktur für Ihre Teer enthält.

4

Ich hatte das gleiche Problem in einem Ruby-Skript, das ich schrieb.

Ich erstellte eine Liste von Dateien, die an tar übergeben werden, wenn das data.tar.gz-Archiv erstellt wird. Wenn ich das Archiv manuell dekomprimiere und entpacke, würde es deflationieren, aber dpkg würde fehlschlagen.

Es stellt sich heraus, dass die Liste der Dateien auch jedes zu erstellende Verzeichnis enthalten muss.

Beachten Sie, dass ich bei der Erstellung von data.tar.gz mit fast den gleichen Optionen wie dpkg-deb/build erstellt habe.c tut dies in der Quelle dpkg-1.15.8.11.

execlp(TAR, "tar", "-cf", "-", "--format=gnu", "--null", "-T", "-", "--no-recursion", NULL);

Stattdessen benutzte ich

IO.popen("gnutar -czf - --format=gnu -T - --no-recursion", "r+")

1

Es gibt viele Gründe dafür sind. Sie müssen wirklich laufen:

dpkg -i -D1110 mydeb.deb 

Und veröffentlichen Sie das Ergebnis zu hoffen, dass jemand in der Lage, das Problem zu lösen.