A new minor release of the drat package arrived on CRAN today, which is just over a year since the previous release. drat stands for drat R Archive Template, and helps with easy-to-create and easy-to-use repositories for R packages. Since its inception in early 2015 it has found reasonably widespread adoption among R users because repositories with marked releases is the better way to distribute code.
Because for once it really is as your mother told you: Friends
don’t let friends install random git commit snapshots. Properly
rolled-up releases it is. Just how CRAN shows us: a model that has
demonstrated for over two-and-a-half decades how to do this.
And you can too: drat
is easy to use, documented by six
vignettes and just works. Detailed information about
drat
is at its documentation site. That
said, and ‘these days’, if you mainly care about github code then r-universe is there too, also
offering binaries its makes and all that jazz. But sometimes you just
want to, or need to, roll a local repository and drat can help
you there.
This release contains a small PR (made by Arne Holmin just after the
previous release) adding support for an ‘OSflacour’ variable (helpful
for macOS). We also corrected an issue with one test file being
insufficiently careful of using git2r
only when installed,
and as usual did a round of maintenance for the package concerning both
continuous integration and documentation.
The NEWS
file summarises the release as follows:
Changes in drat version 0.2.5 (2024-10-21)
Function
insertPackage
has a new optional argumentOSflavour
(Arne Holmin in #142)A test file conditions correctly about git2r being present (Dirk)
Several smaller packaging updates and enhancements to continuous integration and documentation have been added (Dirk)
Courtesy of my CRANberries, there is a comparison to the previous release. More detailed information is on the drat page as well as at the documentation site.
If you like this or other open-source work I do, you can sponsor me at GitHub.
This post by Dirk Eddelbuettel originated on his Thinking inside the box blog. Please report excessive re-aggregation in third-party for-profit settings.
A new minor release of the drat package arrived on CRAN today making it the first release in one and a half years. drat stands for drat R Archive Template, and helps with easy-to-create and easy-to-use repositories for R packages. Since its inception in early 2015 it has found reasonably widespread adoption among R users because repositories with marked releases is the better way to distribute code.
Because for once it really is as your mother told you: Friends
don’t let friends install random git commit snapshots. Properly
rolled-up releases it is. Just how CRAN shows us: a model that has
demonstrated for two-plus decades how to do this. And you can
too: drat
is easy to use, documented by six
vignettes and just works. Detailed information about
drat
is at its documentation site. Two
more blog posts using drat from GitHub
Actions were just added today showing, respectively, how to add to a drat repo in
either push or pull mode.
This release contains two extended PRs contributed by drat users! Both extended support for macOS: Joey Reid extended M1 support to pruning and archival, and Arne Johannes added bug-sur support. I polished a few more things around the edges, mostly documentation or continuos-integrations related.
The NEWS
file summarises the release as follows:
Changes in drat version 0.2.4 (2023-10-09)
macOS Arm M1 repos are now also supported in pruning and archival (Joey Reid in #135 fixing #134)
A minor vignette typo was fixed (Dirk)
A small error with
setwd()
ininsertPackage()
was corrected (Dirk)macOS x86_64 repos (on big-sur) are now supported too (Arne Johannes Holmin in #139 fixing #138)
A few small maintenance tweaks were applied to the CI setup, and to the main README.md
Courtesy of my CRANberries, there is a comparison to the previous release. More detailed information is on the drat page as well as at the documentation site.
If you like this or other open-source work I do, you can sponsor me at GitHub.
This post by Dirk Eddelbuettel originated on his Thinking inside the box blog. Please report excessive re-aggregation in third-party for-profit settings.
A new minor release of drat arrived on CRAN today. drat stands for drat R Archive Template, and helps with easy-to-create and easy-to-use repositories for R packages. Since its inception in early 2015 it has found widespread adoption among R users because repositories with marked releases is the better way to distribute code. See below for a few custom reference examples.
Because for once it really is as your mother told you: Friends don’t let friends install random git commit snapshots. Properly rolled-up releases it is. Just how CRAN shows us: a model that has demonstrated for two-plus decades how to do this. And you can too: drat
is easy to use, documented by six vignettes and just works. Detailed information about drat
is at its documentation site.
This release adds support for the macOS Arm M1 architecture, initially supplied in a PR last fall and now finalized with additional tests. The NEWS
file summarises the release as follows:
Changes in drat version 0.2.3 (2022-04-13)
Courtesy of my CRANberries, there is a comparison to the previous release. More detailed information is on the drat page as well as at the documentation site.
If you like this or other open-source work I do, you can now sponsor me at GitHub.
This post by Dirk Eddelbuettel originated on his Thinking inside the box blog. Please report excessive re-aggregation in third-party for-profit settings.
A fresh and new minor release of drat arrived on CRAN overnight. This is another small update relative to the 0.2.0 release in April followed by a 0.2.1 update in July. This release follows the changes made in digest
yesterday. We removed the YAML file (and badge) for the disgraced former continuous integration service we shall not name (yet that we all used to use). And we converted the vignette from using the minidown package to the (fairly new) simplermarkdown package which is so much more appropriate for our use of the minimal water.css style.
drat stands for drat R Archive Template, and helps with easy-to-create and easy-to-use repositories for R packages. Since its inception in early 2015 it has found reasonably widespread adoption among R users because repositories with marked releases is the better way to distribute code. See below for a few custom reference examples.
Because for once it really is as your mother told you: Friends don’t let friends install random git commit snapshots. Properly rolled-up releases it is. Just how CRAN shows us: a model that has demonstrated for two-plus decades how to do this. And you can too: drat
is easy to use, documented by six vignettes and just works.
Detailed information about drat
is at its documentation site.
The NEWS
file summarises the release as follows:
Changes in drat version 0.2.2 (2021-12-01)
Travis artifacts and badges have been pruned
Vignettes now use simplermarkdown
Courtesy of my CRANberries, there is a comparison to the previous release. More detailed information is on the drat page as well as at the documentation site.
If you like this or other open-source work I do, you can now sponsor me at GitHub.
This post by Dirk Eddelbuettel originated on his Thinking inside the box blog. Please report excessive re-aggregation in third-party for-profit settings.
A new minor release of drat arrived on CRAN overnight. This is a minor update relative to the 0.2.0 release in April. This release will now create an empty file index.html
in the top-level (when initRepo()
is called), and check for presence of such a file when adding files to a repo (via insertPackage()
). This helps to avoid getting ‘404’ results when (perfectly valid) drat repos are checking by accessing the top-level URL, as for example CRAN does when testing if an Additional_repositoiries
is reachable. The ‘step-by-step’ vignette had already suggested creating one by hand, this is now done programmatically (and one is present in the repo suggsted to fork from too).
drat stands for drat R Archive Template, and helps with easy-to-create and easy-to-use repositories for R packages. Since its inception in early 2015 it has found reasonably widespread adoption among R users because repositories with marked releases is the better way to distribute code. See below for a few custom reference examples.
Because for once it really is as your mother told you: Friends don’t let friends install random git commit snapshots. Properly rolled-up releases it is. Just how CRAN shows us: a model that has demonstrated for two-plus decades how to do this. And you can too: drat
is easy to use, documented by six vignettes and just works.
The NEWS
file summarises the release as follows:
Changes in drat version 0.2.1 (2021-07-09)
Two internal functions now have a note in their documentation stating them as not exported (Dirk in response to #123)
Repositories created by
initRepo
now have an placeholderindex.html
to not trigger acurl
check at CRAN (Dirk)Adding to a repository now checks for a top-level
index.html
and displays a message if missing (Dirk)The DratStepByStep.Rmd vignette mentions the added
index.html
file
Courtesy of my CRANberries, there is a comparison to the previous release. More detailed information is on the drat page.
If you like this or other open-source work I do, you can now sponsor me at GitHub.
This post by Dirk Eddelbuettel originated on his Thinking inside the box blog. Please report excessive re-aggregation in third-party for-profit settings.
A new release of drat arrived on CRAN today. This is the first release in a few months (with the last release in July of last year) and it (finally) makes the leap to supporting docs/
in the main branch as we are all so tired of the gh-pages
branch. We also have new vignettes, new (and very shiny) documentation and refreshed vignettes!
drat stands for drat R Archive Template, and helps with easy-to-create and easy-to-use repositories for R packages. Since its inception in early 2015 it has found reasonably widespread adoption among R users because repositories with marked releases is the better way to distribute code. See below for a few custom reference examples.
Because for once it really is as your mother told you: Friends don’t let friends install random git commit snapshots. Or as we may now add: stay away from semi-random universes snapshots too.
Properly rolled-up releases it is. Just how CRAN shows us: a model that has demonstrated for two-plus decades how to do this. And you can too: drat
is easy to use, documented by (now) six vignettes and just works.
The NEWS
file summarises the release as follows:
Changes in drat version 0.2.0 (2021-04-21)
A documentation website for the package was added at https://eddelbuettel.github.io/drat/ (Dirk)
The continuous integration was switched to using ‘r-ci’ (Dirk)
The
docs/
directory of the main repository branch can now be used instead ofgh-pages
branch (Dirk in #112)A new repository https://github.com/drat-base/drat can now be used to fork an initial
drat
repository (Dirk)A new vignette “Drat Step-by-Step” was added (Roman Hornung and Dirk in #117 fixing #115 and #113)
The test suite was refactored for
docs/
use (Felix Ernst in #118)The minimum R version is now ‘R (>= 3.6)’ (Dirk fixing #119)
The vignettes were switched to
minidown
(Dirk fixing #116)A new test file was added to ensure ‘NEWS.Rd’ is always at the current release version.
Courtesy of my CRANberries, there is a comparison to the previous release. More detailed information is on the drat page.
If you like this or other open-source work I do, you can now sponsor me at GitHub.
This post by Dirk Eddelbuettel originated on his Thinking inside the box blog. Please report excessive re-aggregation in third-party for-profit settings.
A new version of drat arrived on CRAN today. This is a follow-up release to 0.1.7 from a week ago. It contains a quick follow-up by Felix Ernst to correct on of the tests which misbehaved under the old release of R still being tested at CRAN.
drat stands for drat R Archive Template, and helps with easy-to-create and easy-to-use repositories for R packages. Since its inception in early 2015 it has found reasonably widespread adoption among R users because repositories with marked releases is the better way to distribute code.
As your mother told you: Friends don’t let friends install random git commit snapshots. Rolled-up releases it is. drat
is easy to use, documented by five vignettes and just works.
The NEWS
file summarises the release as follows:
Changes in drat version 0.1.8 (2020-07-18)
Courtesy of CRANberries, there is a comparison to the previous release. More detailed information is on the drat page.
If you like this or other open-source work I do, you can now sponsor me at GitHub. For the first year, GitHub will match your contributions.
This post by Dirk Eddelbuettel originated on his Thinking inside the box blog. Please report excessive re-aggregation in third-party for-profit settings.
A new version of drat arrived on CRAN yesterday. Once again, this release is mostly the work of Felix Ernst who extended some work from the previous release, and added support for repository updates (outside of package insertion) and more.
drat stands for drat R Archive Template, and helps with easy-to-create and easy-to-use repositories for R packages. Since its inception in early 2015 it has found reasonably widespread adoption among R users because repositories with marked releases is the better way to distribute code.
As your mother told you: Friends don’t let friends install random git commit snapshots. Rolled-up releases it is. drat
is easy to use, documented by five vignettes and just works.
The NEWS
file summarises the release as follows:
Changes in drat version 0.1.7 (2020-07-10)
Courtesy of CRANberries, there is a comparison to the previous release. More detailed information is on the drat page.
If you like this or other open-source work I do, you can now sponsor me at GitHub. For the first year, GitHub will match your contributions.
This post by Dirk Eddelbuettel originated on his Thinking inside the box blog. Please report excessive re-aggregation in third-party for-profit settings.
A new version of drat arrived on CRAN overnight, once again taking advantage of the fully automated process available for such packages with few reverse depends and no open issues. As we remarked at the last release fourteen months ago when we scored the same nice outcome: Being a simple package can have its upsides…
This release is mostly the work of Felix Ernst who took on what became a rewrite of how binary macOS packages are handled. If you need to distribute binary packages for macOS users, this may help. Two more small updates were made, see below for full details.
drat stands for drat R Archive Template, and helps with easy-to-create and easy-to-use repositories for R packages. Since its inception in early 2015 it has found reasonably widespread adoption among R users because repositories with marked releases is the better way to distribute code.
As your mother told you: Friends don’t let friends install random git commit snapshots. Rolled-up releases it is. drat
is easy to use, documented by five vignettes and just works.
The NEWS
file summarises the release as follows:
Changes in drat version 0.1.6 (2020-05-29)
Courtesy of CRANberries, there is a comparison to the previous release. More detailed information is on the drat page.
If you like this or other open-source work I do, you can now sponsor me at GitHub. For the first year, GitHub will match your contributions.
This post by Dirk Eddelbuettel originated on his Thinking inside the box blog. Please report excessive re-aggregation in third-party for-profit settings.
A new version of drat just arrived on CRAN. And like the last time in December 2017 it went through as an automatically processed upgrade directly from the CRAN prechecks. Being a simple package can have its upsides…
And like the last time, this release once again draws largely upon contributed pull requests. Neal Fultz cleaned up how Windows paths are handled when inserting Windows (binary) packages. And Christoph Stepper extended the support for binary packages the helper commands pruneRepo
and archivePackages
. I added a minor cleanup to a test Neal added in the previous version, and that made a quick and simple release!
drat stands for drat R Archive Template, and helps with easy-to-create and easy-to-use repositories for R packages. Since its inception in early 2015 it has found reasonably widespread adoption among R users because repositories with marked releases is the better way to distribute code.
As your mother told you: Friends don’t let friends install random git commit snapshots. Rolled-up release it is. And despite what some (who may not know it well) say, drat
is actually rather easy to use, documented by five vignettes and just works.
The NEWS
file summarises the release as follows:
Changes in drat version 0.1.5 (2019-03-28)
Changes in drat functionality
Changes in drat documentation
- Properly prefix R path in
system
call in a tests (Dirk in minor cleanup to #70).
Courtesy of CRANberries, there is a comparison to the previous release. More detailed information is on the drat page.
This post by Dirk Eddelbuettel originated on his Thinking inside the box blog. Please report excessive re-aggregation in third-party for-profit settings.
A new version of drat just arrived on CRAN as another no-human-can-delay-this automatic upgrade directly from the CRAN prechecks (though I did need a manual reminder from Uwe to remove a now stale drat repo URL -- bad @hrbrmstr -- from the README in a first attempt).
This release is mostly the work of Neal Fultz who kindly sent me two squeaky-clean pull requests addressing two open issue tickets. As drat is reasonably small and simple, that was enough to motivate a quick release. I also ensured that PACKAGES.rds
will always if committed along (if we're in commit mode), which is a follow-up to an initial change from 0.1.3 in September.
drat stands for drat R Archive Template, and helps with easy-to-create and easy-to-use repositories for R packages. Since its inception in early 2015 it has found reasonably widespread adoption among R users because repositories with marked releases is the better way to distribute code.
The NEWS
file summarises the release as follows:
Changes in drat version 0.1.4 (2017-12-16)
Changes in drat functionality
Changes in drat documentation
- Updated 'README.md' removing another stale example URL
Courtesy of CRANberries, there is a comparison to the previous release. More detailed information is on the drat page.
This post by Dirk Eddelbuettel originated on his Thinking inside the box blog. Please report excessive re-aggregation in third-party for-profit settings.
A new version of drat arrived earlier today on CRAN as another no-human-can-delay-this automatic upgrade directly from the CRAN prechecks. It is mostly a maintenance release ensuring PACKAGES.rds
is also updated, plus some minor other edits.
drat stands for drat R Archive Template, and helps with easy-to-create and easy-to-use repositories for R packages. Since its inception in early 2015 it has found reasonably widespread adoption among R users because repositories with marked releases is the better way to distribute code.
The NEWS
file summarises the release as follows:
Changes in drat version 0.1.3 (2017-09-16)
Ensure
PACKAGES.rds
, if present, is also inserted in repoUpdated 'README.md' removing stale example URLs (#63)
Use https to fetch Travis CI script from r-travis
Courtesy of CRANberries, there is a comparison to the previous release. More detailed information is on the drat page.
This post by Dirk Eddelbuettel originated on his Thinking inside the box blog. Please report excessive re-aggregation in third-party for-profit settings.
CRAN requested a release updating any URLs for Omegahat to the (actually working) omegahat.net URL. So that caused this 0.1.2 release which arrived on CRAN yesterday. It contains the requested change along with one or two other mostly minor changes which accumulated since the last release.
drat stands for drat R Archive Template, and helps with easy-to-create and easy-to-use repositories for R packages. Since its inception in early 2015 it has found reasonably widespread adoption among R users because repositories is what we use. In other words, friends don't let friends use install_github()
. Just kidding. Maybe. Or not.
The NEWS
file summarises the release as follows:
Changes in drat version 0.1.2 (2016-10-28)
Changes in drat documentation
The FAQ vignette added a new question Why use drat
URLs were made canonical, omegahat.net was updated from .org
Several files (README.md, Description, help pages) were edited
Courtesy of CRANberries, there is a comparison to the previous release. More detailed information is on the drat page.
This post by Dirk Eddelbuettel originated on his Thinking inside the box blog. Please report excessive re-aggregation in third-party for-profit settings.
One year ago (tomorrow) drat 0.1.0 was released. It held up rather well, but a number of small fixes and enhancements piled up, along with somewhat-finished to still-raw additions to the examples/
sections. With that, we are happy to announce drat release 0.1.1 which arrived on CRAN earlier today.
drat stands for drat R Archive Template, and helps with easy-to-create and easy-to-use repositories for R packages. Since its inception in early 2015 it has found reasonably widespread adoption among R users because repositories is what we use. In other words, friends don't let friends use install_github()
. Just kidding. Maybe. Or not.
This version 0.1.1 builds on the previous release from one year ago. Several users sent in nicely focused pull request, and I added a bit of spit and polish here and there.
The NEWS
file (added belatedly in this release) summarises the release as follows:
Changes in drat version 0.1.1 (2016-08-07)
Changes in drat functionality
Use
dir.exists
, leading to versioned Depends on R (>= 3.2.0)Optionally pull remote before insert (Mark in PR #38)
Fix support for dots (Jan G. in PR #40)
Accept dots in package names (Antonio in PR #48)
Switch to htpps URLs at GitHub (Colin in PR #50)
Support additional fields in PACKAGE file (Jan G. in PR #54)
Changes in drat documentation
Further improvements and clarifications to vignettes
Travis script switched to
run.sh
from our forkThis NEWS file was (belatedly) added
Courtesy of CRANberries, there is a comparison to the previous release. More detailed information is on the drat page.
This post by Dirk Eddelbuettel originated on his Thinking inside the box blog. Please report excessive re-aggregation in third-party for-profit settings.
A new version 0.1.0 of the drat package arrived on CRAN today. Its name stands for drat R Archive Template, and it helps with easy-to-create and easy-to-use repositories for R packages, and is finding increasing by other projects.
This version 0.1.0 builds on the previous releases and now adds complete support for binaries for both Windows and OS X. This builds on what had been added in the previous release 0.0.4.
This and other new features are listed below:
Also of note: The rOpenSci project now uses drat to distribute their code, and Carl Boettiger has written a nice blog post about it.
Courtesy of CRANberries, there is a comparison to the previous release. More detailed information is on the drat page.
This post by Dirk Eddelbuettel originated on his Thinking inside the box blog. Please report excessive re-aggregation in third-party for-profit settings.
A new version, now at 0.0.4, of the drat package arrived on CRAN yesterday. Its name stands for drat R Archive Template, and it helps with easy-to-create and easy-to-use repositories for R packages, and is finding increasing by other projects.
Version 0.0.4 brings both new code and more documentation:
initRepo()
to create a git-based repository, and pruneRepo()
to remove older versions of packages;insertRepo()
functions now uses tryCatch()
around git commands (with thanks to Carl Boettiger);file:/some/path
with one colon but not two slashes (also thanks to Stefan Bache);Courtesy of CRANberries, there is a comparison to the previous release. More detailed information is on the drat page.
This post by Dirk Eddelbuettel originated on his Thinking inside the box blog. Please report excessive re-aggregation in third-party for-profit settings.
R relies on package repositories for initial installation of a package via install.packages()
. A crucial second step is update.packages()
: For all currently installed packages, a list of available updates is constructed or offered for either one-by-one or bulk updates. This keeps the local packages in sync with upstream, and provides for a very convenient way to obtain new features, bug fixes and other improvements. So by installing from a repository, we automatically have the ability to track the repository for updates.
Fairly recently, the drat package was added to the R ecosystem. It makes both aspects of package distribution easy: providing a package (if you are an author) as well as installing it (if you are a user). Now, because drat is at the same time source code (as it is also a package providing the functionality), and a repository (using what drat provides ib features), the "namespace" becomes a little cluttered.
But because a key feature of drat is the "one variable" unique identification via the GitHub, I opted to create a drat repository in the name of a new organisation: ghrr. This is a simple acronym for GitHub Hosted R Repository.
We can outline several use case for packages in ghrr:
ghrr is meant to be open. While anybody can open a drat repository, particularly on GitHub, it may be beneficial to somehow group packages. This is however not something that can be planned ex-ante: it may just happen if others who see similar benefits in this can in fact contribute. In that spirit, I strongly encourage pull requests.
Early on, I made my commit messages conform to a pattern of package version sha1 repourl
to make code provenance of every commit very clear. Ideally, subsequent commits would conform to such a scheme, or replace it with a better one.
A few links to learn more about drat and ghrr:
Comments and questions via email or issue tickets are more than welcome. We hope that others find ghrr to be a useful tool for easy repository management and use via GitHub.
This post by Dirk Eddelbuettel originated on his Thinking inside the box blog. Please report excessive re-aggregation in third-party for-profit settings.
Several weeks ago we introduced the drat package. Its name stands for drat R Archive Template, and it helps with easy-to-create and easy-to-use repositories for R packages. Two early blog posts describe drat: First Steps Towards Lightweight Repositories, and Publishing a Package, and since the previous release, a a guest post on drat was also added to the blog.
Several people have started to use drat to publish their packages, and this is a very encouraging sign. I also created a new repository and may have more to say about this in another post once I get time to write something up.
Today version 0.0.3 arrived on CRAN. It rounds out functionality, adds some fixes and brings more documentation:
commit=TRUE
is needed when adding packages) but plan to expand itThe work on the vignettes is clearly in progress as Colin's guest post isn't really finished yet, and I am not too impressed with how the markdown is rendered at CRAN so some may still become pdf files instead.
Courtesy of CRANberries, there is a comparison to the previous release. More detailed information is on the drat page.
This post by Dirk Eddelbuettel originated on his Thinking inside the box blog. Please report excessive re-aggregation in third-party for-profit settings.
Editorial Note: The following post was kindly contributed by Steven Pav.
After playing around with drat for a few days now, my impressions of it are best captured by Dirk's quote:
It just works.
To get some idea of what I mean by this, suppose you are a happy consumer of R packages, but want access to, say, the latest, greatest releases of my distribution package, sadist. You can simply add the following to your .Rprofile
file:
drat:::add("shabbychef")
After this, you instantly have access to new releases in the github/shabbychef drat store via the package tools you already know and tolerate. You can use
install.packages('sadists')
to install the sadists package from the drat store, for example. Similarly, if you issue
update.packages(ask=FALSE)
all the drat stores you have added will be checked for package updates, along with their dependencies which may well come from other repositories including CRAN.
The most obvious use cases are:
Micro releases. For package authors, this provides a means to get feedback from the early adopters, but also allows one to push small changes and bug fixes without burning through your CRAN karma (if you have any left). My personal drat store tends to be a few minor releases ahead of my CRAN releases.
Local repositories. In my professional life, I write and maintain proprietary packages. Pushing package updates used to involve saving the package .tar.gz to a NAS, then calling something like R CMD INSTALL package_name_0.3.1.9001.tar.gz
. This is not something I wanted to ask of my colleagues. With drat, they can instead add the following stanza to .Rprofile: drat:::addRepo('localRepo','file:///mnt/NAS/r/local/drat')
, and then rely on update.packages
to do the rest.
I suspect that in the future, drat might be (ab)used in the following ways:
Rolling your own vanilla CRAN mirror, though I suspect there are better existing ways to accomplish this.
Patching CRAN. Suppose you found a bug in a package on CRAN (inconceivable!). As it stands now, you email the maintainer, and wait for a fix. Maybe the patch is trivial, but suppose it is never delivered. Now, you can simply make the patch yourself, pick a higher revision number, and stash it in your drat store. The only downside is that eventually the package maintainer might bump their revision number without pushing a fix, and you are stuck in an arms race of version numbers.
Forgoing CRAN altogether. While some package maintainers might find this attractive, I think I would prefer a single huge repository, warts and all, to a landscape of a million microrepos. Perhaps some enterprising group will set up a CRAN-like drat store on github, and accept packages by pull request (whether github CDN can or will support the traffic that CRAN does is another matter), but this seems a bit too futuristic for me now.
In exchange for writing this blog post, I get to lobby Dirk for some features in drat:
I shudder at the thought of hundreds of tiny drat stores. Perhaps there should be a way to aggregate addRepo
commands in some way. This would allow curators to publish their suggested lists of repos.
Drat stores are served in the gh-pages
branch of a github repo. I wish there were some way to keep the index.html file in that directory reflect the packages present in the sources. Maybe this could be achieved with some canonical RMarkdown code that most people use.
Update:Two typos fixed in code examples on 2015-Mar-27.
This post by Dirk Eddelbuettel originated on his Thinking inside the box blog. Please report excessive re-aggregation in third-party for-profit settings.
A few weeks ago we introduced the drat package. Its name stands for drat R Archive Template, and it helps with easy-to-create and easy-to-use repositories for R packages. Two early blog posts describe drat: First Steps Towards Lightweight Repositories, and Publishing a Package.
A new version 0.0.2 is now on CRAN. It adds several new features:
Courtesy of CRANberries, there is a comparison to the previous release. More detailed information is on the drat page.
This post by Dirk Eddelbuettel originated on his Thinking inside the box blog. Please report excessive re-aggregation in third-party for-profit settings.
The drat package was released earlier this month, and described in a first blog post. I received some helpful feedback about what works and what doesn't. For example, Jenny Bryan pointed out that I was not making a clear enough distinction between the role of using drat to publish code, and using drat to receive/install code. Very fair point, and somewhat tricky as R aims to blur the line between being a user and developer of statistical analyses, and hence packages. Many of us are both. Both the main point is well taken, and this note aims to clarify this issue a little by focusing on the former.
Another point make by Jenny concerns the double use of repository. And indeed, I conflated repository (in the sense of a GitHub code repository) with repository for a package store used by a package manager. The former, a GitHub repository, is something we use to implement a personal drat with: A GitHub repository happens to be uniquely identifiable just by its account name, and given an (optional) gh-pages
branch also offers a stable and performant webserver we use to deliver packages for R. A (personal) code repository on the other hand is something we implement somewhere---possibly via drat which supports local directories, possibly on a network share, as well as anywhere web-accessible, e.g. via a GitHub repository. It is a little confusing, but I will aim to make the distinction clearer.
So let us for the remainder of this post assume the role of a code publisher. Assume you have a package you would like to make available, which may not be on CRAN and for which you would like to make installation by others easier via drat. The example below will use an interim version of drat which I pushed out yesterday (after fixing a bug noticed when pushing the very new RcppAPT package).
For the following, all we assume (apart from having a package to publish) is that you have a drat directory setup within your git / GitHub repository. This is not an onerous restriction. First off, you don't have to use git or GitHub to publish via drat: local file stores and other web servers work just as well (and are documented). GitHub simply makes it easiest. Second, bootstrapping one is trivial: just fork my drat GitHub repository and then create a local clone of the fork.
There is one additional requirement: you need a gh-pages
branch. Using the fork-and-clone approach ensures this. Otherwise, if you know your way around git you already know how to create a gh-pages branch.
Enough of the prerequisities. And on towards real fun. Let's ensure we are in the gh-pages
branch:
edd@max:~/git/drat(master)$ git checkout gh-pages
Switched to branch 'gh-pages'
Your branch is up-to-date with 'origin/gh-pages'.
edd@max:~/git/drat(gh-pages)$
Now, let us assume you have a package to publish. In my case this was version 0.0.1.2 of drat itself as it contains a fix for the very command I am showing here. So if you want to run this, ensure you have this version of drat as the CRAN version is currently behind at release 0.0.1 (though I plan to correct that in the next few days).
To publish an R package into a code repository created via drat running on a drat GitHub repository, just run insertPackage(packagefile)
which we show here with the optional commit=TRUE
. The path to the package can be absolute are relative; the easists is often to go up one directory from the sources to where R CMD build ...
has created the package file.
edd@max:~/git$ Rscript -e 'library(drat); insertPackage("drat_0.0.1.2.tar.gz", commit=TRUE)'
[gh-pages 0d2093a] adding drat_0.0.1.2.tar.gz to drat
3 files changed, 2 insertions(+), 2 deletions(-)
create mode 100644 src/contrib/drat_0.0.1.2.tar.gz
Counting objects: 7, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (7/7), done.
Writing objects: 100% (7/7), 7.37 KiB | 0 bytes/s, done.
Total 7 (delta 1), reused 0 (delta 0)
To git@github.com:eddelbuettel/drat.git
206d2fa..0d2093a gh-pages -> gh-pages
edd@max:~/git$
You can equally well run this as insertPackage("drat_0.0.1.2.tar.gz")
, then inspect the repo and only then run the git commands add
, commit
and push
. Also note that future versions of drat will most likely support git operations directly by relying on the very promising git2r package. But this just affect package internals, the user-facing call of e.g. insertPackage("drat_0.0.1.2.tar.gz", commit=TRUE)
will remain unchanged.
And in a nutshell that really is all there is to it. With the newly drat-ed package pushed to your GitHub repository with a single function call), it is available via the automatically-provided gh-pages
webserver access to anyone in the world. All they need to do is to point R's package management code (which is built into R itself and used for e.g._ CRAN and BioConductor R package repositories) to the new repo---and that is also just a single drat command. We showed this in the first blog post and may expand on it again in a follow-up.
So in summary, that really is all there is to it. After a one-time setup / ensuring you are on the gh-pages
branch, all it takes is a single function call from the drat package to publish your package to your drat GitHub repository.
This post by Dirk Eddelbuettel originated on his Thinking inside the box blog. Please report excessive re-aggregation in third-party for-profit settings.
Now that drat is on CRAN and I got a bit of feedback (or typo corrections) in three issue tickets, I thought I could show how to quickly post such an interim version in a drat repository.
Now, I obviously already have a checkout of drat. If you, dear reader, wanted to play along and create your own drat repository, one rather simple way would be to simply clone my repo as this gets you the desired gh-pages
branch with the required src/contrib/
directories. Otherwise just do it by hand.
Back to a new interim version. I just pushed commit fd06293 which bumps the version and date for the new interim release based mostly on the three tickets addresses right after the initial release 0.0.1. So by building it we get a new version 0.0.1.1:
edd@max:~/git$ R CMD build drat
* checking for file ‘drat/DESCRIPTION’ ... OK
* preparing ‘drat’:
* checking DESCRIPTION meta-information ... OK
* checking for LF line-endings in source and make files
* checking for empty or unneeded directories
* building ‘drat_0.0.1.1.tar.gz’
edd@max:~/git$
Because I want to use the drat
repo next, I need to now switch from master
to gh-pages
; a step I am omitting as we can assume that your drat
repo will already be on its gh-pages
branch.
Next we simply call the drat
function to add the release:
edd@max:~/git$ r -e 'drat:::insert("drat_0.0.1.1.tar.gz")'
edd@max:~/git$
As expected, now have two updated PACKAGES
files (compressed and plain) and a new tarball:
edd@max:~/git/drat(gh-pages)$ git status
On branch gh-pages
Your branch is up-to-date with 'origin/gh-pages'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: src/contrib/PACKAGES
modified: src/contrib/PACKAGES.gz
Untracked files:
(use "git add <file>..." to include in what will be committed)
src/contrib/drat_0.0.1.1.tar.gz
no changes added to commit (use "git add" and/or "git commit -a")
edd@max:~/git/drat(gh-pages)$
All is left to is to add, commit and push---either as I usually via the spectacularly useful editor mode, or on the command-line, or by simply adding commit=TRUE
in the call to insert()
or insertPackage()
.
I prefer to use littler's r for command-line work, so I am setting the desired repos in ~/.littler.r
which is read on startup (since the recent littler release 0.2.2) with these two lines:
## add RStudio CRAN mirror
drat:::add("CRAN", "http://cran.rstudio.com")
## add Dirk's drat
drat:::add("eddelbuettel")
After that, repos are set as I like them (at home at least):
edd@max:~/git$ r -e'print(options("repos"))'
$repos
CRAN eddelbuettel
"http://cran.rstudio.com" "http://eddelbuettel.github.io/drat/"
edd@max:~/git$
And with that, we can just call update.packages()
specifying the package directory to update:
edd@max:~/git$ r -e 'update.packages(ask=FALSE, lib.loc="/usr/local/lib/R/site-library")'
trying URL 'http://eddelbuettel.github.io/drat/src/contrib/drat_0.0.1.1.tar.gz'
Content type 'application/octet-stream' length 5829 bytes
opened URL
==================================================
downloaded 5829 bytes
* installing *source* package ‘drat’ ...
** R
** inst
** preparing package for lazy loading
** help
*** installing help indices
** building package indices
** testing if installed package can be loaded
* DONE (drat)
The downloaded source packages are in
‘/tmp/downloaded_packages’
edd@max:~/git$
and presto, a new version of a package we have installed (here the very drat interim release we just pushed above) is updated.
Writing this up made me realize I need to update the handy update.r
script (see e.g. the littler examples page for more) and it hard-wires just one repo which needs to be relaxed for drat. Maybe in install2.r
which already has docopt support...
A new package of mine just got to CRAN in its very first version 0.0.1: drat. Its name stands for drat R Archive Template, and an introduction is provided at the drat page, the GitHub repository, and below.
drat builds on a core strength of R: the ability to query multiple repositories. Just how one could always query, say, CRAN, BioConductor and OmegaHat---one can now adds drats of one or more other developers with ease. drat also builds on a core strength of GitHub. Every user automagically has a corresponding github.io
address, and by appending drat
we are getting a standardized URL.
drat combines both strengths. So after an initial install.packages("drat")
to get drat, you can just do either one of
library(drat)
addRepo("eddelbuettel")
or equally
drat:::add("eddelbuettel")
to register my drat. Now install.packages()
will work using this new drat, as will update.packages()
. The fact that the update mechanism works is a key strength: not only can you get a package, but you can gets its updates once its author replaces them into his drat.
How does one do that? Easy! For a package foo_0.1.0.tar.gz
we do
library(drat)
insertPackage("foo_0.1.0.tar.gz")
The default git repository locally is taken as the default ~/git/drat/
but can be overriden as both a local default (via options()
) or directly on the command-line. Note that this also assumes that you a) have a gh-pages
branch and b) have that branch as the currently active branch. Automating this / testing for this is left for a subsequent release. Also available is an alternative unexported short-hand function:
drat:::insert("foo_0.1.0.tar.gz", "/opt/myWork/git")
show here with the alternate use case of a local fileshare you can copy into and query from---something we do at work where we share packages only locally.
The easiest way to obtain the corresponding file system layout may be to just fork the drat repository.
So that is it. Two exported functions, and two unexported (potentially name-clobbering) shorthands. Now drat away!
Courtesy of CRANberries, there is also a copy of the DESCRIPTION
file for this initial release. More detailed information is on the drat page.
This post by Dirk Eddelbuettel originated on his Thinking inside the box blog. Please report excessive re-aggregation in third-party for-profit settings.