You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 02:15:41