10 votes

Pourquoi toutes les formules de homebrew sont-elles situées dans le dossier « libexec » ?

Lorsque j'installe les packages manuellement, la disposition typique ressemble à ce qui suit :

 conf
 lib
 bin
    mvn
    mvn.cmd

Mais lorsque je l'installe avec homebrew, presque tous les fichiers sont placés dans le dossier libexec:

 bin
    mvn
 libexec
     bin
     boot
     conf
     lib

Pourquoi cette disposition étrange est-elle utilisée? C'est un peu déroutant lorsque vous lisez la documentation officielle de l'outil et que vos chemins ne correspondent pas.

13voto

Synoli Points 1131

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 :

  1. Homebrew télécharge et décompresse tout ce dont a besoin foo selon la formule.

  2. 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.

  3. 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.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X