GitLab生产环境CI执行npm run build报cross-env not found但staging正常如何解决
问题原因
- 你在CI变量中全局设置了
NODE_ENV=production,此时执行npm install会自动跳过安装package.json里的devDependencies依赖,cross-env通常作为开发依赖被放在devDependencies分类中 - 你虽然单独执行了
npm install cross-env,但本地安装的npm包可执行文件默认存放在当前项目的node_modules/.bin目录下,shell默认不会扫描该路径,因此执行npm run build调用cross-env时会找不到执行文件 - staging环境未报错的核心原因大概率是staging的CI配置没有设置全局的
NODE_ENV=production,npm install时完整安装了所有依赖,或是staging的缓存中保留了devDependencies的安装文件
解决方案
按优先级推荐以下几种修复方式:
方案1:调整NODE_ENV的设置位置(最推荐)
将全局的NODE_ENV变量移到build命令内部声明,不要全局设置,这样npm install会正常安装所有依赖,修改你的.gitlab-ci.yml配置:
build-prod: stage: build-prod image: node:latest # 移除此处全局的NODE_ENV: production配置 rules: - if: '$CI_COMMIT_BRANCH == "main"' when: on_success - when: never script: - node --version - npm --version - ls - cd front - ls - npm install -g @vue/cli-service@latest - rm -rf node_modules - npm install # 不需要单独安装cross-env,只要package.json的devDependencies中已包含cross-env即可 - npm run build - ls
你原来的package.json中build命令已经是cross-env NODE_ENV=production && vue-cli-service build,无需额外修改。
方案2:强制npm安装所有依赖
如果必须保留全局NODE_ENV=production的配置,给npm install加上--include=dev参数强制安装开发依赖:
script: # 其他步骤保持不变 - npm install --include=dev - npm run build
方案3:全局安装cross-env
直接把cross-env安装到全局环境,shell就能直接识别到执行文件:
script: # 其他步骤保持不变 - npm install -g cross-env - npm run build
方案4:调用时指定cross-env路径
如果不想修改安装逻辑,也可以调整package.json里的build命令,直接指定cross-env的相对路径:
{ "scripts": { "build": "./node_modules/.bin/cross-env NODE_ENV=production && vue-cli-service build" } }
内容的提问来源于stack exchange,提问作者Alexy
相关产品推荐
相关产品推荐

