1198 字
6 分鐘

pnpm ERR_PNPM_INVALID_PROXY 怎麼修?先清掉空的代理設定

如果 pnpm 顯示 ERR_PNPM_INVALID_PROXY,而錯誤訊息中的 proxy URL 是空字串,先把空的代理設定移除;不要再加入另一個 HTTP_PROXY= 當成修復。受影響的 pnpm 版本會把空值送進 URL parser,結果就算你其實不需要代理,也會在安裝開始前失敗。

直接答案是:沒有代理時,移除 HTTP_PROXY、HTTPS_PROXY、PROXY、NO_PROXY 及對應的小寫環境變數;需要代理時,填入包含 scheme、主機和 port 的完整 URL;最後在真正失敗的 CI runner 印出 pnpm 版本與設定來源。 pnpm 12 RC 0 的 release note 已把空值視為 unset,但不同 runner 不一定已經使用修正版本。

先辨認錯誤和依賴失敗的邊界#

pnpm issue #13533 記錄了 pnpm v12.0.0-beta.0 的重現方式:執行 HTTP_PROXY= pnpm 後,回報 Invalid proxy URL,並提示檢查 .npmrchttps-proxyhttp-proxyproxy 或環境變數。這不是 lockfile、registry token 或套件版本解析錯誤;要先修正代理設定,才有意義繼續看後面的安裝訊息。

錯誤大致長這樣:

ERR_PNPM_INVALID_PROXY
Invalid proxy URL: (could not parse as an authority-bearing URL)

若訊息顯示的是 authentication、registry 404、tarball integrity 或 lifecycle script,請另開一條排查路徑,不要把所有 pnpm install 失敗都歸因於 proxy。

不需要代理時,移除空值而不是設定空字串#

macOS、Linux 和支援 env -u 的 shell 可以在單次安裝中移除代理:

Terminal window
env -u HTTP_PROXY -u HTTPS_PROXY -u ALL_PROXY \
-u http_proxy -u https_proxy -u all_proxy \
pnpm install --frozen-lockfile

GitHub Actions 可以把清除動作放在執行 pnpm 的同一個 shell:

- name: Install dependencies
shell: bash
run: |
unset HTTP_PROXY HTTPS_PROXY ALL_PROXY
unset http_proxy https_proxy all_proxy
pnpm install --frozen-lockfile

PowerShell 則移除目前 process 的值:

Terminal window
$env:HTTP_PROXY = $null
$env:HTTPS_PROXY = $null
$env:ALL_PROXY = $null
pnpm install --frozen-lockfile

這只適用於工作需要「不使用代理」的情況。若公司的網路必須經過 proxy,請設定有效 URL;不要用清除環境變數繞過網路政策。

需要代理時,填入可解析的 URL#

最小格式應包含 scheme、主機和 port:

Terminal window
export HTTPS_PROXY='http://proxy.example.com:8080'
pnpm install --frozen-lockfile

若 URL 需要帳號密碼,保留在 CI secret 或受控的使用者設定,並將密碼中的 @#%、空白等保留字元做 URL encoding:

http://build-user:p%[email protected]:8080

不要把含有 token 或密碼的 proxy URL 寫進 repository 的 .npmrcpnpm-workspace.yaml。代理設定本身就是網路目的地,應和 registry credential 分開保護。

找出代理設定從哪裡來#

pnpm 文件把 httpProxyhttpsProxynoProxy 列為 network settings;新版 pnpm 會在 pnpm-workspace.yaml 或全域設定中處理 pnpm-specific settings,.npmrc 仍可能是相容性輸入。先分開檢查設定檔與環境,不要把兩者混成一個值:

Terminal window
pnpm --version
pnpm config get proxy
pnpm config get http-proxy
pnpm config get https-proxy
env | grep -iE '^(http|https|all|no)_proxy='

在 repository 根目錄也可以檢查是否有設定檔宣告代理鍵,但不要把整份可能含有 credential 的檔案貼到 issue:

Terminal window
rg -n --hidden --glob '!.git' \
'(^|[[:space:]])(httpProxy|httpsProxy|noProxy|proxy|http-proxy|https-proxy|no-proxy)[:=]' \
pnpm-workspace.yaml .npmrc 2>/dev/null

如果輸出含有帳號、密碼或 token,先遮罩再保存診斷紀錄。真正重要的是知道「哪一層提供空值」,不是把秘密完整印出來。

確認 runner 已經使用修正版#

pnpm 12 RC 0 的 release note 已把 .npmrcpnpm-workspace.yaml、CLI 和 HTTP_PROXYHTTPS_PROXYPROXYNO_PROXY 的空值視為 unset;proxy=false 在設定檔中也能表達停用代理。這個修正不會替尚未更新的 CI image 自動換版本,所以仍要在失敗的 job 內確認:

Terminal window
pnpm --version
command -v pnpm
pnpm install --frozen-lockfile

pnpm --version 在本機通過,不代表 self-hosted runner、Docker image 或 package manager action 使用同一個 executable。若仍在舊 beta 或未包含修正的版本,先保留 unset workaround,再安排 runner 升級;不要為了繞過 proxy parser 直接刪除 lockfile。

修正版可以解決「空值被誤解析」的程式錯誤,但不會替你決定企業 proxy、noProxy 範圍或憑證輪替策略。安裝成功後再測試 registry authentication、frozen lockfile 和 audit,才能知道下一個失敗是否是另一個問題。

常見問題#

Q: HTTP_PROXY= 和沒有設定 HTTP proxy 一樣嗎?#

A: 對受影響的 pnpm 版本不一定。空字串仍可能進入 proxy parser,觸發 ERR_PNPM_INVALID_PROXY;沒有代理需求時,應移除變數,而不是明確 export 空值。pnpm 12 RC 0 才把這類空值統一視為 unset。

Q: 我應該把 HTTP_PROXY= 放進 GitHub Actions 的 env 嗎?#

A: 不要把它當成通用 workaround。若 job 不需要代理,在執行 pnpm 的 shell 中 unset;若需要代理,放一個完整且由 secret 管理的 URL。空值在舊版可能剛好重現這個錯誤。

Q: 為什麼 pnpm config get proxy 是空的,安裝仍然失敗?#

A: 代理也可能來自 HTTP_PROXYHTTPS_PROXY、大小寫變體、pnpm-workspace.yaml 或全域設定。把 pnpm config、設定檔和 environment 分開檢查,並在實際失敗的 CI runner 執行,而不是只看本機 shell。

參考資料:

pnpm Issue #13533:Empty HTTP_PROXY/HTTPS_PROXY variables cause parse failure

pnpm 12 RC 0 release notes

pnpm Docs:Settings

pnpm Security Advisory:proxy settings from untrusted manifests

pnpm ERR_PNPM_INVALID_PROXY 怎麼修?先清掉空的代理設定
https://laplusda.com/posts/pnpm-invalid-proxy-empty-values/
作者
Zero
發佈於
2026-08-26
許可協議
CC BY-NC-SA 4.0
這篇文章有幫助嗎?

回報錯字、失效連結,或告訴我你想看的延伸主題。