pak contains a package dependency solver, that makes sure that the package source and version requirements of all packages are satisfied, before starting an installation. For CRAN and BioC packages this is usually automatic, because these repositories are generally in a consistent state. If packages depend on other other package sources, however, this is not the case.
Details
Here is an example of a conflict detected:
> pak::pkg_install(c("r-lib/pkgcache@conflict", "r-lib/cli@message"))
Error: Cannot install packages:
* Cannot install `r-lib/pkgcache@conflict`.
- Cannot install dependency r-lib/cli@main
* Cannot install `r-lib/cli@main`.
- Conflicts r-lib/cli@message
r-lib/pkgcache@conflict
depends on the main branch of r-lib/cli
,
whereas, we explicitly requested the message
branch. Since it cannot
install both versions into a single library, pak quits.
When pak considers a package for installation, and the package is given with its name only, (e.g. as a dependency of another package), then the package may have any package source. This is necessary, because one R package library may contain only at most one version of a package with a given name.
pak's behavior is best explained via an example.
Assume that you are installing a local package (see below), e.g.
local::.
, and the local package depends on pkgA
and user/pkgB
,
the latter being a package from GitHub (see below), and that pkgA
also depends on pkgB
. Now pak must install pkgB
and user/pkgB
.
In this case pak interprets pkgB
as a package from any package source,
instead of a standard package, so installing user/pkgB
satisfies both
requirements.
Note that that cran::pkgB
and user/pkgB
requirements result a
conflict that pak cannot resolve. This is because the first one must
be a CRAN package, and the second one must be a GitHub package, and
two different packages with the same cannot be installed into an R
package library.