skip to content
鰭狀漏斗

Yarn 安裝來自 GitHub repository 的套件時不要用網站上的 SSH URL

/ 閱讀時間 2 分鐘

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 看到解法。只要把冒號改成斜線就好,也就是這樣:

// before
{
"repo": "ssh://git@github.com:vrabe/repo.git"
}
// after
{
"repo": "ssh://git@github.com/vrabe/repo.git"
}

能這麼簡單就解決真是太好了。

參考資料

Node.js GitHub repository

Yarn GitHub repository