@@ -235,4 +235,86 @@ generate_pkg_install_cmd <- function(package_manager, packages) {
235235 )
236236 }
237237 )
238- }
238+ }
239+
240+
241+
242+ # ' Add system requirements for R packages to a `dockerfile`
243+ # '
244+ # ' Identifies and adds the necessary system requirements for R packages
245+ # ' to a `dockerfile` using the `pak` package to determine dependencies.
246+ # '
247+ # ' @param dockerfile A `dockerfile` object
248+ # ' @param packages Character vector of package names
249+ # ' @param package_manager Package manager to use (default: `"auto"`)
250+ # '
251+ # ' @return
252+ # ' An updated `dockerfile` object with system requirements added
253+ # '
254+ # ' @examples
255+ # ' \dontrun{
256+ # ' # Create a dockerfile
257+ # ' df <- dockerfile() |>
258+ # ' dfi_from("rocker/r-ver:4.4.0")
259+ # '
260+ # ' # Add system requirements for packages
261+ # ' df <- dk_add_sysreqs(df, c("xml2", "RPostgreSQL", "rJava"))
262+ # ' }
263+ # '
264+ # ' @details
265+ # ' This function uses the pak package to determine the system requirements
266+ # ' for the specified R packages. It then formats the appropriate installation
267+ # ' commands for the detected package manager and adds them as `RUN` instructions
268+ # ' to the `dockerfile`.
269+ # '
270+ # ' The `pak` package must be installed for this function to work.
271+ # '
272+ # ' @seealso
273+ # ' [generate_pkg_install_cmd()] for generating package installation commands &
274+ # ' [determine_package_manager()] for determining the package manager
275+ # '
276+ # ' @family utility functions
277+ # ' @export
278+ dk_add_sysreqs <- function (dockerfile , packages , package_manager = " auto" ) {
279+ check_dockerfile(dockerfile )
280+
281+ if (package_manager == " auto" ) {
282+ package_manager <- dockerfile $ metadata $ package_manager
283+ if (is.null(package_manager )) {
284+ package_manager <- " apt"
285+ cli :: cli_warn(" Could not determine package manager. Defaulting to apt." )
286+ }
287+ }
288+
289+ # Get system requirements using pak
290+ if (! requireNamespace(" pak" , quietly = TRUE )) {
291+ cli :: cli_warn(" Package 'pak' is required to determine system requirements. Skipping." )
292+ return (dockerfile )
293+ }
294+
295+ # Map package manager to appropriate sysreqs platform
296+ os <- determine_linux_distribution(dockerfile $ metadata $ base_image )
297+ platform <- map_to_sysreqs_platform(package_manager , os )
298+
299+ # Get system requirements data frame
300+ sysreqs_df <- pak :: pkg_sysreqs(packages , sysreqs_platform = platform )
301+
302+ if (is.null(sysreqs_df $ packages ) || nrow(sysreqs_df $ packages ) == 0 ) {
303+ return (dockerfile )
304+ }
305+
306+ # Extract system packages from the data frame and remove duplicates
307+ system_packages <- unique(unlist(sysreqs_df $ packages $ system_packages ))
308+
309+ if (length(system_packages ) == 0 ) {
310+ return (dockerfile )
311+ }
312+
313+ # Generate system-specific install commands using utility function
314+ install_cmd <- generate_pkg_install_cmd(package_manager , system_packages )
315+
316+ # Add the installation command
317+ dockerfile <- dfi_run(dockerfile , paste(install_cmd , collapse = " && " ))
318+
319+ dockerfile
320+ }
0 commit comments