2015-04-27 7 views
6

Diciamo che ho un modulo su CPAN e vorrei aggiornarlo per utilizzare le funzionalità dei nuovi Perls. In questo momento, a quanto ho capito, se lo faccio metterò una riga nella sabbia dicendo che da questa versione puoi usare il mio modulo solo se hai la versione X di Perl.Come posso scrivere un modulo CPAN per supportare più versioni Perl?

Esiste un modo pulito/canonico per supportare due rami diversi dello stesso modulo su CPAN?

, ad esempio, la serie 2.x continuerà a essere mantenuta per le versioni precedenti a 5.8.x, mentre 3.x per la versione 5.16+.

+0

Non penso di essere stato abbastanza chiaro - Sto cercando di convincere CPAN a considerare più versioni dello stesso modulo da supportare, proprio come Perl 5.18.4 e 5.20.2 sono entrambe considerate versioni supportate di Perl 5 (proprio adesso). In questo modo posso rimuovere tutti i 5.8isms dalla base di codice attiva mentre ancora sto supportando 5.8 su una base di codice meno attiva (senza cambiare il nome del modulo) –

+1

Dovrai spiegare un po 'meglio. L'utility 'cpan' installa solo l'ultima versione di qualsiasi modulo. Se si desidera uno precedente, è necessario scaricarlo, installarlo, testarlo e installarlo manualmente. Potresti scrivere un modulo wrapper che carica diversi moduli worker a seconda della versione dell'interprete, ma dovrebbero avere nomi diversi. – Borodin

+0

I * think * cpxxxan risolve il problema a cui sono interessato, anche se non so se c'è un modo per renderlo più basato sul contratto. È qualcosa che sono un po 'nervoso per google al lavoro ... –

risposta

4

Il problema con l'avere due rami con lo stesso nome è che cpan The::Module avrà esito negativo per alcuni utenti (poiché otterrà sempre l'ultima versione). Sarebbero comunque in grado di installare la versione precedente del modulo, ma sarebbe molto più ingombrante. Invece, cambiare il modulo di

package The::Module; 
do($] < 5.016 ? 'The/Module/Pre5016.pm' : 'The/Module/5016.pm') 
    or die [email protected] || $!; 
1; 

Se solo alcune parti limitate del modulo sono diverse, si può semplicemente utilizzare

sub _foo_compatible { ... } 

sub _foo_fast { ... } 

*foo = $] < 5.016 ? \&_foo_compatible : \&_foo_fast; 

Questo secondo metodo ha lo svantaggio di dover entrambi sottomarini compilare a 5,8 (salvo aggiungi eval EXPR al mix).

+0

Questa è ancora una versione del modulo, fa solo cose diverse in base alla versione; quello che mi chiedo è se posso pubblicare il modulo v2.x in CPAN e utilizzare perl 5.8.9, mentre il modulo di pubblicazione v3.x è utilizzato da qualsiasi cosa più recente. Il trucco è, come posso ottenere CPAN/cpanm/qualunque cosa per mantenere la distinzione per versione del modulo, piuttosto che avere il mio modulo gestirlo tutto? –

+0

Anche se può funzionare, è sbagliato sostenere l'uso di variabili deprecate. '$^V' è stato documentato come * Deprecato in Perl 5.6 * da quando perlvar v5.14.0 – Borodin

+0

Cerchiamo [continua questa discussione in chat] (http://chat.stackoverflow.com/rooms/76377/discussion-between -borodin-e-Ikegami). – Borodin

5

La variabile $] è stato deprecato in favore di the $^V variable che detiene la versione della corrente dell'interprete Perl come oggetto version (o undef se la versione è precedente alla v5.6).

Questo permette la versione da confrontare con un version string constant come v5.10 che produce una stringa compattata (contenente ogni ordinale versione di un codice di carattere, così v5.10 eq "\x05\x0A" è vero).

Perché v-string sono stringhe li si deve confrontare con i comparatori stringa lt, le, eq, ge e gt, quindi si può scrivere qualcosa di simile a

use v5.6; 

if ($^V ge v5.10) { ... } 

ma mi chiedo come il tuo codice sarebbe tra le diverse versioni di Perl? La maggior parte dei cambiamenti sono quelli sintattici che offrono un modo più semplice di scrivere certi costrutti. Di solito è necessario solo scrivere per la prima versione che si desidera supportare. Questo era un v5.8, ma la v5.10 è stata una revisione importante e molte persone ritengono che sia una versione minima richiesta ora che ha più di sette anni.

+1

@ikegami: Sì. È l'ultimo nella lista di * Variabili deprecate e rimosse * – Borodin

+3

Ri "Poiché le stringhe v sono stringhe, è necessario confrontarle con i comparatori di stringhe", Non è così. In effetti, tutti gli esempi nella documentazione per gli oggetti versione utilizzano operatori di confronto numerici. Anche gli operatori di confronto delle stringhe funzionano, ma non è assolutamente necessario utilizzarli. ("Gli oggetti versione sovraccaricano gli operatori' cmp' e '<=>' Perl genera automaticamente tutti gli altri operatori di confronto basati su questi due in modo che funzionino tutti i normali confronti logici. ") – ikegami

+3

' $] 'non è stato effettivamente deprecato. Si trattava di un bug documentale che è stato [riparato] (http://perl5.git.perl.org/perl.git/commitdiff/4ad0ecd4c5a81ed8f71804b908656dca23f4867e). – ikegami

Problemi correlati