Warum befinden sich alle Homebrew-Formeln im Ordner 'libexec'?

4

Wenn ich Pakete manuell installiere, sieht das typische Layout folgendermaßen aus:

├── conf
├── lib
├── bin
│   ├── mvn
│   ├── mvn.cmd

Aber wenn ich es mit Homebrew installiere, werden fast alle Dateien in den libexecOrdner gelegt:

├── bin
│   └── mvn
└── libexec
    ├── bin
    ├── boot
    ├── conf
    └── lib

Warum wird dieses seltsame Layout verwendet? Es ist etwas verwirrend, wenn Sie die offizielle Dokumentation des Tools lesen und Ihre Pfade nicht übereinstimmen.

Jofsey
quelle

Antworten:

5

Das Layout war eine bewusste Designentscheidung auf Homebrews Seite, um das Gleichgewicht zwischen Benutzerfreundlichkeit, Sauberkeit des Betreuers und der Unversehrtheit der Dinge zu wahren.

Ein Kommentar im Quellcode von Homebrew lautet:

Das Installieren von JARs in "lib" kann zu Konflikten zwischen Paketen führen. Für Java-Software ist es normalerweise besser, die Formel in "libexec" zu installieren und dann die Binärdateien mit einem Symlink zu verknüpfen oder in "bin" zu packen.

Warum Konflikte?

Um zu erklären, was der spezifische Konflikt ist und was ihn verursacht, werfen wir einen Blick auf (eine grobe Vereinfachung), was Homebrew tut, wenn Sie ausführen brew install foo:

  1. Homebrew lädt und entpackt alles, was es foobraucht, nach der Formel.

  2. Homebrew folgt der Installationsanleitung gemäß der Formel. Es kopiert beispielsweise Dateien, wendet Patches an und so weiter. Am Ende erhalten Sie ein Fass, den Ordner, der die Neuinstallation enthält.

  3. Für Ihre Bequemlichkeit sieht Homebrew an den binund libVerzeichnisse Ihrer Fass, dann symbolisch verlinkt alles , was es in findet /usr/local/binund /usr/local/libso müssen Sie nicht auf.

Beachten Sie, wie in # 3 die Formel kein Mitspracherecht hat. Dies trägt dazu bei, die Komplexität der Formeldefinitionen zu verringern. Ein Formel-Betreuer kann niemals vergessen, einen Symlink zu erstellen, weil er oder sie es nicht muss. Homebrew macht es automatisch für alles, was in binoder ist lib.

Die Layout-Richtlinie wurde (AFAIK) erstmals in Ausgabe Nr. 678 von Homebrews altem GitHub-Repository kodifiziert. Dort heißt es:

Dies ist das erwartete Verhalten. Es wird davon ausgegangen, dass libexec für diese Formel für den privaten Gebrauch bestimmt ist.

Grundsätzlich betrachtet Homebrew den Inhalt binund die lib öffentlichen Artefakte, d.h. e. Dinge, die von außerhalb der Formel aufgerufen werden sollen.

Alles andere, einschließlich des gesamten Inhalts libexec, wird als Implementierungsdetail betrachtet, d.h. e. Dinge für den privaten Gebrauch von der Formel selbst.

Aber was ist das große Problem damit? Könnten Sie als Autor einer Formel mavennicht einfach diese Prinzipien ignorieren und stattdessen mit ein paar unnötigen Symlinks leben /usr/local/libund dem Benutzer das gleiche Layout geben, das das vorgelagerte Projekt hat?

Es stellt sich heraus, dass dies möglich ist, aber es ist eine schreckliche Idee, und die Betreuer von Homebrew würden eine solche Formel zu Recht ablehnen, bis sie behoben sind.

Private Sachen zu veröffentlichen /usr/local/libist eine typische Ursache der JAR-Hölle . (Stellen Sie sich eine Java-basierte Homebrew-Formel vor , die Version 1 fooverwendet mylib.jar, und eine andere Homebrew-Formel , die Version 2 barverwendet mylib.jar, wobei die Versionsnummer nicht Teil des Dateinamens ist mylib.jar. Versuchen Sie nun herauszufinden, warum Ihre geschäftskritische Anwendung verwendet wird /usr/local/lib/mylib.jarweil es im Pfad ist - funktioniert nur auf den 50% Ihrer Maschinen, auf denen fooes installiert wurde, bar aber nicht umgekehrt. Dies ist ein Beispiel für den eingangs erwähnten Konflikt.)

tl; dr Was auch immer Sie tun lib, Homebrew wird /usr/local/libfür Sie eine Verknüpfung herstellen . Ein JAR, von dem Sie abhängig sind, einzusetzen, /usr/local/libist eine schlechte Sache und führt zur JAR-Hölle.

Synoli
quelle