1 Жизнь до CRAN

До того, как я решил в конце декабря залить свой пакет lingtypology в CRAN он себе спокойно жил на GitHub и продолжает жить до сих пор. Несколько моих друзей и студентов его использовали, но в целом фидбека было мало. Поэтому я решил залить его на CRAN, потому что

  • CRAN позволяет скачивать пакет регулярным образом install.packages("lingtypology"). Это важно, так как существуют люди, которые стараются не скачивать всякий странный софт с GitHub.
  • CRAN пересобирает пакет на самых разных операционных системах, так что в разделе CRAN checks можно посмотреть, на чем ломается твой пакет
  • CRAN заставит вас перелопатить все самым занудным образом и будет ципляться ко всяким мелочам, но в результате можно стать как все. Это хорошо, если вам важно стабильность работы софта.
  • CRAN придает пакету официальный статус, так что потом можно будет кинуть письмо в Linguist List и получить больший фидбек.

Надо сказать, что я пролистал книгу Хадли Викхама, когда делал пакет, но мелочи какие-то пропустил. Да и вообще, кто будет читать все целиком, если уже все получается?

2 Жизнь во время CRAN

Первое, чего не хватает пакету, это pdf-мануала, который прочитает все описания всех функций и cкомпелирует LaTeXjм все это в один pdf, который должен храниться в папке /inst/doc/manual/ вашего пакета. Почему-то у меня он упорно не хотел компелироваться, так что теперь я делаю это такой строчкой в терминале, а потом сохраняю, куда нужно:

R CMD Rd2pdf путь_к_вашему_пакету

CRAN-ребятки предложили мне выделить все URL-ссылки угловыми скобками в файлу DESCRIPTION. Знайте, это относиться только к разделу Description, а к разделу URL уже не относиться. Еще они предложили превратить унылый wiki на GitHub в то, что называется vignette. Переделал. Однако я поспешил, потому что почему-то у было ощущение, что надо быстрее-скорее, вызванное, видимо, желанием залить все до Нового Года. В результате виньетка оказалась некрасивой, да и в пакете потом начала появляться ошибка, которая не появлялась раньше. Но я залил. Пакет собрался. И все. Здесь очень важно понимать, что при сборке пакета проверяются только примеры из документации функций, так что некоторые аргументы функций я в примеры не вставил, но вставил в виньетку. Результат: на части машин пакет выдавал предупреждение на этапе построения виньетки.

3 Жизнь после CRAN

Ну вот я залил все на CRAN, у меня появилась страница и на ней медленно но верно появлялись бинарники для виндоус и мак, которые собирали добровольцы CRAN на разных машинах. Я грустил, что у меня в пакете ошибка и некрасивая виньетка. Залить новую версию я не могу, так как CRAN policy требует экономить время добровольцев и не коммитить пакеты чаще чем раз в месяц. Я решил привинтить к пакету еще несколько функций, так чтобы в конце января засабмитить новую версию. И сделал в GitHub релиз пакета.

Для того, чтобы сделать GitHub pages я использовал тот же html виньетки, который я клал в корень пакета и называл README.html. Однако если данный файл лежит в папке во время проверки пакета, то проверка будет выдавать замечания. Я в таких случаях на время проверки лишние файлы убирал, а потом снова клал. Однако потом я обнаружил, что можно написать файл .Rbuildignore, в котором можно перечислить все лишнее, все, что мне нужно, чтобы R check не видел. Это важно, потому что если пакет закачан на GitHub с лишними файлами, то он с ними же будет скачиваться пользователями, то есть потенциально может вызывать ошибку.

Кроме того, существуют файлы и папки, которые R создает, но которые к пакету не относятся, например, файл .Rproj или папку .Rproj.user. Чтобы GitHub не считал, что весь R пакет написан на Java или HTML, нужно добавить файл .gitignore и записать в него все лишнее.

В R есть функция citation(), которая по умолчанию выдает ссылку на мануал или на установленные автором записи.

citation("ggplot2")
## 
## To cite ggplot2 in publications, please use:
## 
##   H. Wickham. ggplot2: Elegant Graphics for Data Analysis.
##   Springer-Verlag New York, 2009.
## 
## A BibTeX entry for LaTeX users is
## 
##   @Book{,
##     author = {Hadley Wickham},
##     title = {ggplot2: Elegant Graphics for Data Analysis},
##     publisher = {Springer-Verlag New York},
##     year = {2009},
##     isbn = {978-0-387-98140-6},
##     url = {http://ggplot2.org},
##   }

Для того, чтобы изменить результат вывода функции citation() в папку /inst/ нужно добавить файл CITATION, в котором следует записать все необходимое. Шаблон легко можно найти в интернете.

И последнее, что я решил сделать это завести бейджики в GitHub. Мне очень нравились бейджики, которые видел в других пакетах, хотя и не до конца понимал их назначение. Одни бейджики просто берут информацию откуда-то, например, из CRAN. Так легко получить бейджик с количеством скачиваний, легко сделать бейджик с версией пакета, но бывают другие сервисы, которыми часто пользуются разроботчики R. Я решил использовать Travis, который создает контейнер с системой, R, пакетом и его зависмыми. Все что он делает это проверяет – собирется или нет. Другой сервис codecov.io предоставляет данные о покрытии кода, однако на моем пакете он упорно говорит 0%. Возможно, в ближайшее время я разберусь с ним. А может быть и нет. Все эти стороние сервисы смотрят на коммит в гитхабе и начинают анализровать каждый новый коммит, а потом обновляют бейджик.