Red Hat OpenShift构建adobot-io-master项目失败,求解决方法
run-s: command not found的问题 从你提供的构建日志来看,核心错误是sh: run-s: command not found——这个命令来自npm-run-all工具包,出现问题的根源很明确:OpenShift的Node.js S2I构建镜像默认执行npm install -s --only=production,只安装生产环境依赖,而npm-run-all大概率被放在了项目的devDependencies中,导致构建阶段找不到该命令。
下面是几种针对性的解决方案:
方案一:将npm-run-all移至生产依赖
打开项目根目录的package.json,找到devDependencies里的npm-run-all条目,把它移动到dependencies区块下。这样生产环境安装依赖时会自动包含这个工具包,run-s命令就能正常调用了。
示例修改后的package.json片段:
{ "dependencies": { "npm-run-all": "^4.1.5", // 其他生产依赖保持不变... }, "devDependencies": { // 移除npm-run-all条目 // 其他开发依赖保持不变... } }
方案二:调整OpenShift构建的依赖安装规则
你可以通过修改OpenShift的构建配置,让构建阶段安装所有依赖(包括开发依赖),毕竟构建过程本身需要用到这类工具。
方法1:通过环境变量覆盖默认参数
使用oc命令给构建配置添加环境变量,覆盖默认的--only=production参数:
oc set env bc/adobot-io NPM_INSTALL_FLAGS=""
也可以在OpenShift控制台中,找到对应构建配置的「环境变量」标签页,手动添加NPM_INSTALL_FLAGS变量并设置为空值。
方法2:自定义构建脚本流程
如果项目的package.json中有build脚本,可以调整构建流程:先安装全量依赖,执行构建后再清理开发依赖(可选)。修改scripts区块如下:
{ "scripts": { "prebuild": "npm install", "build": "run-s your-build-commands", // 替换为原构建命令 "postbuild": "npm prune --production" // 可选:构建完成后清理开发依赖 } }
方案三:定制S2I构建镜像(进阶)
如果以上方案都不符合你的需求,可以基于OpenShift官方Node.js镜像制作自定义S2I镜像,预先安装npm-run-all工具包。这个方法适合需要长期定制构建环境的场景,但需要具备基础的Docker和S2I知识。
尝试任意一种方案后,重新触发OpenShift构建,应该就能解决run-s命令找不到的问题了。
内容的提问来源于stack exchange,提问作者Dharmendra Soni

