Notes: the # between parenthesis refers to the related issue on GitHub, and the @ refers to an external contributor solving this issue.
This is a major release. It brings the agent-skills tooling, a
reworked Dockerfile/{renv} deployment story, and
{cli}-based console output, together with a number of
breaking changes (listed first below). Please read the
breaking changes before upgrading an existing {golem}
project.
get_current_config() has been reworked in two ways:
(1) it now reads either the GOLEM_CONFIG_PATH environment
variable or the default path (inst/golem-config.yml) —
{golem} no longer tries to guess non-standard paths, and
hard-fails if the file doesn’t exist; (2) the function no longer copies
the config files from the skeleton when they are missing
(@ilyaZar, @LDSamson,
#1178).
{golem} functions used to rely on path-style
arguments that were either wd, path or
pkg. These have now been standardized to a single
golem_wd argument; the legacy
wd/path/pkg arguments are kept as
deprecated aliases that emit a warning. Note that any value passed to a
deprecated alias is silently ignored: the function
reads golem_wd instead, so callers that relied on a
non-default path must switch to golem_wd. The
file/new-project target helpers and get_current_config() /
is_golem() retain their own path argument
(@ilyaZar,
#845).
get_sysreqs() has been removed; use
dockerfiler::get_sysreqs() instead.
use_recommended_deps() has been removed.
add_rstudioconnect_file() has been removed; use
add_positconnect_file() instead.
Creating a golem no longer calls
set_here() nor usethis::create_project(). It
used to, so that here::here() could be used, but the
package is able to find its way using DESCRIPTION. This
gives a lighter golem project creation that no longer interferes with
where here() resolves.
The add_*_files and use_*_files
functions now fail when:
{golem} used to create the directory, but that is not the
function’s job — the use_*_file functions should only add a
file (single responsibility).Creating a golem with create_golem(overwrite = TRUE)
will now delete the old folder and replace it with the
golem skeleton.
add_js_input_binding() and
add_js_output_binding() generate JS files with a new naming
scheme: <name>-input.js /
<name>-output.js (previously
input-<name>.js /
output-<name>.js). Manually rename or delete any old
binding files (@ilyaZar, #868, #869).
The default events argument of
add_js_input_binding() has changed from
list(name = "click", rate_policy = FALSE) to
list(name = c("change", "input"), rate_policy = c(FALSE, FALSE))
to produce a functional input binding out of the box (@ilyaZar, #868).
use_skills(), use_agent_skills(),
use_claude_skills() and use_skill() helpers
install agent skills (Claude Code / AGENTS.md layouts) into a
{golem} project, from the package’s bundled skills or from
the upstream ThinkR-open/golem-agent-skills repository
(@ilyaZar,
#1233).create_golem() gains with_agents and
with_agents_options arguments to optionally install agent
skills during project creation, and the RStudio “New Project” wizard
exposes a matching set of options (@ilyaZar, #1233).^\.claude$, ^CLAUDE\.md$,
^\.agents$, ^AGENTS\.md$) to the project’s
.Rbuildignore so R CMD check no longer flags
them as non-standard top-level files.add_github_action() and
add_gitlab_ci() helpers generate minimal deployment CI for
fresh {golem} apps.renv.lock when it is
present, fall back to DESCRIPTION when it is not, and
declare {pkgload} for the generated Posit Connect
entrypoint.use_external_js_file(),
use_external_css_file(),
use_external_html_template(),
use_external_file() and use_bundled_html()
gain a replace argument. When TRUE, an
existing file (or bundle directory) at the target location is
overwritten instead of aborting (#819).use_*,
add_*, set_golem_*) now emit a warning when
they are called while {golem} is in production mode
(options('golem.app.prod' = TRUE)), helping catch
accidental invocations from a deployed app (#808).add_dockerfile_with_renv*() functions now generate
a multi-stage Dockerfile by default (use
single_file = FALSE to keep the previous two-file
behavior).add_dockerfile_with_renv*() functions now create a
Dockerfile that sets golem.app.prod = TRUE by default (use
set_golem.app.prod = FALSE to keep the previous
behavior).{cli} package (@ilyaZar, #89).use_bundled_html() downloads bundled HTML templates as
zip archives, optionally extracts them into inst/app/www,
and can remove the raw zip afterwards (#848).add_fct() gains a template argument to
customize the content of the generated file; the default template is now
exposed as the exported fct_template() function, mirroring
the module_template() / add_module() pattern
(@ilyaZar,
#838).add_js_input_binding() and
add_js_output_binding() now generate a functional binding:
the JS file contains working find,
getValue/renderValue, setValue,
receiveMessage, and subscribe implementations,
and an R companion file (fct_<name>_input_binding.R /
fct_<name>_output_binding.R) is created alongside it
with ready-to-use UI constructor, update, and render functions (@ilyaZar, #868, #869).run_dev() only prints one message (#1191 / @howardbaik).browser_button() is now soft deprecated
(#1155).
add_dockerfile(),
add_dockerfile_shinyproxy(), and
add_dockerfile_heroku() are now explicitly soft deprecated;
use the corresponding add_dockerfile_with_renv_*()
functions.
create_golem(without_comments = TRUE) did not strip
comment lines made up only of # characters; these are now
removed as well.
Renamed a function in 02_dev.R
(add_any_file => add_empty_file).
The create_if_needed() function has been fixed to
work in non-interactive mode (#1154, @pachadotdev).
The deprecation warning of set_golem_wd() for the
legacy pkg argument pointed to a non-existent
old_golem_wd argument; it now correctly refers to
current_golem_wd.
The package now uses the air formatter (with a pre-commit hook) for code styling, replacing grkstyle.
Added internal cli_progress_bar(),
cli_progress_update(), cli_progress_done()
wrappers and cat_start_unzip() /
cat_unzipped() helpers (@ilyaZar, #1234).
{golem} now ships a CLAUDE.md file and
a series of skills.
Full refactoring of the add_*_files and
use_*_files functions, which now all share the same
behavior.
The internal check_name_consistency() now parses the
code of app_config.R and gets the package
argument of system.file(), instead of doing a text-based
search. This allows the function to detect several calls to
system.file() and fixes the bug from #1179.
Vignettes have been renamed.
The deprecated path-style arguments (pkg,
path, wd, source_folder, and the
legacy golem_wd/pkg of
set_golem_wd()) now carry an explicit
lifecycle::badge("deprecated") note in their documentation,
making it clear that any value passed is silently ignored in favor of
the replacement argument (golem_wd in most cases).
set_golem_wd() now has its own dedicated help page,
split out from the shared golem_opts page so that its
deprecated golem_wd/pkg arguments can be
documented without conflicting with the active arguments of the other
golem_opts functions.
is_golem() tries to guess if the current folder is a
{golem}-based app (#836)
use_readme_rmd() adds a {golem}
specific README.Rmd (@ilyaZar, #1011)
rename add_rstudioconnect_file() to
add_positconnect_file() (@ilyaZar, #1017)
add_empty_file creates an empty file in the www
directory (#837)
add_r6() adds an empty R6 file (@ilyaZar, #1009)
golem::welcome_page() now display a page on default
scaffold app (#1126)
Defunct usethis functions has been removed from dev.R (@ilyaZar, #1125)
sourcing dev/01_start.R leaves the file in a clean
state with all files added to the initial commit (#1094, @ilyaZar)
allow for user supplied run_dev-files (#886, @ilyaZar)
README is re-styled and links to various external
resources of the golemverse (#1064, @ilyaZar)
a_start-vignette has updated documentation (#1046,
@ilyaZar)
fill_desc() automatically calls
set_options(); see dev/01_start.R as well
(#1040, @ilyaZar)
fill_desc() now uses a person vector
(#1027, @jmeyer2482, @ColinFay and @ilyaZar)
use_{internal,external}_XXX_file() function family
has improved error handling for non-interactive usage (#1062, @ilyaZar)
add_fct() now adds the skeleton for a function
(#1004, @ilyaZar)
The module skeleton now stick to tidyverse style (#1019, @ni2scmn)
Better comments to fill_desc() in
01_start.R (#1021, @ilyaZar)
01_start.R now has a call to
usethis::use_git_remote() (#1015, @ilyaZar)
Tests for R/golem_utils_server.R and
R/golem_utils_ui.R now have full code coverage (#1020,
@ilyaZar)
When setting a new name, {golem} now browses tests
& vignettes (#805, @ilyaZar)
Adding writeManifest() to deploy.R
(#1063, @ilyaZar)
use_git() is now at the bottom of 01_dev.R ((#1094,
@ilyaZar))
golem::add_dockerfile_with_renv_*() set “rstudio” as
default USER in Dockerfile to avoid launching app as root
It is now easier to modify the renv.config.pak.enabled parameter
in the Dockerfile generated by
golem::add_dockerfile_with_renv_*() functions.
We create an .rscignore in the golem dir whenever
creating the connect related file (#110, @ilyaZar)
use_{internal,external}_XXX_file() function family
works with default missing name argument (#1060, @ilyaZar)
run_dev() now install needed dependencies to source
dev/run_dev.R if needed (#942, @ilyaZar, @vincentGuyader)
use_readme_rmd() does not pop up when argument
open=FALSE is set (#1044, @ilyaZar)
Docker commands now take the -it flag so it can be
killed with ^C (#1002, @ivokwee)
add_module() now behaves correctly when trying to
use mod_mod_XXX and no longer opens an interactive menu
(#997, @ilyaZar)
{attachment} now has a minimum version requirement
(#1104, @ilyaZar)
{pkgload} now has a minimum version requirement
(#1106)
create_golem() can be now used with path = “.” and
package_name empty
Add tests for (under/un)-tested files and functions and improve
code coverage of {golem} (#1043, #1050, #1059, #1066,
#1075, @ilyaZar)
guess_where_config() now finds the user config-yaml
by reading its new location from user changes in “R/app_config.R” (#887,
@ilyaZar)
All functions that require to get a path now rely on
get_golem_wd() (#1016, @ilyaZar)
The test suite has been refactored and is now silent and faster.
This is an intermediate release after CRAN feedback.
add_partial_html_template() to create a partial
html template, with only a div and a {{ }} (@nathansquan
#858).golem:::dev_deps. They can be installed
via golem::install_dev_deps().rlang::check_installed() (#835)golem::run_dev() has been refactored to match the
behavior of other functions, notably it now uses
golem::get_golem_wd() to find the current working dir.{golem} now depends on {rlang} version
>= 1.0.0options("golem.quiet" = TRUE), #793fill_desc() now allows to set the version (#877)GOLEM_MAINTENANCE_ACTIVE to TRUE activates the
maintenance mode of your appgolem::run_dev() now save all open documents before
sourcing the dev/run_dev.R file03_deploy now contains an example of sending the app to
PositConnect or Shinyapps.io (#923)app_ui.R (#861)use_recommended_deps no
longer suggest to user use_recommended_deps (#900)!expr in golem_set_wd(), and the
codebase has been simplified for this (#709).name
argument that has length() > 1. This used to cause some
bugs (#781)install.packages() in 02_dev.R
has been corrected (@asiripanich)add_dockerfile_with_renv() now works well with
uppercase in package nameget_golem_options() documentationadd_dockerfile_with_renv now works well with uppercase
in package nameUpdate in the tests for CRAN (commented a test that made new version of testthat fail).
Update in the tests for CRAN (skip not installed + examples).
add_dockerfile_with_renv(),
add_dockerfile_with_renv_heroku() and
add_dockerfile_with_renv_shinyproxy() build Dockerfiles
that rely on {renv}add_dockerfile,
add_dockerfile_shinyproxy() and
add_dockerfile_heroku() now recommend to switch to their
_with_renv_ counterpartuse_recommended_deps() is now soft deprecated
(#786)html parameter in expect_html_equal()
is no longer in use (#55).add_sass_file() creates a .sass file in inst/app/www
(#768)
use_module_test() creates a test skeleton for a
module (#725)
The 02_dev.R file now suggests using
attachment::att_amend_desc() (#787)
use_code_of_conduct() in dev script now has the
contact param (#812)
All with_test params are now TRUE in the dev script
(#801)
test-golem-recommended now has two new tests for
app_sys and get_golem_config (#751)
use_utils_ui() use_utils_server() &
now come with a with_test parameter that adds a test file
for theses functions (#625 & #801)
{golem} now checks if a module exists before adding
a module related file (#779)
Every {rstudioapi} calls is now conditionned by the
availabily of this function (#776)
use_external_* functions no longer suggest to “Go
to” (#713, @novica)
create_golem() now comes with with_git
parameter that can be used to initialize git repository while creating a
project template
use_recommended_tests() now comes with
testServer (#720).
expect_html_equal() now uses
testthat::expect_snapshot() (#55).
add_modules(), add_fct() and
add_utils() now come with a with_test
parameter that can be turned on to add a test file to the module (#719
& #141)
/! All docker related functions have been moved to
{dockerfiler}. This is more or less a breaking change,
cause you’ll need to install {dockerfiler} > 0.1.4 in
order to build the Dockerfile but {golem}
will ask you to install {dockerfiler} > 0.1.4 if it
can’t find it, (#412)
Modules ID no longer contain an _ui_ element, (#651,
@MargotBr)
run_dev now has
options(shiny.port = httpuv::randomPort()) to prevent the
browser from caching the CSS & JS files (#675)
You can now specify the path to R in
expect_running().
Fixed a bug in the printing of the htmlTemplate code (#827)
We now require the correct {usethis} version
(822)
golem::amend_config() now keeps the
!expr (#709, @teofiln)
recommended tests now use expect_type() instead of
expect_is, which was deprecated from
{testthat} (#671)
Fixed check warning when using
golem::use_utils_server() (#678),
Fixed issue with expect_running & path to R (#700, @waiteb5)
expect_running() now find R.exe on windows.
use_recommended_tests() no longer add
{processx} to the DESCRIPTION (#710)
bundle_resource() does not include empty stylesheet
anymore (#689, @erikvona)
Create {golem} is more robust and now comes with an
overwrite argument (#777)
{testthat} and {rlang} are no longer
hard dependencies (#742)
add_*You can now create a skeleton for a Shiny input binding using the
golem::add_js_binding("name") function (#452, @DivadNojnarg)
You can now create a skeleton for a Shiny output binding using
the golem::add_js_output_binding("name") function (@DivadNojnarg)
add_html_template() creates an
htmlTemplate.
use_*use_external_file() allows to add any file to the
www folder, use_external_css_file(),
use_external_html_template(), and
use_external_js_file() will download them from a URL (#295,
#491).
use_internal_css_file(),
use_internal_file(),
use_internal_html_template(),
use_internal_js_file() functions allow to any file from the
current computer to the www folder (@KasperThystrup, #529)
expect_running() expects the current shiny app to be
running.Every {golem} project now have a
project_hook that is launched after the project
creation.
module_template() is the default function for
{golem} module creation. Users will now be able to define a
custom module_template() function for
add_module(), allowing to extend {golem} with
your own module creation function. See ?golem::module_template for more
info (#365)
add_js_ and add_css_ functions now have
a template function, allowing to pass a file constructor.
is_running() checks if the current running
application is a {golem} based application (#366)
utils_ui.R now contains a “make_action_button()”
function (#457, @DivadNojnarg)
run_dev() launches the run_dev.R script
(#478, @KoderKow)
run_dev() performs a check on golem name.
sanity_check() function has been added to check for
any ‘browser()’ or commented #TODO / #TOFIX / #BUG in the code (#1354
@Swechhya)
The modules are now created with the new skeleton when the
installed version of {shiny} is >= 1.5.0.
use_external_*() function don’t open files by
default (#404)
use_recommended_tests*() now calls
use_spell_check() (#430)
The 02_dev.R now includes more CI links
golem::expect_running() is now bundled in default
tests
Default tests now test for functions formals (#437)
You can now pass arguments to internal roxygenise()
& load_all() (#467)
Bundle_resources() now handle subfolders
(#446)
run_app() now includes the default arguments of
shinyApp() (#254, @chasemc)
create_golem() now adds strict dependency versions
(#466)
{golem} app now comes with a meta tags
“app-builder”, which default to “golem”, and that can be changed or turn
off in bundle_resources().
with_golem_options can now explicit calls
print on the app object, solving some issues
with benchmarking the application. This explicit print can be turned off
by setting print to FALSE in
with_golem_options (#148)
dockerignore is now available.
The add_helpers and add_utils now have
roxygen comments (Richard Pilbery, #330)
dev/03_dev.R now has devtools::build()
(#603)
detach_all_attached() is now silent (#605)
add_ui_server_files() is now signaled as deprecated.
Please comment on https://github.com/ThinkR-open/golem/issues/445 if you
want it to be kept inside the packageadd_dockerfile* function now return the
{dockerfiler} object instead of the path to it. It allows
to modify the Dockerfile object programmatically. (#493)
The get_golem_config now first look for a
GOLEM_CONFIG_ACTIVE before looking for
R_CONFIG_ACTIVE (#563)
add_ functions no longer append to file if it
already exists (#393)
config::get() is no longer exported to prevent
namespace conflicts with base::get()
fixed issue with favicon when package is built (#387)
use_external_*() function don’t add ext if already
there (#405)
create_golem function does not modify any existing
file (#423, @antoine-sachet)
add_resources_path() now correctly handles empty
folder (#395)
test for app launching is now skipped if not interactive()
add_utils and add_fct now print to the
console (#427, @novica)
Multiple CRAN repo are now correctly passed to the Dockerfile (#462)
app_config, DESC and golem-config.yml are now updated whenever you change the name of the package using a golem function (#469 )
test_recommended now work in every case
(hopefully)
usethis::use_mit_license does not have the
name argument anymore so if fits new version of
{usethis} (#594)
Typo fix preventing invoke_js("prompt") and
invoke_js("confirm") to work (#606)
document_and_reload() now has
export_all = FALSE,helpers = FALSE,attach_testthat = FALSE,
allowing the function to behave more closely to what library() does
(#399)
Dockerfile generation now removes the copied file and tar.gz
add_dockerfile() was completely refactored. It now
starts from r-ver, uses explicit package versions from you local
machine, and tries to set as much System Requirements as possible by
using {sysreq}, and parses and installs the Remotes tag
from the DESCRIPTION (#189, #175)
add_dockerfile() allow now to directly use the
source of the package by mounting the source folder in the container and
running remotes::install_local()
add_dockerfile() now builds the tar.gz
(#273)
add_fct and add_utils add new files in
your R folder that can hold utils and functions (#123).
We switched from shiny::addResourcePath() to
golem::add_resource_path(), which doesn’t fail if the
folder is empty (#223).
New JavaScript functions to use alert, prompt and confirm (#108, @zwycl)
use_external_js_file and
use_external_css_file are designed to download .js and .css
file off the web to the appropriate directory (#130, @zwycl)
{golem} now comes with an internal config file.
Please refer to the config Vignette for more
information.
bundle_resources() comes with every new app and
bundles all the css and js files you put inside the
inst/app/www folder, by matchine the file
extension.
There is now an app_sys() function, which is a
wrapper around system.file(..., package = "myapp") (#207,
@novica)
document_and_reload() now stops when it fails, and
returns an explicit failure message (#157)
You can now create a golem without any comment (#171, @ArthurData)
The default app_ui() now has a request
parameter, to natively handle bookmarking.
document_and_reload() now stops when it fails, and
returns an explicit failure message (#157). It also uses
get_golem_wd() as a default path, to be consistent with the
rest of {golem} (#219, @j450h1)
add_module now allows to create and
fct_ and an utils_ file (#154, @novica)
golem::detach_all_attached() is now silent (#186,
@annakau)
There is now a series of addins for going to a specific golem
file (#212, @novica),
and also to wrap a selected text into ns() (#143, @kokbent)
Creation of a golem project is now a little bit more talkative (#63, @novica)
golem apps now have a title tag in the header by default, (#172, @novica)
The rsconnect folder is now added to
.Rbuildignore (#244)
devtools::test() in 03_deploy.R is now
devtools::check()
modules bow have a placeholder for content
Dev scripts have been rewritten and reordered a little bit
invoke_js() now takes a list of elements to send to
JS (through ...) instead of a vector (#155, @zwycl)
get_dependencies was removed from this package,
please use desc::desc_get_deps() instead (#251)
{golem} now uses here::here() to
determine the default working directory (#287)
Modules used to be exported by default. You now have to specify it when creating the modules (#144)
run_app() is no longer explicitely namespaced in the
run_dev script (#267)
JavaScript files now default to having
$(document).ready() (#227)
Every filesystem manipulation is now done with {fs}.
That should be pretty transparent for most users but please open an
issue if it causes problem (#285)
The Dockerfile is now correctly added to .Rbuildignore (#81)
The dockerfile for shinyproxy no longer has a typo (#156, @fmmattioni)
normalizePath() now has a correct winlash (@kokbent)
spellcheck in files (@privefl)
Message to link to golem_add_external_resources() is
now conditional to R being in a golem project (#167, @novica)
Better error on missing name in add_*, (#120, @novica)
When adding file, the extension is now ignored if provided by the user (#231)
The dots R/run_app.R are now documented by default (#243)
Bug fix of the pkgdown website (#180)
{golem} now correctly handles command line creation
of projet inside the current directory (#248)
The test are now more robust when it comes to random name generation (#281)
We no longer depend on {stringr} (#201, @TomerPacific)
get_golem_wd() is now used everywhere in {golem}
(#237, @felixgolcher)
get_golem_wd allows to print the current golem working
directory, and set_golem_wd to change it.In order to work, the functions creating files need a
golem.wd. This working directory is set by
set_golem_options or the first time you create a file. It
default to ".", the current directory.
Changes in the name of the args in
set_golem_options: pkg_path is now
golem_wd, pkg_name is now
golem_name, pkg_version is now
golem_version
The installed.packages() function is no longer
used.
Every filesystem manipulation is now done with {fs}
(#285)
get_golem_options().See https://rtask.thinkr.fr/blog/shinyapp-runapp-shinyappdir-difference/
ui.R and server.R to
exist by default. Removed. Can be recreated with
add_ui_server_files()add_shinyserver_file &
add_shinyappsio_file, #40add_ui_server_files() creates an ui & server.R
files.dir_create = FALSEopen = FALSE, #75create_golem() now switch to the newly created
projectuse_git() is not listed in
dev/01_start.Radd_rconnect_file() to
add_rstudioconnect_file()create_shiny_template() to
create_golem()js() to activate_js()use_recommended_dep() to
use_recommended_deps()invoke_js() allows to call JS functions from the server
side. #52The dev files are now split in three - start / dev / deploy
Every function that adds a file now check if the file already exists, and ask the user if they want to overwrite it (#15)
Every module is now named mod_x_ui / mod_x_server, for consistency.
You can now create package with “illegal” names, using the
command line golem::create_shiny_template(). #18
add_browser_button() is now named
browser_button(), so that all the add_*
function are only reserved for function adding files to the
golem.
add_*_files now check if the folder exists, if not
suggests to create it. #36
You now have a browser_dev() function that behaves
like warning_dev and friends. #46
Added set_golem_options() to add local options used
internally by {golem} && added it to the
01_start.R. #49
Added add_dockerfile() to create a Dockerfile from a
DESCRIPTION.
Added add_dockerfile_shinyproxy() to create a
Dockerfile from a DESCRIPTION, to be used in Shiny Proxy.
Added add_dockerfile_heroku() to create a Dockerfile
from a DESCRIPTION, to be used with Heroku.
add_css_file(), add_js_file() and
add_js_handler() create a CSS, JS, and JS with Shiny custom
handler files.
use_utils_prod is now included in golem so you don’t
have to explicitly include the functions.Last round of functions, and some documentation cleanup.
Moved from {shinytemplate} to {golem}
Added a NEWS.md file to track changes to the
package.