自动化R包的版本增加

时间:2014-06-13 15:48:19

标签: r package

问题

我正在开发一个R包,我希望每次构建它时都会自动增加它。我希望能够将我的结果与包版本相关联。现在我使用自己的丑陋的函数来做到这一点。

我的问题是:有没有办法做得更好?或者,我应该避免这样做吗?

另一个选项

我想到的另一个选择是使用'devtools :: install_github'安装我的包(托管在github中),然后保存我的结果(或添加到图中)保存在已安装的DESCRIPTION文件中的GithubSHA1。 / p>

例如,我可以获得'devtools'包的版本和GithubSHA1:

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

到目前为止我的尝试

我编写了以下函数来生成一个新的DESCRIPTION文件,其中包含更新的版本和日期。 (增加主要版本是我不介意每手增加的东西)

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="/"))
}

3 个答案:

答案 0 :(得分:19)

如果您使用git,则可以使用git标签创建版本字符串。这是我们生成igraph库的版本字符串的方式:

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

它为您提供了这样的格式:

0.8.0-pre+131.ca78343

0.8.0-pre是当前分支上的最后一个标记。 (最后发布的版本是0.7.1,我们在发布标记之后立即创建一个-pre标记。)131是自上一个标记以来的提交数。 ca78343是最后一次提交的十六进制id的前七个字符。

这很好,除了你不能在R包中有这样的版本字符串,R不允许它。因此,对于R,我们使用以下脚本转换此版本字符串:https://github.com/igraph/igraph/blob/develop/interfaces/R/tools/convertversion.sh

本质上,它创建的版本号比上一版本大,小于下一版本(-pre标签中的版本号)。从0.8.0-pre+131.ca78343创建

0.7.999-131

其中131是自上次发布以来的提交次数。

我将DESCRIPTION文件的生成放在Makefile中。这将替换日期和版本号:

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

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

这很方便,你不需要做任何事情,除了添加发布标签和 -pre标签。

顺便说一下。这主要是由我的朋友和igraph联合开发人员TamásNepusz制定的,所以归功于他。

答案 1 :(得分:4)

对于更简单的方法,请考虑将crant工具与-u开关一起使用。例如,

crant -u 3

会将版本的第三个组件增加一个。还有Git和SVN集成,以及一系列其他有用的开关,用于氧化,构建,检查等。

答案 2 :(得分:1)

由于将自动递增的版本编号not going to be built放入了devtools包中,因此我想出了一种基于Gabor's answer的方法(他答案中指向igraph的链接还是无效的)。 / p>

当我要提交到存储库时,我运行此bash脚本将日期设置为今天,并根据最新标签.9000后缀(如Hadley建议的here in the book R Packages来设置版本号) Wickham)以及该标记中的提交次数:

echo "••••••••••••••••••••••••••••••••••••••••••••"
echo "• Updating package date and version number •"
echo "••••••••••••••••••••••••••••••••••••••••••••"
sed -i -- "s/^Date: .*/Date: $(date '+%Y-%m-%d')/" DESCRIPTION
# get latest tags
git pull --tags --quiet
current_tag=`git describe --tags --abbrev=0 | sed 's/v//'`
current_commit=`git describe --tags | sed 's/.*-\(.*\)-.*/\1/'`
# combine tag (e.g. 0.1.0) and commit number (like 40) increased by 9000 to indicate beta version
new_version="$current_tag.$((current_commit + 9000))" # results in 0.1.0.9040
sed -i -- "s/^Version: .*/Version: ${new_version}/" DESCRIPTION
echo "First 3 lines of DESCRIPTION:"
head -3 DESCRIPTION
echo
# ... after here more commands like devtools::document() and git commit

请注意-该脚本实际上对DESCRIPTION文件进行了这些更改。

编辑:支持数百个-现在只需将提交序列号增加9000即可。因此,在标签v0.6.1中提交#120会导致0.6.1.9120