问题
我正在开发一个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="/"))
}
答案 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)
答案 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
。