La mise en page était une décision de conception délibérée de la part de Homebrew pour maintenir un équilibre entre l'utilisabilité, la santé du mainteneur et la non-rupture des choses.
Un commentaire dans le code source de Homebrew dit :
Installer des JAR dans "lib" peut provoquer des conflits entre les packages. Pour les logiciels Java, il est généralement préférable pour la formule d'installer dans "libexec" puis de lier symboliquement ou d'entourer des binaires dans "bin".
Pourquoi des conflits ?
Pour expliquer quel est le conflit spécifique et ce qui le cause, regardons (une simplification assez grossière de) ce que fait Homebrew lorsque vous exécutez brew install foo
:
-
Homebrew télécharge et décompresse tout ce dont a besoin foo
selon la formule.
-
Homebrew suit les instructions d'installation selon la formule. Par exemple, il copie des fichiers, applique des correctifs, etc. À la fin, vous obtenez un tonneau, le dossier contenant la nouvelle installation.
-
Pour votre commodité, Homebrew regarde dans les répertoires bin
et lib
de votre tonneau, puis lie symboliquement tout ce qu'il trouve dans /usr/local/bin
et /usr/local/lib
pour que vous n'ayez pas à le faire.
Remarquez comment dans le #3, la formule n'a pas voix au chapitre. Cela aide à maintenir la complexité hors des définitions de formules. Un mainteneur de formule ne peut jamais oublier de créer un lien symbolique car il ou elle n'a pas à le faire ; Homebrew le fait automatiquement pour tout ce qui se trouve dans bin
ou lib
.
La politique de mise en page a été (AFAIK) codifiée pour la première fois dans l'issue n°678 du dépôt GitHub hérité de Homebrew, qui dit :
C'est un comportement attendu ; libexec est supposé être des trucs à usage privé pour cette formule.
Fondamentalement, Homebrew considère les contenus de bin
et lib
comme des artefacts publics, c'est-à-dire des choses censées être appelées depuis l'extérieur de la formule.
Tout le reste, y compris l'intégralité du contenu de libexec
, est considéré comme un détail d'implémentation, c'est-à-dire des choses à usage privé par la formule elle-même.
Mais quel est le problème là-dedans ? Pourriez-vous, en tant qu'auteur d'une formule comme maven
, simplement ignorer ces principes et vivre plutôt avec quelques liens symboliques inutiles dans /usr/local/lib
et donner à l'utilisateur la même mise en page que le projet amont a ?
Il s'avère que oui, vous pourriez, mais c'est une idée horrible, et les mainteneurs de Homebrew refuseraient légitimement une telle formule tant qu'elle n'est pas corrigée.
Publier des choses privées dans /usr/local/lib
est une cause typique de l'enfer des JAR. (Imaginez une formule Homebrew basée sur Java foo
qui utilise mylib.jar
v1, et une autre formule Homebrew bar
qui utilise mylib.jar
v2, avec le numéro de version n'étant pas partie du nom de fichier mylib.jar
. Maintenant, essayez de comprendre pourquoi votre application critique pour l'entreprise - qui utilise /usr/local/lib/mylib.jar
parce qu'il est dans le chemin - ne fonctionne que sur 50 % de vos machines où foo
a été installé après bar
mais pas vice versa. C'est un exemple du conflit mentionné au début.)
tl;dr Peu importe ce que vous mettez dans lib
, Homebrew le liera à /usr/local/lib
pour vous. Mettre un JAR dont vous dépendez dans /usr/local/lib
est une mauvaise idée et conduit à l'enfer des JAR.