2022 年 11 月,我用 Yarn v1 更新我一個有用到 GitHub private repository 的專案時出了錯。經過調查發現是 Node.js v19.1.0 的改動造成了這個錯誤。
在 GitHub 要 clone repository 時複製的 SSH 地址是長這樣:git@github.com:vrabe/repo.git
。如果要在專案使用這個 repository 也是使用這個地址:yarn add ssh://git@github.com:vrabe/repo.git
。雖然 Git 支援這種類似 scp 指定路徑的方法,不過這個卻不符合 WHATWG 的 URL 標準。URL 字串的冒號後面應該是埠號,只能是數字。先前 Node.js 的 url.parse()
是允許這個的,不過為了安全考量所以在這個版本改掉了。yarn 在解析相依性解析到我用到的這個 private repository 地址的時候,有用到 url.parse()
這個函式,所以更新到 v19.1.0 之後就發生了這個錯誤。
後來雖然在 v19.2.0 回退了這個改動,不過在 v20 開始出現棄用的警告,可能在更之後的 Node.js 版本就不能這樣用了。新版 Yarn 已經不使用這個 url.parse()
,但是 Yarn v1 看起來不會改。
我後來從新版 Yarn 的 pull request 看到解法。只要把冒號改成斜線就好,也就是這樣:
能這麼簡單就解決真是太好了。
參考資料
Node.js GitHub repository
- url: improve port validation #45012
- node 19.1 breaks
url.parse
#45514 - Revert “url: improve port validation” #45517
- url: emit warning in url.parse() for URLs with invalid ports #45526
Yarn GitHub repository