Автоматизация увеличения количества пакетов R
Проблема
Я разрабатываю пакет R, и я хочу автоматически увеличивать версию каждый раз, когда я ее создаю. Я хочу, чтобы это могло связывать мои результаты с пакетами. На данный момент я использовал свою собственную уродливую функцию для этого.
Мой вопрос: есть ли способ сделать это лучше? Или я должен избегать этого вообще?
Другой вариант
Еще один вариант, о котором я думал, - установить мой пакет (размещенный в github) с помощью "devtools:: install_github", а затем сохранить мои результаты (или добавить к графикам) GithubSHA1, который сохраняется в установленном файле DESCRIPTION.
Например, я могу получить версию и GithubSHA1, как это для пакета'devtools ':
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="/"))
}
Ответы
Ответ 1
Если вы используете 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
сразу после тега release.) 131
- это количество коммитов со времени последнего тега. ca78343
- это первый семь символов шестнадцатеричного идентификатора последнего коммита.
Это было бы замечательно, за исключением того, что вы не можете иметь строки версий, подобные этому в R-пакетах, R не позволяет этого. Поэтому для R мы преобразуем эту строку версии, используя следующий script: 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"`'/' > [email protected]
Это довольно удобно, вам ничего не нужно делать, кроме добавления тегов выпуска и
теги -pre
.
Btw. это было в основном разработано моим другом и сографом-играфом Тамасом Непушем, поэтому его заслугой.
Ответ 2
Для более простого подхода рассмотрите инструмент crant
с помощью переключателя -u
. Например,
crant -u 3
будет увеличивать третий компонент версии на единицу. Существует также Git и SVN-интеграция, а также множество других полезных переключателей для роугенизации, сборки, проверки и т.д.
Ответ 3
Так как автоматически увеличивающаяся нумерация версий не будет встроена в пакет devtools
, я devtools
способ, основанный на ответе Габора (кстати, ссылка на igraph в его ответе мертва).
Когда я собираюсь зафиксировать наш репозиторий, я запускаю этот скрипт bash, чтобы установить дату на сегодня и установить номер версии на основе последнего тега, префикса .90 (как предлагается здесь в книге 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 --quiet
# get version number: latest tag + .90 + number of commits (like 0.6.1.9033)
newversion='git describe --tags | sed 's/-/.90/' | sed 's/-.*//' | sed 's/v//''
sed -i -- "s/^Version: .*/Version: ${newversion}/" DESCRIPTION
echo "First 3 lines of DESCRIPTION:"
head -3 DESCRIPTION
echo
# ... after here more commands like devtools::document() and git commit
Чтобы было понятно - этот скрипт на самом деле вносит эти изменения в файл DESCRIPTION
.
Более подробно git describe --tags...
работу git describe --tags...
часть:
git describe --tags # 'v0.6.1-33-g4ca00e1'
| sed 's/-/.90/' # 'v0.6.1.9033-g4ca00e1'
| sed 's/-.*//' # 'v0.6.1.9033'
| sed 's/v//' # '0.6.1.9033'