web-dev-qa-db-fra.com

Où CPAN installe-t-il des modules?

Je ne trouve pas de description complète/faisant autorité de l’emplacement où CPAN installe ses fichiers. Je suppose qu'il doit y avoir un ensemble de règles et que ce n'est pas aussi simple que "répertoire XYZ" car, par exemple, plusieurs utilisateurs sur une machine Linux peuvent exécuter CPAN même s'il n'y a qu'une seule installation Perl et qu'elle fonctionne toujours. Alors, quelles sont ces règles?

Une deuxième partie de cette question: la documentation de la variable d’environnement Perl5LIB indique qu’il s’agit d’une «liste de répertoires dans laquelle rechercher des fichiers de bibliothèque Perl avant de rechercher dans la bibliothèque standard et le répertoire en cours».

Je suppose que CPAN n’est pas installé à l’emplacement de la bibliothèque standard, car il est vraisemblablement résolu pour une version particulière de Perl. Alors peut-être que CPAN s’installe dans Perl5LIB?

Et enfin, comme je l’ai déjà mentionné, comment CPAN gère-t-il le fait que plusieurs utilisateurs peuvent exécuter la même installation Perl? Désolé si c'est une question distincte, mais elle semble probablement liée.

7
Stephen

Perl spécifie trois ensembles d'emplacements d'installation.

  • Perl, pour les modules inclus avec Perl lui-même.
  • vendor, pour les modules installés par le fournisseur de votre binaire Perl.
  • site, pour les modules installés à l'aide de cpan.

Chacun de ces ensembles fournit des emplacements d'installation pour un certain nombre de types de fichiers.

                        Installation location
                        --------------------------------------------------------
Type of file            Perl             vendor                 site
----------------------  ---------------  ---------------------  -------------------
Build-specific modules  installarchlib   installvendorarch      installsitearch
Modules                 installprivlib   installvendorlib       installsitelib
Binary programs         installbin       installvendorbin       installsitebin
Other programs          installscript    installvendorscript    installsitescript
man pages for scripts   installman1dir   installvendorman1dir   installsiteman1dir
man pages for modules   installman3dir   installvendorman3dir   installsiteman3dir
html docs for scripts   installhtml1dir  installvendorhtml1dir  installsitehtml1dir
html docs for modules   installhtml3dir  installvendorhtml3dir  installsitehtml3dir

Vous pouvez obtenir le chemin pour n'importe lequel de ces emplacements en utilisant les éléments suivants:

Perl -V:{var}

Vous pouvez obtenir tous les chemins pour ces emplacements en utilisant les éléments suivants:

Perl -V:'install.*'

Ce sont les valeurs par défaut utilisées par les installateurs[1]. Cependant, les deux programmes d’installation les plus couramment utilisés permettent à l’utilisateur concerné d’installer l’installation d’en remplacer l’une quelconque. Si un module est installé dans un emplacement non standard, Perl5LIB peut être utilisé pour indiquer à Perl où trouver le module.


  1. CPAN n'installe pas de modules. C'est un référentiel.

    cpan n'installe pas les modules. cpan télécharge les distributions à partir de CPAN et exécute le programme d'installation fourni dans, Makefile.PL et Build.PL. (Idem pour cpanm et cpanp.)

    Ces scripts utilisent principalement ExtUtils :: MakeMaker ou Module :: Build installent eux-mêmes (bien que d’autres installateurs existent).

6
ikegami

CPAN n’installe pas réellement de fichiers. Il exécute le script d'installation intégré à chaque distribution, qui effectue ensuite l'installation réelle.

Pour les distributions utilisant ExtUtils :: MakeMaker , les valeurs par défaut sont documentées ici: https://metacpan.org/pod/ExtUtils::MakeMaker#make-install (et la valeur par défaut de INSTALLDIRS est site) . Pour Module :: Build , voir https://metacpan.org/pod/Module::Build#INSTALL-PATHS .

Lorsque la documentation parle de $Config{foo} ou %Config, cela signifie que la variable %Config fournie par le module de configuration . La valeur de $Config{foo} peut également être vérifiée en exécutant Perl -V:foo.

(Si vous pensez que cela semble inutilement compliqué, vous avez raison.)

La version courte indique que Perl possède plusieurs "répertoires système", dont l'un concerne les modules "spécifiques à un site" et est donc utilisé comme cible d'installation par défaut. Vous avez raison de dire qu’il s’agit d’un répertoire unique (par installation Perl), qui ne s’intègre pas parfaitement dans un système multi-utilisateur: il est partagé par tous les utilisateurs et vous devez disposer d’autorisations root pour installer les modules (et cela pourrait permettre de mettre à niveau/remplacer les modules des packages système, ce qui est une mauvaise idée).

Ce que les gens font à la place, c'est configurer ExtUtils :: MakeMaker, Module :: Build, etc. pour qu'ils soient installés dans le répertoire personnel de l'utilisateur. Cela peut être fait avec des variables d'environnement. Ensuite, ils disent à Perl d'ajouter ce répertoire à @INC, afin que les modules puissent être trouvés et chargés. Ceci est fait avec une autre variable d'environnement, Perl5LIB. (Perl5LIB n'affecte pas l'installation, il est uniquement utilisé pour le chargement.)

Tout ce qui précède est automatisé et encapsulé dans local :: lib . (local :: lib peut également être utilisé pour créer par exemple un sous-répertoire de module par projet.)

La documentation CPAN indique également:

À partir de la version 1.9463 du CPAN, si vous n'êtes pas autorisé à écrire les répertoires de bibliothèque Perl par défaut, le processus de configuration de CPAN vous demandera si vous souhaitez amorcer local::lib, ce qui facilite la gestion d'un répertoire de bibliothèque personnel Perl.


Vous pouvez éviter tout le problème en installant un Perl privé dans votre répertoire personnel (dans ce cas, le répertoire "système" est juste un autre sous-répertoire sous votre $HOME et ne sera donc partagé avec personne, et vous pourrez y écrire). Ceci est très facile avec par exemple perlbrew .


Autre remarque: vous venez de trouver un bogue dans la documentation de Perl5LIB. " et le répertoire en cours " est obsolète: . a été supprimé de la liste par défaut des emplacements de modules pour des raisons de sécurité.

2
melpomene

C'est une question complexe. Vous pouvez savoir où se trouvent les bibliothèques core en recherchant l’emplacement de l’une d’elles:

perldoc -l B

Vous indiquera où se trouve le module B. Et vous pouvez essayer d'autres avec des résultats différents ...

De plus, Perl -V vous indiquera toutes les variables du shell importantes avec la valeur de @INC, les endroits où il recherchera des bibliothèques.

Les bibliothèques Core se trouvent généralement à des endroits différents de ceux de local . De plus, si vous utilisez perlbrew et local::lib, vous aurez peut-être plus de choses à prendre en compte. En ce qui concerne les variables Shell, avec Perl5LIB, vous avez également Perl_LOCAL_LIB_ROOT.

En ce qui concerne votre autre question, je dirais que root peut installer des bibliothèques sur l’ensemble du système. Tous les utilisateurs, y compris les espaces locaux, seront inclus à l’aide de variables Shell ou d’autres moyens tels que les options de ligne de commande Perl -I <lib location>, ou dans le code tel que use lib <lib location>;.

Il existe également perlbrew qui, avec local::lib, permet à un utilisateur non privilégié d’installer Perl et des bibliothèques dans des répertoires locaux.

En ce qui concerne les moyens d’installer des modules à partir de CPAN, mon préféré est cpanminus . Il est appelé avec cpanm <library to install>. Il ne manque jamais ...

0
Javier Elices