2014-06-13 12 views
21

ProblemaAutomatizzare incremento versione di R pacchetti

Sto sviluppando un pacchetto R e voglio aumentare la versione automaticamente ogni volta che costruisco. Voglio che sia in grado di associare i miei risultati alle versioni dei pacchetti. Per ora stavo usando la mia funzione brutta per farlo.

La mia domanda è: c'è un modo per farlo meglio? O, dovrei evitare di farlo in generale?

Un'altra opzione

Un'altra opzione Stavo pensando di è quello di installare il mio pacchetto (ospitato in github) utilizzando'devtools :: install_github' e quindi salvare con i miei risultati (o l'aggiunta di trame) il GithubSHA1 che viene salvato nel file DESCRIPTION installato.

Per esempio posso ottenere la versione e GithubSHA1 come quella per il pacchetto'devtools':

read.dcf(file=system.file("DESCRIPTION", package="devtools"), 
     fields=c("Version", "GithubSHA1")) 
##  Version GithubSHA1         
## [1,] "1.5.0.99" "3ae58a2a2232240e67b898f875b8da5e57d1b3a8" 

miei tentativi finora

ho scritto la seguente funzione per produrre un nuovo file di descrizione , con versione aggiornata e data. (Aumento della versione principale è una cosa che non mi dispiace crescente per mano)

incVer <- function(pkg, folder=".", increase="patch"){ 
    ## Read DESCRIPTION from installed package ´pkg´ and make new one on the specified 
    ## ´folder´. Two options for ´increase´ are "patch" and "minor" 
    f <- read.dcf(file=system.file("DESCRIPTION", package=pkg), 
        fields=c("Package", "Type", "Title", "Version", "Date", 
          "Author", "Maintainer", "Description", "License", 
          "Depends", "Imports", "Suggests")) 
    curVer <- package_version(f[4]) 
    if(increase == "patch") { 
     curVer[[1,3]] <- ifelse(is.na(curVer$patchlevel), 1, curVer$patchlevel + 1) 

    } else if (increase == "minor") { 
     curVer[[1,2]] <- ifelse(is.na(curVer$minor), 1, curVer$minor + 1) 
     curVer[[1,3]] <- 0 
    } else { 
     stop(paste("Can not identify the increase argument: " , increase)) 
    } 

    f[4] <- toString(curVer) 
    ## Update also the date 
    f[5] <- format (Sys.time(), "%Y-%m-%d") 
    write.dcf(f, file=paste(folder, "DESCRIPTION", sep="/")) 
} 
+1

Non trovo molto brutto qui, un approccio simile è utilizzato dal pacchetto Roxygen2. – gagolews

+1

Ma roxygen2 non ha a che fare con il file DESCRIPTION, eccetto per il campo collation, giusto? – alko989

+1

Ho osservato che roxygen2 a volte riformatta in modo significativo i miei file DESCRIPTION, ad es. rompe le linee, ecc. – gagolews

risposta

15

Se si utilizza git, quindi è possibile utilizzare i tag git per creare una stringa di versione. Questo è il modo in cui generare la stringa di versione della nostra biblioteca igraph:

git describe HEAD --tags | rev | sed 's/g-/./' | sed 's/-/+/' | rev 

Ti dà un formato simile a questo:

0.8.0-pre+131.ca78343 

0.8.0-pre è l'ultima etichetta sul ramo corrente. (L'ultima versione rilasciata era 0.7.1 e abbiamo creato un tag -pre subito dopo il tag di rilascio.) 131 è il numero di commit dall'ultimo tag. ca78343 è il primo sette carattere dell'ID esadecimale dell'ultimo commit.

Sarebbe fantastico, tranne che non è possibile avere stringhe di versione come questa nei pacchetti R, R non lo consente. Quindi per R trasformiamo questa stringa di versione usando il seguente script: https://github.com/igraph/igraph/blob/develop/interfaces/R/tools/convertversion.sh

In sostanza crea un numero di versione più grande dell'ultima versione rilasciata e più piccolo delle versioni successive (quello nel tag -pre). Da 0.8.0-pre+131.ca78343 crea

0.7.999-131 

dove 131 è il numero di commit dopo l'ultima release.

Ho inserito la generazione del file DESCRIPTION in un Makefile.Questo sostituisce la data e il numero di versione:

VERSION=$(shell ./tools/convertversion.sh) 

igraph/DESCRIPTION: src/DESCRIPTION version_number 
     sed 's/^Version: .*$$/Version: '$(VERSION)'/' $<  | \ 
     sed 's/^Date: .*$$/Date: '`date "+%Y-%m-%d"`'/' > [email protected] 

Questo è molto conveniente, non c'è bisogno di fare qualsiasi cosa, tranne che per l'aggiunta dei tag di rilascio e le -pre tag.

Btw. questo è stato per lo più elaborato dal mio amico e co-sviluppatore di igraph, Tamás Nepusz, quindi il merito è suo.

+1

yow, complicato (ma sembra abbastanza utile) –

+0

Non molto complicato, questa è la cosa. Una volta che hai gli script, devi solo aggiungere due tag git, uno dei quali lo aggiungerei comunque. È davvero un peccato, però R non supporta le migliori stringhe di versione. :( –

+0

Btw. Questo gestisce anche le versioni "rilasciate" bene, quindi se esegui il checkout di un rilascio, quindi il 'git' one-liner sopra fornisce il numero esatto delle versioni senza' + 'e l'id commit o il' -pre '.Btw.2 nel nostro pacchetto includiamo anche una funzione' igraph.version() 'che fornisce la stringa della versione corretta, ovvero' 0.8.0-pre + 131.ca78343'. –

3

Per un approccio più semplice, prendere in considerazione l'utilizzo dello strumento crant con lo switch -u. Ad esempio,

crant -u 3 

incrementerà il terzo componente della versione di uno. C'è anche l'integrazione Git e SVN, e un sacco di altri utili switch per il roxygenizing, la costruzione, il controllo ecc.

+0

Grazie per quello! Darò un'occhiata. (Sembra che nella documentazione si usi 'rant' invece di' crant', mi manchi qualcosa o si tratta solo di un refuso?) – alko989

+0

@ alko989: Sì, è un refuso. Cura di aggiustarlo? :-) – krlmlr

+0

Ho risolto e fatto una richiesta di pull. – alko989

Problemi correlati