skip to content
鰭狀漏斗

新版 sharp 不支援 Yarn v1

/ 閱讀時間 3 分鐘

一月時,我更新部落格,把 Astro 升級到 4.0.8,然後 Yarn 出現了類似下面的警告:

warning sharp@0.33.1: The engine "libvips" appears to be invalid.

其實有很多行,我只列出第一行。

然後執行 local 測試環境時,如果開到有圖片的頁面,會出現下面的錯誤:

Could not process image request: MissingSharp: Could not find Sharp. Please install Sharp (`sharp`) manually into your project or migrate to another image service.

雖然之後再更新後解決了,但是二月更新時又出現了類似的問題。在做 astro build 的時候,出現了下面的錯誤:

Error: Could not load the "sharp" module using the linux-x64 runtime
Possible solutions:
- Ensure optional dependencies can be installed:
npm install --include=optional sharp
yarn add sharp --ignore-engines
- Ensure your package manager supports multi-platform installation:
See https://sharp.pixelplumbing.com/install#cross-platform
- Add platform-specific dependencies:
npm install --os=linux --cpu=x64 sharp
npm install --force @img/sharp-linux-x64
- Consult the installation documentation:
See https://sharp.pixelplumbing.com/install

這兩個錯誤看起來很明顯跟 sharp 有關。

實際上原因是 sharp 從 0.33.0 版本起對安裝的改變導致的。

sharp 本身及所依賴的 libvips 在不同電腦平台的二進制檔是不同的。舊版的 sharp 是在安裝的時候下載適合這個平台的二進制檔,而從 0.33.0 版本起的 sharp 則把這些預編譯過的二進制檔獨立出來成為 npm package(這些 package),由 package manager 判斷要安裝哪一個包含二進制檔的 package。

判斷的方式是將所有上述的 package 納入 sharp 的 optionalDependencies,然後藉由各個 package package.jsoncpuoslibc 決定要裝哪一個版本的 package。

package.json 上的這些東西是比較新的,所以舊版的 package manager 不會支援。這些 package 也有列出支援的 package manager 有:

  • npm: >=9.6.5
  • yarn: >=3.2.0
  • pnpm: >=7.1.0

Yarn v1 當然不在裡面。如果要解決這個問題,需要參考上面錯誤訊息,自己另外安裝 sharp,並加上 ignore-engines flag:

yarn add sharp --ignore-engines

或者如 sharp 作者 lovell 所說:

如果你還在用 Yarn v1 的話,現在是升級的最佳時機。

升級 Yarn,或者改用其他 package manager 吧。

參考資料