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
:
Homebrew lädt und entpackt alles, was es foo
braucht, nach der Formel.
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.
Für Ihre Bequemlichkeit sieht Homebrew an den bin
und lib
Verzeichnisse Ihrer Fass, dann symbolisch verlinkt alles , was es in findet /usr/local/bin
und /usr/local/lib
so 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 bin
oder 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 bin
und 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 maven
nicht einfach diese Prinzipien ignorieren und stattdessen mit ein paar unnötigen Symlinks leben /usr/local/lib
und 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/lib
ist eine typische Ursache der JAR-Hölle . (Stellen Sie sich eine Java-basierte Homebrew-Formel vor , die Version 1 foo
verwendet mylib.jar
, und eine andere Homebrew-Formel , die Version 2 bar
verwendet 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.jar
weil es im Pfad ist - funktioniert nur auf den 50% Ihrer Maschinen, auf denen foo
es 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/lib
für Sie eine Verknüpfung herstellen . Ein JAR, von dem Sie abhängig sind, einzusetzen, /usr/local/lib
ist eine schlechte Sache und führt zur JAR-Hölle.