Question

J'utilise actuellement PAR Packer (pp) pour conditionner deux scripts pl afin qu'ils puissent être copiés sur une machine et "il suffit de travailler". sans que mon client ait à muck avec CPAN.

Malheureusement, le PAR Packer ne fonctionne pas pour les dépendances profondes. Par exemple, un script importe CHI :: Driver :: File sans importer explicitement Log :: Any :: Adapter :: Null requis par CHI :: Driver :: File. PAR ne détecte pas cette dépendance et l'exécution du script généré se bloquera avec le message d'erreur suivant:

Can't locate Log/Any/Adapter/Null.pm in @INC (@INC contains: CODE(0x874aab8) /tmp/par-apache/cache-7b4508ab92efb43271da1629e8eb654c1572cc55/inc/lib /tmp/par-apache/cache-7b4508ab92efb43271da1629e8eb654c1572cc55/inc CODE(0x87e8f54) CODE(0x87e9194)) at (eval 215) line 3.
Compilation failed in require at CHI/Driver/File.pm line 11.
BEGIN failed--compilation aborted at CHI/Driver/File.pm line 11.

Mon solution consiste à importer explicitement & Log; Log :: Any :: Adapter :: Null " mais il doit y avoir un meilleur moyen. C'est peut-être un bug avec le PAR Packer? J'ai installé la dernière version (0.994).

Était-ce utile?

La solution

Si vous voulez un script autonome par opposition à un binaire autonome (qui est le mode par défaut pour pp), ajoutez l'option -P. Je déconseillerais, cependant. C'est le mode de fonctionnement le moins testé.

Notez également que PAR :: Packer NE FONCTIONNE que pour les dépendances profondes. Le sujet de votre question est un peu prétentieux. En fait, PAR :: Packer ne vérifie pas réellement les dépendances, mais le délègue à Module :: ScanDeps. Maintenant, Module :: ScanDeps est une approche heuristique de l'analyse de dépendance qui peut être interrompue par un fuzzing déplorable avec un chargement dynamique des dépendances. (c’est-à-dire générer des noms de modules au moment de l’exécution puis les utiliser dans un eval).

En effet, si vous regardez le sources pour Log :: Any (qui est utilisé par CHI :: Driver :: File), vous verrez rapidement qu’il utilise le chargement dynamique des modules. C’est pourquoi le module :: Adapter :: Null n’a pas été capturé.

En règle générale, nous corrigeons ces problèmes en ajoutant un cas particulier à Module :: ScanDeps pour les modules dont l'auteur pensait qu'il serait judicieux de faire échec à toute analyse statique. Jusqu'à ce que vous obteniez une version corrigée de Module :: ScanDeps , vous pouvez utiliser l'option -c. ou -x options à pp pour que la résolution de dépendance utilise la compilation ou l'exécution du programme au lieu de n'utiliser que l'analyse statique. Le module augmenté :: ScanDeps a la version 0.95 et devrait être disponible depuis le CPAN dans la journée.

Autres conseils

Avez-vous déjà lu la documentation ? Il donne un certain nombre d’options de ligne de commande pour inclure des dépendances, et même l’option pour forcer manuellement l’inclusion de modules.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top