Подтвердить что ты не робот

Автоматизация увеличения количества пакетов 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="/"))
}
4b9b3361

Ответ 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'