自动增加R包的版本

自动增加R包的版本,r,package,R,Package,问题 我正在开发一个R包,我想在每次构建它时自动增加版本。我希望它能够将我的结果与包版本相关联。目前,我正在使用自己的丑陋函数来实现这一点 我的问题是:有没有办法做得更好?或者,我应该一般避免这样做吗 另一个选项 我考虑的另一个选项是使用“devtools::install_github”安装我的包(托管在github中),然后将保存在已安装的描述文件中的GithubSHA1与我的结果一起保存(或添加到绘图中) 例如,我可以获得类似“devtools”包的版本和GithubSHA1: read.

问题

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

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

另一个选项

我考虑的另一个选项是使用“devtools::install_github”安装我的包(托管在github中),然后将保存在已安装的描述文件中的GithubSHA1与我的结果一起保存(或添加到绘图中)

例如,我可以获得类似“devtools”包的版本和GithubSHA1:

read.dcf(file=system.file("DESCRIPTION", package="devtools"), 
         fields=c("Version", "GithubSHA1"))
 ##      Version    GithubSHA1                                
 ## [1,] "1.5.0.99" "3ae58a2a2232240e67b898f875b8da5e57d1b3a8"
我迄今为止的尝试

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


incVer如果您使用的是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,我们使用以下脚本转换此版本字符串:

本质上,它创建的版本号大于上次发布的版本,小于下一个版本(在
-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"`'/' > $@
VERSION=$(shell./tools/convertversion.sh)
IGRAPHE/说明:src/说明版本号
sed的/^版本:.*$/版本:'$(版本)/'$<|\
sed的/^日期:.*$/日期:'`Date'+%Y-%m-%d'''/'>$@
这非常方便,除了添加发布标签和
-pre
标签


顺便说一句,这主要是由我的朋友和igraph的共同开发者Tamás Nepusz完成的,所以这是他的功劳 -U/COD>开关的工具。比如说,

crant -u 3

将版本的第三个组件增加1。还有Git和SVN集成,以及一系列其他有用的开关,用于roxygenize、build、checking等。

随着自动递增版本编号进入
devtools
包,我找到了一种基于的方法(他的答案中指向igraph的链接是死的)

当我准备提交到我们的存储库时,我运行这个bash脚本将日期设置为今天,并根据最新的标记、.9000后缀(由Hadley 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
需要明确的是-此脚本实际上对
说明
文件进行了这些更改


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

我在这里没有发现太多丑陋之处,Roxygen2软件包也使用了类似的方法。但是Roxygen2除了collate字段外,不处理描述文件,对吗?我观察到Roxygen2有时会显著地重新格式化我的描述文件,例如,它会断线等等。哟,复杂(但看起来很有用)不是很复杂,就是这样。一旦你有了脚本,你只需要添加两个git标签,其中一个你无论如何都要添加。但很遗憾,R不支持更好的版本字符串(顺便说一句,这也能很好地处理“已发布”的版本,因此如果您签出一个版本,那么上面的
git
一行代码给出了准确的版本号,而没有
+
和提交id,或者
-pre
.Btw.2。在我们的包中,我们还包括一个
igraph.version()
函数,该函数提供正确的版本字符串,即
0.8.0-pre+131.ca78343
。非常感谢您的回答。我花了一些时间讨论了细节,您描述的方式非常容易理解。我可能会使用您答案的某些部分(我必须很快学会使用
sed
)。我希望得到一个更多地依赖R而更少依赖git标记的答案。我确信我在
devtools::build
,或者其他什么东西中遗漏了一个参数。如果没有任何结果,我会非常高兴给你奖金!@alko989:我认为让
构建包
提交是个坏主意。首先,你想构建包,这样你就可以测试它是否工作。如果它工作(第一次尝试时,大多数情况下不工作),那么您可以提交。通常在提交之前,您会构建很多次。此外,使用上面详细介绍的设置,您不需要标记每次提交。您只需标记“已发布”版本。我的方法确保所有提交之间都会得到有意义的版本号。谢谢!我会看一看。(在文档中,您使用的是
rant
而不是
crant
,我是遗漏了什么还是仅仅是一个输入错误?@alko989:是的,这是一个输入错误。要修复它吗?:-)我修复并提出了一个拉取请求。@alko989:谢谢。我不能合并你的公关,但我相信最终会合并的。