- The bundled fallback database is now cross-distro: it stores system
package names for
apt,dnf(also used byyumplatforms),zypper, andapk, sobackend = "bundled"and offline fallbacks work on Fedora, RHEL and its rebuilds, openSUSE, and Alpine, not only on Debian and Ubuntu. Theapt,dnf, andzyppernames are generated from the Posit Package Manager database; the Alpine names are hand curated. The"auto"backend now prefers bundled data on all of these platforms. - Log diagnosis recognizes many more missing libraries. The direct error patterns grew from 12 to 33 and now cover, among others, zlib, bzip2, xz, png, jpeg, tiff, freetype, fontconfig, cairo, SQLite, PostgreSQL, MariaDB, libsodium, GMP, MPFR, GLPK, GEOS, ImageMagick, poppler, leptonica, tesseract, ICU, webp, and Cyrus SASL, each with names for all supported package managers.
- New
gitlab_ci()generates a GitLab CI YAML job that installs the system packages a plan needs. GitLab CI jobs usually run as root inside a container image, so the commands are emitted withoutsudo. - The bundled fallback database now also covers
igraph,rJava,jqr,odbc,av,rsvg,xslt, andprotolite(40 curated packages in total). - Installed-state detection now works on Alpine:
missing_onlyfiltering and theinstalledplan column useapk infowhen running on anapkplatform. - The startup message suggests
setup_advice()with the detected platform instead of a hardcodedubuntu-24.04example when the current host is a supported Linux distribution.
- The README, the FAQ, and the setup, fundamentals, and Docker vignettes
now describe distribution-native binary repositories that resolve system
dependencies automatically:
r2u(Ubuntu),cran2copr(Fedora),CRAN2OBS(openSUSE), and thebspmbridge, with a pointer to Ucar and Eddelbuettel (2021, arXiv:2103.08069).setup_advice()mentionsr2uon Ubuntu and credits thecran2coprproject on Fedora. Suggested by Dirk Eddelbuettel (#1).
diagnose_log(),check_error(), and the other log-diagnosis helpers now report package names that match the platform's package manager. Previously the direct log patterns always suggested apt names, so Fedora users were told to rundnf install -y libxml2-devinstead ofdnf install -y libxml2-devel. Mapped names on non-apt platforms carry a note asking the user to verify the exact name on their distribution.explain()no longer prints lines such asNA needs libxml2-dev.for diagnosis results that have no associated R package name; it now sayslibxml2-dev is needed.instead.- The internal JSON writer no longer double-escapes newline, carriage return, and tab characters, and now escapes backspace, form feed, and the remaining control characters, so written JSON always parses back to the original strings.
- The internal JSON parser now validates
\uescape sequences (rejecting truncated escapes) and decodes UTF-16 surrogate pairs, so characters outside the Basic Multilingual Plane survive parsing. Unpaired surrogates are rejected. - Generated shell commands, Dockerfile snippets, and CI snippets drop system package names that contain unexpected characters (with a warning) instead of pasting them into the command line.
- Posit Package Manager requirements that consist only of post-install
commands (for example
R CMD javareconf) now keep their row in the plan. - When a Posit Package Manager query fails (for example with no network),
the fallback no longer stops with "Bundled fallback data currently
supports apt platforms only." on non-apt platforms. The bundled fallback
now serves platform-matching names, and on platforms outside the bundled
data (such as Homebrew) an empty plan is returned with the original
error recorded in the
fallback_errorattribute. detect_platform()now reports Alpine hosts as supported, matchingresolve_platform("alpine-3.20")and the documented platform list.- Posit Package Manager queries now work from real Rocky Linux, AlmaLinux,
Red Hat, openSUSE Leap, and Ubuntu-derivative hosts. Package Manager keys
on
rockylinux 9,redhat 9,opensuse 15.6, andubuntu 24.04, but/etc/os-releasereportsrocky 9.4,opensuse-leap 15.6, orlinuxmint 22, soppm_sysreqs(),check_ppm(), andppm_repo()all failed with "Unsupported system" or "No Package Manager binary URL" on those machines. The detecteddistroandversionare unchanged; only the Package Manager lookup maps them. Ubuntu derivatives (Linux Mint, Pop!_OS, elementary OS) now report the underlying Ubuntu release, taken fromUBUNTU_CODENAME. resolve_platform()splits<distro>-<version>at the last dash, so"opensuse-leap-15.6"resolves to openSUSE Leap 15.6 instead of distroopensusewith versionleap-15.6. The shorthand forms"opensuse-15.6","centos-7", and"rockylinux-9.4"now find their Package Manager binary URL segment.resolve_platform("rhel9")andresolve_platform("rhel10")now describe Red Hat Enterprise Linux rather than Rocky Linux.diagnose_log()andcheck_error()recognizecompilation failed for packageandlazy loading failed for packagelines, not onlyconfiguration failed for package, when extracting failed package names.detect_project_packages(),check_project(), andcheck_library()drop packages that ship with R (stats,utils,methods, and so on) instead of reporting them as unresolved.write_json()writesnullfor missing strings; previouslyNAvalues in columns such assysreqwere written as the string"NA".- Installed-state detection on
apthosts ignores packages that were removed but not purged (dpkg stateconfig-files), whichdpkg-query -Wlists alongside installed packages. - The
detect_platform()example now ships its fixture file (inst/extdata/os-release-fedora-40), so it runs instead of silently skipping. use_ppm()documentation no longer claims thatscopeselects which.Rprofileis edited;pathis always required for writing, and the error message now suggests a scope-appropriate path.
First public release.
check_packages()resolves the system packages an R package needs on a given Linux platform. Four backends are available:"auto"(default),"bundled","ppm", and"pak".check_library()audits installed packages in an R library path.check_project()anddetect_project_packages()scan a project directory, preferringrenv.lock, thenDESCRIPTION, then source files.
detect_platform()reads/etc/os-releaseon Linux,sw_verson macOS, and parses fixture files for tests.detect_package_manager()returns the package manager for a platform (apt,dnf,yum,zypper,apk,brew).resolve_platform()acceptsNULL, an existing platform object,<distro>-<version>shorthand, or a codename alias (jammy,noble,resolute,bookworm,trixie).
install_command()generates platform-appropriate install commands.dockerfile()andwrite_dockerfile_snippet()produce Dockerfile snippets.github_actions()(aliasgha()) produces a GitHub Actions YAML step.admin_request()drafts a plain-text request for system administrators.write_install_script()writes a POSIX shell script.write_report()andwrite_json()persist a plan to disk.as_install_plan()returns a structured list suitable for downstream tooling.
diagnose_log()(aliasdiagnose_install_log()) matches common compiler and linker error patterns and resolves failed package names back to system requirements.check_error()is a convenience wrapper that readsgeterrmessage().diagnose_failed_packages()resolves a known list of failed R packages.
ppm_platforms(),check_ppm(),ppm_repo(),ppm_sysreqs(), anduse_ppm()integrate with the Posit Package Manager API and binary repository URLs.
setup_advice()produces a practical, beginner-friendly Linux setup checklist with optional shell-script output.explain()prints a friendly per-package explanation.
- Five HTML vignettes: preflight setup, diagnosing failures, GNU/Linux fundamentals (for newcomers to Linux), Docker and CI workflows, and an FAQ.
- Every exported function has a runnable example.
- Reference index grouped by topic on the pkgdown site.
- Bundled system-package names are now portable across Debian and Ubuntu:
default-libmysqlclient-dev(waslibmysqlclient-dev, which does not exist on Debian),libgsl-dev(waslibgsl0-dev), andlibfreetype-dev(waslibfreetype6-dev). detect_project_packages()now detectsrequireNamespace()calls and ignores package names that appear only in line comments.setup_advice()generates Debian repository setup using the modern deb822Signed-Bykeyring format (matching CRAN's current Debian instructions), drops a no-op Fedorarepoqueryline, and presents the Fedora COPR step as optional.- Added AlmaLinux 9 and 10 as known platforms so
ppm_repo()andcheck_ppm()work for them. - The internal JSON parser now rejects unescaped control characters, per the JSON specification.
sysreqrhas zero required dependencies: noImports, noDependsbeyond base R. TheSuggestsfield liststestthat,knitr,rmarkdown, andwithr, used only for tests and vignette building; none of them are loaded at run time.- Optional live backends can use Posit Package Manager (over HTTPS) and
pak::pkg_sysreqs(), both of which are detected at run time and never required. - The package ships a static bundled database of system requirements for
common CRAN packages. The database is refreshed with each release. Use
backend = "ppm"orbackend = "pak"when newer live metadata is needed.