今天遇到的case,立此存照。
緣起
今天,深圳部門同事反饋又一件奇事:前不久,可以在jenkins上正常打包的代碼,node.js項目,今早,突然就不行了。報錯,說我們的jenkins client上沒有Python 2環(huán)境:
gyp verb `which` failed Error: not found: python2
分析
下面的小伙伴搞不定,就報到我這里來了。先按常規(guī)套路,排除了npm源,jenkins節(jié)點空間,docker鏡像之類的問題。順著出錯log先前看,發(fā)現(xiàn)了更有價值的出錯信息:
npm info lifecycle node-sass@4.20200618.1~postinstall: node-sass@4.20200618.1
> node-sass@4.20200618.1 postinstall /home/jenkins/workspace/xxx/node_modules/node-sass
> node scripts/build.js
Building: /usr/local/bin/node /home/jenkins/workspace/xxx/node_modules/node-gyp/bin/node-gyp.js rebuild --verbose --libsass_ext= --libsass_cflags= --libsass_ldflags= --libsass_library=
gyp info it worked if it ends with ok
gyp verb cli [ '/usr/local/bin/node',
gyp verb cli '/home/jenkins/workspace/xxx/node_modules/node-gyp/bin/node-gyp.js',
gyp verb cli 'rebuild',
gyp verb cli '--verbose',
gyp verb cli '--libsass_ext=',
gyp verb cli '--libsass_cflags=',
gyp verb cli '--libsass_ldflags=',
gyp verb cli '--libsass_library=' ]
喲,原來是在安裝node-sass@4.20200618.1 這個包時出的問題。
對比之前正確時的輸出:
[node-sass@4.13.0](mailto:node-sass@4.13.0) postinstall /home/jenkins/workspace/xxx/node_modules/node-sass
原來如彼~
因為4.13的node-sass,我們在編譯鏡像里預提供了,而最新版本的node-sass,卻需要從源碼重新編譯而導致失敗。
解決
接下來的事,就方便解決了。讓前端開發(fā)的同事,在package.json里,固定好node-sass的版本,不要隨便自動升級就好。
package.json
...
# "node-sass": "^4.12.0" 這是之前的樣子,要更改為下面一行
"node-sass": "4.13.0"
...
擴展
徒手安裝node-sass,本來也是一件要細心和耐心的事,國內(nèi)用戶一般通過設置淘寶的二進制地址解決。
node-sass簡介
Sass、Less、Stylus等CSS預處理器的出現(xiàn)大大的提升了CSS的開發(fā)速度和代碼可讀性,相對來說Sass功能更全面、使用的更廣泛。
Node-sass是一個庫,它將Node.js綁定到LibSass(流行樣式表預處理器Sass的C版本)。它允許用戶以令人難以置信的速度將.scss文件本地編譯為css,并通過連接中間件自動編譯。
Sass是一種預處理器腳本語言,可以解釋或編譯成層疊樣式表(CSS)。
Sass包含兩種語法:較舊的語法使用縮進將代碼塊和換行符分隔為單獨的規(guī)則;較新的語法SCSS使用像CSS這樣的塊格式。它使用大括號來表示代碼塊和分號來分隔塊中的行。
縮進語法和SCSS文件傳統(tǒng)上分別給出擴展名.sass和.scss
知乎上的說法:
node-sass 編譯器是通過 C++ 實現(xiàn)的。
在 Node.js 中,采用 gyp 構建工具進行構建 C++ 代碼,而 GYP 是基于 Python 2 開發(fā)的,所以需要 python,而且不支持 3。
當然,要編譯 C++ 還需要一個 C++ 編譯器,類似 gcc,不同操作系統(tǒng)下需要的環(huán)境也不同,參考官網(wǎng)說明。所以如果你之前沒有配置過 node-gyp 構建環(huán)境,只裝上 python2 還是不行的。
要是覺得配置環(huán)境麻煩,node-sass 本身提供對應不同系統(tǒng)的二進制版本,直接重新安裝即可。