Shiny应用部署失败:缺失cmake导致nloptr依赖报错
解决Shiny应用部署到私有rsconnect时缺少cmake的问题
除了联系管理员安装cmake,你可以尝试以下几种方案:
方案1:预编译nloptr包并随应用部署
这种方法跳过服务器端的编译步骤,直接使用本地预编译好的nloptr包:
- 本地确保已安装cmake,重新编译安装nloptr:
install.packages("nloptr", type = "source") - 找到nloptr的本地安装路径:
find.package("nloptr") - 将该路径下的整个包文件夹复制到Shiny应用目录的
lib子文件夹中 - 在应用的
global.R或入口脚本开头添加代码,优先加载本地包:.libPaths(c(file.path(getwd(), "lib"), .libPaths())) library(nloptr)
部署时rsconnect会直接使用预编译好的包,无需在服务器上编译,也就不需要cmake。
方案2:在用户空间安装cmake(无需管理员权限)
如果服务器允许上传文件,可手动安装cmake到用户目录:
- 下载对应服务器系统的cmake二进制包(例如Linux的tar.gz格式),上传到服务器的用户目录(如
~/cmake) - 解压二进制包,在Shiny应用的开头添加代码,将cmake的bin目录加入系统PATH:
Sys.setenv(PATH = paste0("~/cmake/bin:", Sys.getenv("PATH"))) - 之后再加载nloptr包,系统就能找到cmake并完成编译(如果需要的话)
方案3:使用renv管理预编译依赖
利用renv打包已编译的依赖,确保部署时使用本地的编译版本:
- 本地初始化renv并安装nloptr:
renv::init() renv::install("nloptr") renv::snapshot() - 将生成的
renv文件夹和Shiny应用一起部署,rsconnect会识别renv环境,直接使用已编译好的包,无需服务器端重新编译
注意事项
如果服务器是Linux系统,本地编译nloptr时最好使用与服务器相同的系统架构和版本(可通过Docker模拟),避免二进制包兼容性问题。
内容的提问来源于stack exchange,提问作者Jorge Kageyama
相关产品推荐
相关产品推荐

