r-lib / crancache

Transparent caching of CRAN package files - WORK IN PROGRESS!
Other
28 stars 2 forks source link

`install_deps` coordination? #37

Open kenahoo opened 5 years ago

kenahoo commented 5 years ago

Is there some way to get crancache and remotes::install_deps to play nice together? Maybe some way of tricking install_deps to use crancache::install_packages instead of utils::install.packages?

Or is the best way to slurp in the information from the DESCRIPTION file and iterate through the dependencies manually?

kenahoo commented 5 years ago

I guess while I'm at it, I have the same question about remotes::install_version - some way for it to use crancache too?

kenahoo commented 5 years ago

I did a quick implementation of an install_deps that could be added to crancache (or sit outside it, or whatever):

install_deps <- function(pkgdir = ".",
                         dependencies = NA,
                         ...) {

  descr <- read.dcf(file.path(pkgdir, 'DESCRIPTION'), fields = remotes::standardise_dep(dependencies))
  descr <- descr[, !is.na(descr), drop=FALSE]
  deps <- do.call(rbind, apply(descr, 2, remotes:::parse_deps))

  apply(deps, 1, function(dep) {
    pkg <- dep['name']
    message("Checking package ", pkg)
    # TODO take into account the 'compare' and 'version' columns
    if (is.na(suppressWarnings(packageDescription(pkg, fields = "Version")))) {
      install_packages(pkg, dependencies = dependencies, ...)
    } else {
      message("  ...already installed")
    }
  })

  invisible()
}

There's a call to a private function in remotes, so obviously that would need some tweaking, but I wanted to share the idea.