事情发生的原因
事情一开始很简单,前端项目的 package-lock.json 锁文件在某一git 提交时,取消追踪了。 当然啦,这是本人的杰作,昨天发现,唉~这样是不是不好哎,一查,果然不适合,理论出处
然后我就恢复了 package-lock.json 锁文件的追踪,用这个命令 git add <文件路径> 然后 .gitignore 一改直接提交到生产环境了。 临下班前,想更新一下,这一构建,出了大问题
矮黑,文件不存在,让我感觉到事情远远没有那么简单,赶紧回退,然后草草下班
排查与解决
自己搞半天查半天,本地的构建没问题,真的邪门。 现代科技发达了,赶到了好时候。有啥问题问 AI 就可以。 我把出问题的分支,直接拷贝到了本机wsl里。 然后开始构建,构建卡住了
什么? sass问题,和我lock文件有啥关系,八嘎。 然后把 vue.config.js 里的css配置引入sass-embedded 一注释, npm run build 也好了, 构建镜像也好了docker build -t test-assets . 呦西!
AI解释:Linux 环境里当前安装出来的 sass-embedded 没拿到可执行的 Dart Sass embedded 编译器,于是退到了 pure JS(Pure JavaScript,纯 JavaScript)模式;而 sass --embedded 在 pure JS 模式不可用,所以 Vue CLI(Command Line Interface,命令行接口)构建一直卡住/失败,最终没有生成 assets 目录,Docker 才报:/build-app/assets: not found.
没有追踪 package-lock.json 时,Jenkins 每次 npm install 都会按 package.json 里的版本范围重新解析依赖;你恢复锁文件后,Jenkins 被固定到了你本地这次生成出来的依赖树。这个依赖树里刚好触发了 Linux 下的 sass-embedded 问题。
知道了问题,还是用回单纯的 sass 吧,再次把锁文件提交,把 sass-embedded 依赖一删,ikun!