概述
今天本地運行尤大的vue-hackernews-2.0,使用 yarn 命令安裝,報錯提示 node 版本必須大於7小於9,如下所示:
error upath@1.0.4: The engine "node" is incompatible with this module. Expected version ">=4 <=9". error Found incompatible module
然后我到 package.json 文件里面去看,明明只說了 node 要大於7,沒有說要小於9啊。於是我去找 issue,發現竟有人能夠解決這個問題。看了下他的解決方法,原來是 yarn.lock 的原因。
於是我查了下 yarn.lock 的資料,記錄下來,供以后開發時參考,相信對其他人也有用。
yarn.lock
官方對 yarn.lock 文件的說明如下:
為了跨機器安裝得到一致的結果,Yarn 需要比你配置在 package.json 中的依賴列表更多的信息。 Yarn 需要准確存儲每個安裝的依賴是哪個版本。
為了做到這樣,Yarn 使用一個你項目根目錄里的 yarn.lock 文件。這可以媲美其他像 Bundler 或 Cargo 這樣的包管理器的 lockfiles。它類似於 npm 的 npm-shrinkwrap.json,然而他並不是有損的並且它能創建可重現的結果。
需要注意的是:所有 yarn.lock 文件應該被提交到版本控制系統。
npm-shrinkwrap.json
上面說到了 npm-shrinkwrap.json,那 npm-shrinkwrap.json 又是什么呢?
通過查資料,簡單來說,它是由命令 npm shrinkwrap 生成的,它的作用和 package-lock.json 的作用是一樣的,都是用來鎖定版本用的。現在有了 package-lock.json 之后就不怎么用 npm-shrinkwrap.json 了。
解決問題
那么一開始我遇到的問題是什么原因呢?怎么解決呢?
再次摘抄報錯提示如下:
error upath@1.0.4: The engine "node" is incompatible with this module. Expected version ">=4 <=9". error Found incompatible module
那就很簡單了,原因是 upath@1.0.4 這個庫只支持 >=4 <=9 的 node。那這個庫 upath@1.0.4 鎖定版本在 1.0.4 了,猜測是因為 yarn.lock 里面鎖定了,所以去里面找,果然找到了。
所以解決方法有3個:
- 修改 yarn.lock 文件,把 upath 的版本改成最新版本,再 yarn 一遍。
- 刪掉 yarn.lock 文件里面關於 upath@1.0.4 的信息,再 yarn 一遍。
- 直接刪掉 yarn.lock 文件,再 yarn 一遍。
