Quelles sont toutes les façons d'affecter où les modules Perl sont recherchés? ou, comment est construit @INC de Perl ?
Comme nous le savons, Perl utilise un @INC
tableau contenant des noms de répertoires pour déterminer où rechercher les fichiers du module Perl .
Il ne semble pas y avoir de publication de type FAQ "@INC" complète sur StackOverflow, donc cette question est conçue comme une seule.
perl
perl-module
DVK
la source
la source
@INC
au moment de l'exécution, pas la construction complète.Réponses:
Nous verrons comment le contenu de ce tableau est construit et peut être manipulé pour affecter où l'interpréteur Perl trouvera les fichiers du module.
Défaut
@INC
L'interpréteur Perl est compilé avec une
@INC
valeur par défaut spécifique . Pour connaître cette valeur, exécutez laenv -i perl -V
commande (env -i
ignore laPERL5LIB
variable d'environnement - voir # 2) et dans la sortie, vous verrez quelque chose comme ceci:Remarque
.
à la fin; c'est le répertoire courant (qui n'est pas nécessairement le même que le répertoire du script). Il est manquant dans Perl 5.26+, et lorsque Perl s'exécute avec-T
(vérification des taches activée) .Pour modifier le chemin par défaut lors de la configuration de la compilation binaire Perl, définissez l'option de configuration
otherlibdirs
:Variable d'environnement
PERL5LIB
(ouPERLLIB
)Perl ajoute
@INC
une liste de répertoires (séparés par deux-points) contenus dans la variable d'environnementPERL5LIB
(si elle n'est pas définie,PERLLIB
utilisée) de votre shell. Pour voir le contenu des variables@INC
afterPERL5LIB
etPERLLIB
environment ont pris effet, exécutezperl -V
.-I
option de ligne de commandePerl ajoute
@INC
une liste de répertoires (séparés par deux-points) transmis comme valeur de l'-I
option de ligne de commande. Cela peut être fait de trois manières, comme d'habitude avec les options Perl:Passez-le en ligne de commande:
Passez-le via la première ligne (shebang) de votre script Perl:
Passez-le comme partie de la variable d'environnement
PERL5OPT
(ouPERLOPT
) (voir le chapitre 19.02 dans Programmation de Perl )Passez-le via le
lib
pragmaPerl pré-suspend
@INC
avec une liste de répertoires qui lui sont passés viause lib
.Dans un programme:
Sur la ligne de commande:
Vous pouvez également supprimer les répertoires de
@INC
viano lib
.Vous pouvez directement manipuler
@INC
comme un tableau Perl standard.Remarque: Puisque
@INC
est utilisé pendant la phase de compilation, cela doit être fait à l'intérieur d'unBEGIN {}
bloc, qui précède l'use MyModule
instruction.Ajoutez des répertoires au début via
unshift @INC, $dir
.Ajoutez des répertoires à la fin via
push @INC, $dir
.Faites tout ce que vous pouvez faire avec un tableau Perl.
Remarque: Les répertoires sont sans décalage sur
@INC
dans l'ordre indiqué dans cette réponse, par défaut , par exemple@INC
est le dernier dans la liste, précédéPERL5LIB
, précédé-I
, précédéuse lib
et directe@INC
la manipulation, ces deux derniers mélangés dans l'ordre qui ils sont dans le code Perl.Références:
@INC
?Il ne semble pas y avoir de
@INC
publication de type FAQ sur Stack Overflow, donc cette question est conçue comme une seule.Quand utiliser chaque approche?
Si les modules d'un répertoire doivent être utilisés par de nombreux / tous les scripts de votre site, en particulier exécutés par plusieurs utilisateurs, ce répertoire doit être inclus dans le répertoire par défaut.
@INC
compilé dans le binaire Perl.Si les modules du répertoire seront utilisés exclusivement par un utilisateur spécifique pour tous les scripts exécutés par l'utilisateur (ou si la recompilation de Perl n'est pas une option pour modifier la valeur
@INC
par défaut dans le cas d'utilisation précédent), définissezPERL5LIB
, généralement lors de la connexion de l'utilisateur.Remarque: veuillez tenir compte des pièges habituels des variables d'environnement Unix - par exemple, dans certains cas, l'exécution des scripts en tant qu'utilisateur particulier ne garantit pas leur exécution avec l'environnement de cet utilisateur configuré, par exemple via
su
.Si les modules du répertoire ne doivent être utilisés que dans des circonstances spécifiques (par exemple lorsque le ou les scripts sont exécutés en mode développement / débogage, vous pouvez soit définir
PERL5LIB
manuellement, soit passer l'-I
option à perl.Si les modules doivent être utilisés uniquement pour des scripts spécifiques, par tous les utilisateurs qui les utilisent, utilisez
use lib
/no lib
pragmas dans le programme lui-même. Il doit également être utilisé lorsque le répertoire à rechercher doit être déterminé dynamiquement pendant l'exécution - par exemple à partir des paramètres de ligne de commande du script ou du chemin du script (voir le module FindBin pour un très bon cas d'utilisation).Si les répertoires
@INC
doivent être manipulés selon une logique compliquée, impossible à trop compliquée à implémenter par la combinaison deuse lib
/no lib
pragmas, alors utilisez la@INC
manipulation directe à l' intérieur duBEGIN {}
bloc ou à l'intérieur d'une bibliothèque à usage spécial désignée pour@INC
manipulation, qui doit être utilisée par votre script (s) avant d'utiliser tout autre module.Un exemple de ceci est le basculement automatique entre les bibliothèques dans les répertoires prod / uat / dev, avec la collecte de bibliothèque en cascade dans prod si elle manque dans dev et / ou UAT (la dernière condition rend la solution standard "use lib + FindBin" assez compliquée. illustration détaillée de ce scénario est en Comment puis-je utiliser des modules Perl bêta à partir de scripts Perl bêta? .
Un cas d'utilisation supplémentaire pour la manipulation directe
@INC
consiste à pouvoir ajouter des références de sous-programme ou des références d'objet (oui, Virginia,@INC
peut contenir du code Perl personnalisé et pas seulement des noms de répertoire, comme expliqué dans Quand une référence de sous-programme dans @INC est-elle appelée? ).la source
En plus des emplacements répertoriés ci-dessus, la version OS X de Perl a également deux autres façons:
Le fichier /Library/Perl/x.xx/AppendToPath. Les chemins d'accès répertoriés dans ce fichier sont ajoutés à @INC lors de l'exécution.
Le fichier /Library/Perl/x.xx/PrependToPath. Les chemins d'accès répertoriés dans ce fichier sont ajoutés à @INC lors de l'exécution.
la source
Comme il a déjà été dit, @INC est un tableau et vous êtes libre d'ajouter tout ce que vous voulez.
Mon script CGI REST ressemble à:
Le sous-programme disparu est exporté par Rest.pm.
la source