High-performance R package server
cranlike is a package server providing a simple API for storing R packages and hosting cran-like repositories.
Packages are stored in the repository of a particular user or
organization, and the server automatically generates the required
repository index files from the database.
This allows R users to install packages from a particular author or
organization using only the repo parameter in
The implementation is designed to be fast and extensible, with the potential expose additional filters or services, and scale up to large repositories.
/api endpoint exposes a simple REST api to store R packages. Here
<type> must be one of
/repos endpoint exposes the CRAN-like directory structure and package index files for a given user. The R user can simply set the
repos parameter in
GET /repos/<user>/src/contrib /repos/<user>/bin/windows/contrib /repos/<user>/bin/macosx/contrib/
For example the R user would use:
available.packages("http://myserver.com/repos/jeroen") install.packages("curl", repos = "http://myserver.com/repos/jeroen")
Running the server
The easiest way to start your a server is to clone the this and run docker compose:
Alternatively if you locally have
nodejs installed you can use:
Debugging the database
All data is stored in two mongodb collections:
cranlikestores description fields for each package, including an
MD5sumfield that has a unique hash of the file.
- The gridfs
filescollection stores the package blobs, where the primary
_idis the md5 of the file.
We don't store raw files on disk. To read raw data from the db in R you can use
library(mongolite) packages <- mongolite::mongo(db = 'cranlike', collection = 'packages', url = "mongodb://root:example@localhost") packages$find()
To inspect the table with the files:
bucket <- mongolite::gridfs(db = 'cranlike', prefix = 'files', url = "mongodb://root:example@localhost") bucket$find()