Domanda

Attualmente sto usando il PAR Packer (pp) per impacchettare un paio di script pl in modo che possano essere copiati su una macchina e "solo lavoro" senza che il mio cliente debba confondere con CPAN.

Sfortunatamente, il PAR Packer non funziona per dipendenze profonde. Ad esempio, uno script importa CHI :: Driver :: File ma non importa esplicitamente Log :: Any :: Adapter :: Null richiesto da CHI :: Driver :: File. PAR non rileva questa dipendenza e l'esecuzione dello script generato si arresterà in modo anomalo con il seguente messaggio di errore:

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.

La mia soluzione è importare esplicitamente " Log :: Any :: Adapter :: Null " ma deve esserci un modo migliore. Forse questo è un bug con il PAR Packer? Ho installato l'ultima versione (0.994).

È stato utile?

Soluzione

Se si desidera uno script autonomo anziché un binario autonomo (che è la modalità predefinita per pp), quindi aggiungere l'opzione -P. Vorrei sconsigliarlo, però. È la modalità operativa meno testata.

Nota anche che PAR :: Packer funziona per dipendenze profonde. L'argomento della tua domanda è un po 'pretenzioso. In realtà, PAR :: Packer non controlla realmente alcuna dipendenza ma lo delega a Module :: ScanDeps. Ora Module :: ScanDeps è un approccio euristico alla scansione delle dipendenze e può essere interrotto da un brutto fuzzing con caricamento dinamico delle dipendenze. (vale a dire generare nomi dei moduli in fase di esecuzione e quindi utilizzarli in una valutazione).

In effetti, se guardi fonti per Log :: Any (utilizzato da CHI :: Driver :: File), vedrai rapidamente che utilizza il caricamento dinamico dei moduli. Questo è il motivo per cui il modulo :: Adapter :: Null non viene raccolto.

Generalmente, risolviamo questi problemi aggiungendo un caso speciale a Module :: ScanDeps per tali moduli il cui autore ha pensato che sarebbe stata una buona idea sconfiggere qualsiasi tipo di analisi statica. Fino a quando non ottieni una versione fissa di Modulo :: ScanDeps , puoi usare -c oppure -x opzioni in pp per fare in modo che la risoluzione delle dipendenze utilizzi la compilazione o l'esecuzione del programma invece di basarsi solo sull'analisi statica. Il modulo aumentato :: ScanDeps ha la versione 0.95 e dovrebbe essere disponibile da CPAN entro il giorno.

Altri suggerimenti

Bene, hai letto la documentazione ? Offre una serie di opzioni da riga di comando per includere le dipendenze e persino l'opzione per forzare manualmente l'inclusione dei moduli.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top