【问题标题】:Automating version increase of R packages自动增加 R 包的版本
【发布时间】:2014-08-04 06:00:21
【问题描述】:

问题

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

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

另一种选择

我正在考虑的另一个选项是使用“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 <- 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="/"))
}

【问题讨论】:

  • 我没有发现太多丑陋的地方,Roxygen2 包使用了类似的方法。
  • 但是roxygen2不处理DESCRIPTION文件,除了collat​​e字段,对吧?
  • 我观察到 roxygen2 有时会显着重新格式化我的说明文件,例如它断线等。

标签: r package


【解决方案1】:

由于自动递增版本编号是 not going to be builtdevtools 包中,我想出了一种基于 Gabor's answer 的方法(他的答案中指向 igraph 的链接已经死了顺便说一句)。

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

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

【讨论】:

  • 你试过让这个命令通过 git 的 'post-commit' 钩子运行吗?
  • 不,但绝对有兴趣。那将如何运作?我怎么能用它来更新文件,为什么更喜欢在本地做呢?只是好奇有什么好处:)
  • 我的理解有限,但是钩子允许代码在VC更新的不同点自动运行。因此,您应该能够设置一个在每次提交时运行脚本的钩子。似乎您希望将此作为预提交挂钩。希望这可以帮助您确定方向。
【解决方案2】:

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

crant -u 3

将版本的第三个组件加一。还有 Git 和 SVN 集成,以及许多其他有用的开关,用于 roxygenizing、构建、检查等。

【讨论】:

  • 谢谢!我会看看。 (似乎在您使用rant 而不是crant 的文档中,是我遗漏了什么还是只是一个错字?)
  • @alko989:是的,这是一个错字。关心修复它吗? :-)
  • 我修复并提出了拉取请求。
  • @alko989:谢谢。我无法合并您的 PR,但我相信所有者最终会合并。
【解决方案3】:

如果你使用的是 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ás Nepusz 完成的,所以功劳是他的。

【讨论】:

  • 哎呀,复杂(但看起来很有用)
  • 不是很复杂,就是这样。一旦你有了脚本,你只需要添加两个 git 标签,其中一个你无论如何都会添加。很遗憾,R 不支持更好的版本字符串。 :(
  • 顺便说一句。这也可以很好地处理“已发布”版本,因此如果您签出一个版本,那么上面的git 单行代码会给出不带+ 和提交ID 或-pre 的确切版本号。顺便说一句。2。在我们的包中,我们还包含一个igraph.version() 函数,它提供正确的版本字符串,即0.8.0-pre+131.ca78343
  • 非常感谢您的回答。我花了一些时间来详细介绍,你描述它的方式真的很容易理解。我可能会使用您答案的某些部分(我必须很快学会使用sed)。我希望得到更多依赖于 R 而更少依赖于 git 标签的答案。我确定我在devtools::build 中遗漏了一个论点,或者其他什么。如果没有任何事情发生,我会很高兴给你赏金!
  • @alko989:我认为提交build_package 是个坏主意。首先,您要构建包,以便您可以测试它是否有效。如果它有效(大多数时候它没有,第一次尝试),那么你可以提交。通常,在您提交之前,您会构建很多次。此外,使用上面详述的设置,您不需要标记每个提交。您只标记“已发布”版本。我的方法确保其间的所有提交都将获得有意义的版本号。
猜你喜欢
  • 2023-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-11
相关资源
最近更新 更多