Quale framework dovrei usare per scrivere moduli?

Qual è il miglior framework per scrivere moduli: ExtUtils :: MakeMaker (h2xs) o Module :: Build ?

NOTA Questo consiglio non è aggiornato. Module :: Build è stato rimosso dal core Perl ma vive come un modulo CPAN. I pro ei contro continuano a sussistere, e le mie opinioni su MakeMaker sono ancora valide.


Come precedente manutentore di ExtUtils :: MakeMaker, mi piace consigliare Module :: Build perché MakeMaker è uno show horror. Modulo :: Build è molto meglio messo insieme. Ma quelle non sono le tue preoccupazioni e ti presenterò la mia “minima seccatura per te” risposta.

Sintesi:

Poiché il supporto Module :: Build non è al 100% su tutto il Perl, inizia con MakeMaker. Se si desidera eseguire alcuna personalizzazione, passare a Module :: Build. Dal momento che il loro layout di base, le opzioni e l’interfaccia sono quasi identici, questo sarà indolore. Per quanto seducente possa sembrare, evita Module :: Install.

Fortunatamente, Module :: Build può emulare MakeMaker che aiuta alcuni, ma non aiuta se hai intenzione di fare qualsiasi personalizzazione. Vedi Module :: Build :: Compat .

Per le versioni CPAN che utilizzano Module :: Build va bene. C’è abbastanza materiale Module :: Build su CPAN ora che a tutti è stato già fatto il bootstrap.

Infine, la nuova opzione configure_requires consente alle shell CPAN di installare Module :: Build prima che possano iniziare a build il modulo. Sfortunatamente solo le ultime shell CPAN sanno di configure_requires.

Oh, qualunque cosa tu faccia non usare h2xs (a meno che tu non stia scrivendo il codice XS … e anche allora pensaci).

MakeMaker Pro:

  • Viene fornito con Perl e utilizzato dal core Perl (quindi viene mantenuto triggersmente e rimarrà tale per sempre)
  • Tutto sa cosa fare con un Makefile.PL.
  • La maggior parte della documentazione di authoring del modulo riguarderà MakeMaker.
  • Usa make (chi sa make può eseguire il debug e applicare patch al processo di compilazione)

MakeMaker Contro:

  • Richiede make (pensa a Windows)
  • Difficile da personalizzare
  • Ancora più difficile da personalizzare e rendere multipiattaforma
  • Difficile eseguire il debug quando qualcosa va storto (a meno che non lo capisca)

Modulo :: Build Pro:

  • Più facile da personalizzare / sottoclass
  • Perl puro
  • Più facile da eseguire il debug (è Perl)
  • Può emulare MakeMaker in diversi modi
  • La shell CPAN installerà Module :: Build per te

Modulo :: Build Contro:

  • I manutentori Module :: Build (e in effetti tutti i Perl Toolchain Gang) lo odiano
  • Le versioni precedenti dei client CPAN (incluso CPANPLUS) non conoscono nulla su Module :: Build.

Modulo :: Installa Pro:

  • Interfaccia liscia
  • Bundle stesso, hai una versione conosciuta
  • Tutto sa come comportarsi con un Makefile.PL

Modulo :: Installare Contro:

  • Richiede make
  • Utilizza sempre la versione in bundle, vulnerabile a rotture esterne
  • Difficile da personalizzare al di fuori della sua interfaccia
  • Scopa con l’intestino di MakeMaker così una nuova versione di MakeMaker finirà per romperlo.
  • Non sa come generare un file META usando la meta-specifica v2 (sempre più un problema con gli strumenti più recenti)

Ci sono due domande qui.

Innanzitutto, non utilizzare mai h2xs. È una vecchia cattiveria obsoleta, anche se suppongo che se in realtà stai provando a trasformare un file di intestazione in codice XS, potrebbe essere utile (mai fatto da me).

Aggiornamento 2011: consiglio vivamente di dare un’occhiata a Dist :: Zilla , specialmente se pensi che manterrai più di un modulo.

Per creare un nuovo modulo, utilizzare Module :: Starter. Funziona alla grande e ha dei buoni plugin per personalizzare l’output.

In secondo luogo, stai chiedendo quale sistema di generazione dovresti usare. I tre contendenti sono ExtUtils :: MakeMaker (EUMM), Module :: Build (MB) e Module :: Install (MI).

L’EUMM è un orribile pezzo di lavoro, ma funziona, e se non stai personalizzando il tuo processo di costruzione, funziona perfettamente.

MB è il nuovo bambino e ha i suoi detrattori. Il vantaggio principale è che, se si desidera personalizzare fortemente il processo di installazione e generazione, è ansible farlo in modo corretto (e in modo multipiattaforma) utilizzando MB. Non è davvero ansible utilizzare EUMM.

Infine, MI è fondamentalmente un involucro dichiarativo su EUMM. Si impacchetta anche insieme alla tua distro, nel tentativo di aggirare i problemi con gli utenti che cercano di installare moduli con vecchi moduli toolchain. Lo svantaggio del trucco “pacchetto self” è che se c’è un bug in MI stesso, devi ri-rilasciare tutti i tuoi moduli solo per risolverlo.

Per quanto riguarda la personalizzazione, ci sono alcuni plugin per MI, ma se si vuole andare oltre, si tornerà al problema di trattare con Makefile e build strumenti su una dozzina di piattaforms +, quindi non è davvero di aiuto sei troppo in quel regno.

Ho appena caricato Distribution :: Cooker su CPAN. È quello che uso per creare nuove distribuzioni. La cosa bella è che le tue distribuzioni possono essere qualsiasi cosa tu voglia: stai solo cucinando alcuni modelli. Non mi interessa se qualcuno lo usa. Per me è semplice, a bassa tecnologia e non causa problemi extra.

Potresti iniziare con qualcosa come Module :: Starter per creare i tuoi modelli di partenza, quindi aggiungere il tuo boilerplate e il tuo modo preferito di fare le cose. Scegli non solo ciò che vuoi in ogni file, ma quali file appaiono nella distribuzione. Quando capisci come ti piace fare le cose, devi semplicemente aggiornare i tuoi modelli.

Per quanto riguarda Makemaker e Module :: Build, il futuro è Module :: Build . Sono solo noi vecchi a usare Makemaker. 🙂 Ci sono modi per usare entrambi (o fingere di usarli entrambi) allo stesso tempo. Guarda i moduli Module :: Build, Module :: Build :: Compat e Module :: Install . Modulo :: Build è stato espulso dalla libreria standard di Perl e il suo futuro è incerto. È tornato a Makemaker come sistema di costruzione.

Anche se questa è una piccola risposta, prova ad usarne solo per ottenere un po ‘di esperienza con ciascuno.

Si potrebbe anche voler guardare Dist-Zilla che è un nuovo strumento solo autore per creare distribuzioni. Perché aiuta solo a build la distribuzione, non spedisce con il tuo codice o fa alcuna installazione, può fare un sacco di cose potenti.

L’unico problema con la compatibilità di Module :: Build è quando un utente tenta di installare i moduli senza aggiornare il proprio client CPAN (CPAN.pm o CPANPLUS.pm) Se stanno installando il modulo dal CPAN, possono aggiornare il proprio client con altrettanta facilità dallo stesso specchio

Se non vuoi fare nulla di complicato nel tuo processo di compilazione, certo: usa EUMM. Ma se si ha un problema di build su una piattaforma di destinazione diversa, si potrebbe finire nel Makefile, che è diverso su ogni variante di make.

Module :: Build ti offre molte funzionalità (qualsiasi cosa tu possa pensare se lo estendi) ed è tutto perl quindi non finirai mai per eseguire il debug di un makefile. Modulo :: Installa ti offre funzionalità, ma devi raggrupparlo e tutto finisce con “creare” alla fine.

Raccomando anche Module :: Build e Module :: Starter (con il plugin TT2 ).

Module :: Build è meglio con qualsiasi mezzo, ma è meno ampiamente supportato di ExtUtils :: MakeMaker (in particolare, le versioni precedenti di Perl non supportano immediatamente). Dipende dai tuoi bisogni.

Personalmente, raccomando Module :: Install, come fanno molte persone che conosco – anche quelli come Catalyst e Moose lo usano.

Ecco un piccolo chiarimento della direzione che speravo che le risposte avrebbero preso:

  • pro / contro di vari framework
  • compatibilità / installazione base di quadri
  • idoneità per versioni interne (locali) e esterne (CPAN)
  • non nude “usa X” risposte

La risposta di Dave ha alcune buone informazioni pro / contro. La risposta di Leon allude alla compatibilità ma non è esplicita. Come si è detto , solo i vecchi cappelli usano EUMM, ma non sono convinto che MB sia un buon framework per le cose destinate a CPAN perché non fa parte del nucleo fino al 5.9.

Ci sono pro e contro per entrambi. In questi giorni utilizzo e raccomando Module :: Build e Module :: Starter.

EU :: MM sembra ancora essere il più ampiamente supportato e popolare, ma Module :: Build sta recuperando terreno. Inoltre, controlla Module :: Starter per un modulo che ti aiuterà a iniziare.