--- title: "Getting started with bigbang" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Getting started with bigbang} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r, include = FALSE} knitr::opts_chunk$set(collapse = TRUE, comment = "#>") library(bigbang) ``` ## A complete disposable example This guide creates a component archive and a metapackage source tree entirely under `tempdir()`. It does not write to the working directory, install anything, or contact a repository. ```{r create-component} root <- tempfile("bigbang-vignette-") source_root <- file.path(root, "sources") archive_root <- file.path(root, "archives") destination <- file.path(root, "generated") dir.create(file.path(source_root, "toycomponent", "R"), recursive = TRUE) dir.create(archive_root) dir.create(destination) writeLines(c( "Package: toycomponent", "Type: Package", "Title: Toy Component", "Version: 0.1.0", "Authors@R: person('Test', 'Author', email='test@example.org', role=c('aut','cre'))", "Description: A disposable component used by the bigbang vignette.", "License: MIT" ), file.path(source_root, "toycomponent", "DESCRIPTION"), useBytes = TRUE) writeLines( "export(toy_value)", file.path(source_root, "toycomponent", "NAMESPACE"), useBytes = TRUE ) writeLines( "toy_value <- function() 'hello from the component'", file.path(source_root, "toycomponent", "R", "toy.R"), useBytes = TRUE ) withr::with_dir(source_root, utils::tar( file.path(archive_root, "toycomponent_0.1.0.tar.gz"), files = "toycomponent", compression = "gzip" )) ``` The archive stem includes the version; `ext` is supplied separately. ```{r generate-metapackage} result <- create_metapackage( name = "toyverse", packages = "toycomponent_0.1.0", pkg_dir = archive_root, dest_dir = destination, document = FALSE, verbose = FALSE, import_deps = character(), force_deps = character() ) result list.files(result$path) ``` The generated tree can be scanned without loading it: ```{r scan-metapackage} scan <- scan_bigbang_artifact(result$path) scan stopifnot(!scan$vulnerable) ``` ## Build, install, and use In a real project, build and install the generated package using the standard R workflow. Loading the metapackage never installs components: ```{r, eval = FALSE} system2(file.path(R.home("bin"), "R"), c("CMD", "build", result$path)) install.packages("toyverse_0.1.0.tar.gz", repos = NULL, type = "source") library(toyverse) toyverse_install() ``` Those four lines are also the whole procedure for someone else. The component archives were copied into the generated package, so `toyverse_0.1.0.tar.gz` is the only file that has to travel: whoever receives it installs it and calls `toyverse_install()`, with no archive directory beside it and no path agreed on in advance. The default `pkg_dir` is `system.file("archives", package = "toyverse")`, which is resolved when the installer runs and therefore points at the library it was installed into. Generate with `include_archives = FALSE` when the archives should stay in a location every recipient can already reach; then `toyverse_install()` requires an explicit `pkg_dir`. `cran_deps = "skip"` is the offline default. Choose `"error"` for strict offline validation or `"install"` only when an explicit repository is available. Use `upgrade = "always"` or `force = TRUE` for an explicit reinstall. Generated metapackages provide `_conflicts()` and honor `options(.quiet = TRUE)` for startup output. Their optional `cli` display falls back to a dependency-free ASCII banner. ## Beyond the simple case The example above uses the simplest input: stems resolved in one directory. That is not a requirement. Any element of `packages` that is an existing file is used as a path, so components can come from several directories in one call, mix `.tar.gz`, `.tar` and `.zip`, and carry no version in the filename — identity and version are read from each archive's `DESCRIPTION`. A component can also be a source directory, built for you with the optional `pkgbuild` package, or the whole list can live in a manifest file under version control. Two options are worth knowing before you generate anything for real: ```r plan <- create_metapackage(..., dry_run = TRUE) plan$order # the installation order that would be used plan$findings # every validation finding, without writing anything ``` `dry_run = TRUE` does not create the destination at all. And `update = TRUE` regenerates an existing project in place, rewriting only the files bigbang itself wrote — it refuses if any of them was modified by hand, and never touches files it did not write. See `?create_metapackage` for the full set, including `on_component_error` for generating from a partly broken set, `tolerate` for relaxing tidiness checks individually, and `install_upgrade` for fixing the upgrade policy of the installer that gets emitted. ```{r cleanup, include = FALSE} unlink(root, recursive = TRUE) ```