--- title: "05. Configuration" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{05 - Configuration} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r, include = FALSE} knitr::opts_chunk$set( collapse = TRUE, comment = "#>" ) library(golem) x <- file.path( tempdir(), "golex" ) unlink(x, TRUE, TRUE) x <- golem::create_golem(x, package_name = "golex", open = FALSE) old <- setwd(x) knitr::opts_knit$set(root.dir = x) ``` ```{r setup} library(golem) ``` ```{r echo = FALSE} old <- setwd(x) ``` ## Two Ways to Manage Production vs Development Mode `{golem}` provides two separate mechanisms for managing production and development modes in your Shiny applications: 1. **R Options Approach**: Using `options(golem.app.prod = TRUE/FALSE)` which is checked by `app_prod()` and `app_dev()` functions. This approach controls the behavior of `{golem}`'s development-aware utility functions like `cat_dev()`, `print_dev()`, `message_dev()`, and similar tools. 2. **Configuration File Approach**: Using the `golem-config.yml` file to store configuration values (including an `app_prod` setting) that can be retrieved in your application code using `get_golem_config()`. **Important**: These two mechanisms are independent and serve different purposes. The R option controls `{golem}`'s built-in development tools, while the config file provides a flexible way to store and retrieve application-specific settings. This vignette focuses on the configuration file approach. ## About `inst/golem-config.yml` When you start a new `{golem}` application, you'll find a file called `golem-config.yml` in the `inst/` folder. By default, this file contains the name of your app, its version, and the default working directory (which is the root of your package). This config file is based on the [`{config}`](https://github.com/rstudio/config) format, which allows you to create configuration files for different application contexts. Please refer to this package documentation for more information. ## Setting `golem-config` Here is what the default config file looks like: ``` default: golem_name: golex golem_version: 0.0.0.9000 app_prod: no production: app_prod: yes dev: golem_wd: !expr golem::pkg_path() ``` + default/golem_name, default/golem_version, default/app_prod can be used across the whole life of your `{golem}` app: while developing, and also when in production. + production/app_prod can be used to add elements that are to be used once the app is in production. + dev/golem_wd is in a `dev` config because the only moment you might reliably use this config is while developing your app. Use the `app_sys()` function if you want to rely on the package path once the app is deployed. The good news is that if you don't want/need to use `{config}`, you can safely ignore this file, __just leave it where it is: it is used internally by the `{golem}` functions__. These options are globally set with: ```{r} set_golem_options() ``` ```{r echo = FALSE, comment= "", } cat( sep = "\n", readLines( "inst/golem-config.yml" ) ) ``` The functions reading the options in this config file are: ```{r} get_golem_name() get_golem_wd() get_golem_version() ``` You can set these with: ```{r eval = FALSE} set_golem_name("this") set_golem_wd(".") set_golem_version("0.0.1") ``` ```{r echo = FALSE, comment= "", } cat( sep = "\n", readLines( "inst/golem-config.yml" ) ) ``` ## Using `golem-config` If you're already familiar with the `{config}` package, you can use this file just as any config file. `{golem}` comes with an `amend_golem_config()` function to add elements to it. ```{r} amend_golem_config( key = "where", value = "indev" ) amend_golem_config( key = "where", value = "inprod", config = "production" ) ``` Will result in a `golem-config.yml` file as such: ```{r echo = FALSE, comment= ""} cat( sep = "\n", readLines( file.path(x, "inst/golem-config.yml") ) ) ``` ## `app_config.R` In `R/app_config.R`, you'll find a `get_golem_config()` function that allows you to retrieve config from this config file: ```{r} pkgload::load_all() get_golem_config( "where" ) get_golem_config( "where", config = "production" ) ``` Or using the env var (default `{config}` behavior): ```{r} Sys.setenv("R_CONFIG_ACTIVE" = "production") get_golem_config("where") ``` ## `golem_config` vs `golem_options` There are two ways to configure golem apps: + The `golem_opts` in the `run_app()` function + The `golem-config.yml` file The main difference between these two is that the `{golem}` options from `run_app()` are meant to be configured during runtime: you'll be doing `run_app(val = "this")`, whereas the `golem-config` is meant to be used in the backend, and will not be linked to the parameters passed to `run_app()` (even if this is technically possible, this is not the main objective). The `golem-config.yml` file is also linked to the `R_CONFIG_ACTIVE` environment variable, just as any `{config}` file. Additionally, the `golem-config.yml` file is shareable across `{golem}` projects (whereas `golem_opts` are application specific), and will be tracked by version control systems. ## Connecting Back to the R Options Approach As mentioned at the beginning of this vignette, `{golem}` uses two separate mechanisms for production/development configuration. While this vignette has focused on the `golem-config.yml` file, it's important to understand how this relates to the R options approach. ### The R Options Mechanism The R option `options(golem.app.prod)` is used by `{golem}`'s development-aware functions: - `app_prod()` - Returns `TRUE` if the app is in production mode - `app_dev()` - Returns `TRUE` if the app is in development mode - Development-only output functions: `cat_dev()`, `print_dev()`, `message_dev()`, `warning_dev()`, `browser_dev()` These functions check `getOption("golem.app.prod")` directly and do not read from the config file. ### Important: The Two Mechanisms Are Independent The `app_prod` value in `golem-config.yml` and the `options(golem.app.prod)` R option are **not automatically synchronized**. They serve different purposes: - **Config file `app_prod`**: A persistent configuration value that you can retrieve using `get_golem_config("app_prod")` to use in your own application logic. This value can vary by environment (default, production, dev) using the `R_CONFIG_ACTIVE` environment variable. - **R option `golem.app.prod`**: A session-level setting that controls `{golem}`'s built-in development tools. This must be explicitly set in your code or launch configuration (e.g., in Docker CMD or `run_dev.R`). ### Best Practices - **Set the R option explicitly**: When deploying to production, ensure you set `options(golem.app.prod = TRUE)` in your app's launch script or Docker configuration. The `{golem}` Dockerfile templates handle this automatically. - **Use the config file for your app's logic**: If you need environment-specific configuration in your application code (e.g., different API endpoints for dev vs production), use `get_golem_config()` to retrieve values from `golem-config.yml`. - **Keep them in sync if needed**: If you want the config file's `app_prod` setting to match your R option, you'll need to manage this synchronization in your own code. For example, in your `run_app()` function, you could set the option based on the config value: ```r # Example: sync config to R option (optional) if (get_golem_config("app_prod")) { options(golem.app.prod = TRUE) } ``` ## Note for `{golem}` < 0.2.0 users If you've built an app with `{golem}` before the version 0.2.0, this config file doesn't exist: you'll be prompted to create it if you update a newer version of `{golem}`. ```{r echo = FALSE} setwd(old) ```