Primary Quarto document detection only considers .R
, .Rmd
, and .qmd
as
end-of-file extensions. Previously, a file with .R
elsewhere in its name,
such as .Rprofile
, was incorrectly considered. (#1106)
Use the repository name identified by renv when available.packages()
does
not enumerate the package, which occurs for archived packages. (#1110)
Remove remaining directory layout validation check. (#1102)
Use the public Connect server API endpoint /v1/tasks/{id}
to poll task
progress. (#1088)
deployApp(logLevel = "quiet")
suppresses Posit Connect deployment task
output. (#1051)
deployApp(logLevel = "quiet")
and writeManifest(quiet=TRUE)
suppress
output when using renv to analyze dependencies. (#1051)
deployApp()
and writeManifest()
receive the default value for the
image
argument from the RSCONNECT_IMAGE
environment variable. (#1063)
deployTF()
can deploy a TensorFlow model to Posit Connect. Requires Posit
Connect 2024.05.0 or higher.
Skip tests when suggested packages are not available. Skip Quarto tests when run by CRAN. (#1074)
Use internally computed SHA1 sums and PKI signing when SHA1 is disabled in FIPS mode. (#768, #1054)
Allow Quarto content with a rendered script as its primary target. (#1055)
LC_TIME
locale after computing an RFC-2616 date. (#1035)Addressed a number of republishing and collaboration issues where the content was incorrectly published to a new location rather than reusing an existing deployment. (#981, #1007, #1013, #1019)
showLogs()
, configureApp()
, setProperty()
, and unsetProperty()
search for the application by name when there are no matching deployment
records. (#985, #989)
rpubsUpload()
correctly records the initial RPubs destination, allowing
republishing. (#976)
deployApp()
and friends record multi-value metadata
entries as
comma-separated values. (#1017)
accountInfo()
includes name
and username
fields. Older versions of
rsconnect store account records with a username
field. Recent rsconnect
versions record name
. Both name
and username
should contain the same
value. (#1024)
Added space
parameter to deploy directly to a space in Posit Cloud.
Improve reporting of errors returned by shinyapps.io. (#997)
Remove most directory layout validation checks. (#998)
Do not use getOption("available_packages_filters")
option when calling
available.packages()
. (#1002)
Packages installed from source within an renv project are not associated with repositories. (#1004)
Fixed analysis of directories that were smaller than the
rsconnect.max.bundle.files=10000
limit but larger than the
renv.config.dependencies.limit=1000
limit. (#968)
Ignore .env
, .venv
, and venv
files only when they reference Python
virtual environments. (#972)
deployApp()
and writeManifest()
accept optional envManagement
,
envManagementR
, and envManagementPy
arguments. These args specify whether
Posit Connect should install packages in the package cache.
If envManagement
is FALSE
then Connect will not perform any package
installation and it is the administrator's responsibility to ensure the
required R/Python packages are available in the runtime environment. This is
especially useful if off-host execution is enabled, when the execution
environment (specified by the image
argument) already contains the required
packages. These values are ignored when
Applications.ManifestEnvironmentManagementSelection = false
.
Requires Posit Connect >=2023.07.0
. (#977)
Fix account discovery by showProperties()
. (#980)
Fixed redeployments to shinyapps.io where appName
is provided, but no local
record of the deployment exists. (#932)
deployApp()
and writeManifest()
now error if your library and renv.lock
are out-of-sync. Previously it always used what was defined in the renv.lock
but that was (a) slow and (b) could lead to different results than what you
see when running locally (#930).
Deploying from an renv project includes the renv.lock
in the bundle. A
manifest created for an renv project references the renv.lock
in the
manifest.json
. (#926)
Use the environment variable RSCONNECT_PACKRAT
to analyze dependencies
using packrat, as was done prior to rsconnect-1.0.0. Use of the
rsconnect.packrat
option is discouraged, as it is not effective when using
push-button deployment in the RStudio IDE. (#935)
The renv.lock
is ignored when the RSCONNECT_PACKRAT
environment variable
or the rsconnect.packrat
option is set. (#936)
The content type is inferred by analyzing the set of top-level files. (#942)
deployApp()
and writeManifest()
accept an optional appMode
argument.
Provide this argument if your project includes auxiliary files which mislead
the existing appMode
inference. For example, if an HTML project includes
a downloadable Shiny app.R
, that content will be assumed to be a Shiny
application even if that application is not meant to be run. (#948)
appDependencies()
accepts an appFileManifest
argument as an alternate
way of providing the target set of files.
deployDoc()
includes .Rprofile
, requirements.txt
and renv.lock
when
deploying .Rmd
or .qmd
. These additional files are not included with
rendered HTML documents. (#919)
Explicit renv dependencies are preserved. (#916)
deployApp()
and deployDoc()
now support deploying static content to Posit
Cloud. Static RMarkdown and Quarto content can be rendered server-side.
rsconnect requires renv 1.0.0.
deployApp()
and writeManifest()
now respect renv lock files, if present.
If you don't want to use these lockfiles, and instead return the previous
behaviour of snapshotting on every deploy, add your renv.lock
to
.rscignore
(#671). Learn more ?appDependencies()
.
Additionally, deployApp()
and writeManifest()
now use renv to capture app
dependencies, rather than packrat. If this causes a previously working deploy
to fail, please file an issue then set options(rsconnect.packrat = TRUE)
to
revert to the previous behaviour.
deployApp()
's quarto
argument now takes values TRUE
, FALSE
or
NA
. The previous value (a path to a quarto binary) is now ignored,
and instead we automatically figure out the package from QUARTO_PATH
and
PATH
env vars (#658). deploySite()
now supports quarto websites (#813).
deployApp()
gains a new envVars
argument which takes a vector of the
names of environment variables that should be securely copied to the server.
The names (not values) of these environment variables are also saved in the
deployment record and will be updated each time you re-deploy the app (#667).
This currently only works with Connect, but we hope to add support to
Posit cloud and shinyapps.io in the future.
rsconnect gains two new functions for understanding and updating the
environment variables that your apps currently use. listServerEnvVars()
will return a data frame of applications, with a envVars
list-column
giving the names of the environment variables used by each application.
updateServerEnvVars()
will update all applications that use a specific
environment variable with the current value of that environment variable
(#667).
Non-libcurl rsconnect.http
options have been deprecated. This allows us to
focus our efforts on a single backend, rather than spreading development
efforts across five. The old backends will remain available for at least 2
years, but if you are using them because libcurl doesn't work for you, please
report the problem ASAP so we can fix it.
addConnectServer()
has been deprecated because it does the same
thing as addServer()
now that addServer()
also validates URLs.
deployTFModel()
is defunct. Posit Connect no longer supports hosting of
TensorFlow Model APIs. A TensorFlow model can be deployed as a Plumber
API, Shiny
application, or other
supported content type.
discoverServer()
has been deprecated; it never worked.
deployApp("foo.Rmd")
has been deprecated. It was never documented, and
it does the same job as deployDoc()
(#698).
New rsconnect.http.headers
and rsconnect.http.cookies
allow you to
set extra arbitrary additional headers/cookies on each request (#405).
Their use is documented in the new vignette("custom-http")
.
Uploading large files to RPubs works once more (#450).
When recording details about deployments to Posit Cloud, appId now represents
the content id (as seen in URLs of the format
https://posit.cloud/content/{id}
) instead of the application id.
Deployment records no longer contain the time the app was deployed (when
)
or when it's metadata was last synced (lastSyncTime
) as these variables
are not very useful, and they lead to uninteresting diffs if you have
committed the deployment records to git (#770). A version
field has been
added to deployment DCF files to facilitate future file format changes, if
needed. Its value for this release is 1
.,
accounts()
returns a zero-row data frame if no accounts are registered.
accountInfo()
and removeAccount()
no longer require account
be
supplied (#666).
accountInfo()
and servers()
redact sensitive information (secrets,
private keys, and certificates) to make it hard to accidentally reveal
such information in logs (#675).
addServer()
includes the port in the default server name, if present.
appDependencies()
includes implicit dependencies, and returns an additional
column giving the Repository (#670). Its documentation contains more
information about how dependency discovery works, and how you can control
it, if needed.
applications()
now returns the application title, if available (#484),
and processes multiple pages of results from a Connect server (#860).
connectApiUser()
now clearly requires an apiKey
(#741).
deployApp()
output has been thoroughly reviewed and tweaked. As well as
general polish it now gives you more information about what it has discovered
about the deployment, like the app name, account & server, and which files
are included in the bundle (#669).
deployApp()
is more aggressive about saving deployment data, which should
make it less likely that you need to repeat yourself after a failed
deployment. In particular, it now saves both before and after uploading the
contents (#677) and it saves when you're updating content originally created
by someone else (#270).
deployApp()
now gives an actionable error if you attempt to set
visibility of an app deployed to posit.cloud (#838).
deployApp()
now uses a stricter policy for determining whether or not
a locally installed package can be successfully installed on the deployment
server. This means that you're more likely to get a clean failure prior to
deployment (#659).
deployApp()
will now detect if you're attempting to publish to an app
that has been deleted and will prompt you to create a new app (#226).
deployApp()
includes some new conveniences for large uploads including
reporting the size of the bundle you're uploading and showing a progress bar
in interactive sessions (#754).
deployApp()
now follows redirects, which should make it more robust to your
server moving to a new url (#674).
deployApp()
uses simpler logic for determining whether it should create a
new app or update an existing app. Now appName
, account
, and server
are
used to find existing deployments. If none are found, it will create a new
deployment; if one is found, it'll be updated; if more than one are found, it
will prompt you to disambiguate (#666).
deployApp()
improves account resolution from account
and server
arguments by giving specific recommendations on the values that you might use
in the case of ambiguity or lack of matches (#666). Additionally, you'll now
receive a clear error if you accidentally provide something other than a
string or NULL
to these arguments.
deployApp()
now generates an interactive prompt to select account
/server
(if no previous deployments) or appName
/account
/server
(if multiple
previous deployments) (#691).
deployApp()
now advertises which startup scripts are run at the normal
logLevel
, and it evaluates each script in its own environment (#542).
deployApp()
now derives appName
from appDir
and appPrimaryDoc
,
never using the title (#538). It now only simplifies the path if you are
publishing to shinyapps.io, since its restrictions on application names are
much tighter than those of Posit Connect.
deployApp()
will now warn if appFiles
or appManifestFiles
contain
files that don't exist, rather than silently ignoring them (#706).
deployApp()
excludes temporary backup files (names starting or ending
with ~
) when automatically determining files to bundle (#111) as well as
directories that are likely to be Python virtual environments (#632).
Additionally, ignore rules are always now applied to all directories;
previously some (like .Rproj.user
and "manifest.json"
) were only
applied to the root directory. It correctly handles .rscignore
files
(i.e. as documented) (#568).
deployApp(appSourceDoc)
has been deprecated; it did the same job as
recordDir
.
deployDoc()
includes a .Rprofile
in the bundle, if one is found in the
same directory as the document.
lint()
should have fewer false positives for path problems:
the relative path linter has been removed (#244) and the case-sensitive
linter now only checks strings containing a /
(#611).
New listDeploymentFiles()
, which supsersedes listBundleFiles()
.
It now errors when if the bundle is either too large or contains too many
files, rather than silently truncating as before (#684).
serverInfo()
and removeServer()
no longer require a server
when
called interactively.
showMetrics()
once again returns a correctly named data frame (#528).
Removed Rmd generation code (writeRmdIndex()
) which had not worked, or
been necessary, for quite some time (#106, #109).
Locale detection has been improved on windows (#233).
The rsconnect.pre.deploy
and rsconnect.post.deploy
hooks are now always
called with the content directory, not sometimes the path to a specific file
(#696).
Functions that should only interact with shinyapps.io enforce the server
type. Updated addAuthorizedUser()
, removeAuthorizedUser()
,
showUsers()
, showInvited()
, resendInvitation()
, configureApp()
,
setProperty()
, unsetProperty()
, purgeApp()
, restartApp()
,
terminateApp()
, showUsage()
, and showMetrics()
(#863, #864).
When needed packages are not installed, and you're in an interactive environment, rsconnect will now prompt you to install them (#665).
The confirmation prompt presented upon lint failures indicates "no" as its default. (#652)
Introduced support for publishing to Posit Cloud. This feature is currently in closed beta and requires access to an enabled account on Posit Cloud. See Posit Cloud's Announcement for more information and to request access.
Update company and product names for rebranding to Posit.
Shiny applications and Shiny documents no longer include an implicit
dependency on ragg
when that package is present
in the local environment. This reverts a change introduced in 0.8.27.
Shiny applications should add an explicit dependency on ragg
(usually with
a library("ragg")
statement) to see it used by shiny::renderPlot
(via
shiny::plotPNG
).
The documentation for shiny::plotPNG
explains the use of ragg
. (#598)
Fix bug that prevented publishing or writing manifests for non-Quarto content
when a Quarto path was provided to the quarto
argument of writeManifest()
,
deployApp()
, and related functions.
Escape account names when performing a directory search to determine an appropriate server. (#620)
quarto
argument. (#594).rscignore
. (#599)appDir
and quarto
binary but not an
appPrimaryDoc
work more consistently. A directory containing a .qmd
file
will deploy as Quarto content instead of failing, and a directory containing
an .Rmd
file will successfully deploy as Quarto content instead of falling
back to R Markdown. (#601)ragg
package is installed locally, it is now added as an implicit
dependency to shiny
apps since shiny::renderPlot()
now uses it by default
(when available). This way, shiny
apps won't have to add library(ragg)
to
get consistent (higher-quality) PNG images when deployed. (#598)openssl
version to 2.0.0 to enable publishing for users
on FIPS-compliant systems without the need for API keys. (#452)writeManifest
, which requires passing the absolute
path to a Quarto executable to its new quarto
parameterquarto
parameter to deployApp
to enable deploying Quarto documents
and websites by supplying the path to a Quarto executablejupyter
runtimeimage
in the bundle manifestshowLogs
function takes a server
parameter. (#57)rsconnect.tar
option, which can be used to specify the path to a
tar
implementation instead of R's internal implementation. The previous
method, using the RSCONNECT_TAR
environment variable, still works, but the
new option will take precedence if both are set.curl
option -T
when uploading files to avoid out of memory
errors with large files. (#544)rsconnect.max.bundle.size
and rsconnect.max.bundle.files
options are
enforced when processing an enumerated set of files. Previously, these
limits were enforced only when bundling an entire content directory. (#542)tools::R_user_dir
. Configuration created by earlier versions of this
package is automatically migrated to the new location. (#550).rscignore
file to exclude files or directories from publishing (#368)R CMD CHECK
R_USER_CONFIG_DIR
shiny.R
instead of server.R
(#509)verbose
option to writeManifest
utility (#468)options(rsconnect.http.trace.json = TRUE)
could cause deployment errors with some HTTP transports (#490)RSCONNECT_TAR
environment variable can be used to select the tar implementation used to create bundles (#446)showUsers()
(#398)connectApiUser()
did not set a user id (#407)deployApp
to force the generation of a Python environment file or a requirements.txt
file (#409)server.R
is present (#461)packrat
0.5 or later (#434)writeManifest()
no longer reference packrat
files in the generated manifest.json
. The packrat
entries were transient and only existed while computing dependencies. (#472)applications
when ShinyApps does not return size
details (#496)browser()
debugging calls when deploying (#196)appId
and other global deployment parameters to deploySite
(#231)deployments()
without any registered accounts (#261)renv
files from deployment bundle (#367)RETICULATE_PYTHON
when writing manifests (#374)on.failure
user hook to run a function when deployApp()
fails (#375)requirements.txt
for Python, if it exists (#386)