node-gyp build fails obscurely if no Xcode or CLT are found
まだ誰も着手していません。
評価
- 難易度
- 2/5
- 見積もり時間
- 1〜3時間
- 初心者へのやさしさ
- 48/100
- issue の種類
- バグ
- 明瞭さ
- 明確に書かれている
- 活発さ
- 停滞
- 技術スタック
- node.js, python
- 領域
- build-system, devtools
調査の方向性
gyp/pylib/gyp/xcode_emulation.py の CLTVersion と XcodeVersion の呼び出し元から始め、issue に記載されている softwareupdate の履歴の経路に注目してください。Command Line Tools の出力がない場合の処理を確認し、バージョンがないケースで、捕捉されない AttributeError ではなく、意図されたユーザー向けエラーが生成されることを検証してください。
索引モデルが issue の本文から書いたものです。
説明
TL;DR macOS upgrades can cause a problem
Upgrading to a new major macOS after installing Xcode Command Line Tools (CLT), can remove the software update history line for the CLT, which breaks the XCode version finder in an obscure way.
Although my reported node-gyp version is [email protected], the version finder code is the same in v10.2.0.
[ Environment detail and npm verbose output is below ]
Issue detail
It appears that if you run a major macOS upgrade after installing the CLT, the CLT install can get wiped from the software update history. For example, running /usr/sbin/softwareupdate --history gave me only
Display Name Version Date
------------ ------- ----
macOS Sonoma 14.5 14.5 01/06/2024, 16:46:08
macOS Sonoma 14.6.1 14.6.1 22/08/2024, 11:35:14
even while running clang --version gave me
Apple clang version 15.0.0 (clang-1500.3.9.4)
Target: x86_64-apple-darwin23.6.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
and running sudo xcode-select -p gave me
/Library/Developer/CommandLineTools
The problem is that the XCode / CLT version finder looks first for XCode, then falls back to looking for the CLT. If the CLTVersion function doesn't find any output from /usr/sbin/softwareupdate --history that matches "Command Line Tools for Xcode", then line 1550 fails with an AttributeError that is uncaught.
File "/Users/Ian/Code/Skills/Opentrons/opentrons/node_modules/node-gyp/gyp/pylib/gyp/xcode_emulation.py", line 1551, in CLTVersion
return re.search(regex, output).groupdict()["version"]
AttributeError: 'NoneType' object has no attribute 'groupdict'
Potential solution
I believe changing the following line to except (GypError, AttributeError) would resolve the problem, because then the calling XcodeVersion function would raise No Xcode or CLT version detected!.
It would also be helpful to have a little more detail that explains the edge-case-by-upgrading, and that you might have the CLT installed, but we can't find it in the software update history.
Workaround
I resolved my issue by simply uninstalling and reinstalling the CLT. Uninstall with
sudo xcode-select -p
>> /Library/Developer/CommandLineTools
rm -rf /Library/Developer/CommandLineTools # Change this to match if it is a different path!
And then install with
sudo xcode-select --install
After the uninstall / reinstall, my software update history was fixed, and gyp ran happily:
Display Name Version Date
------------ ------- ----
macOS Sonoma 14.5 14.5 01/06/2024, 16:46:08
macOS Sonoma 14.6.1 14.6.1 22/08/2024, 11:35:14
Command Line Tools for Xcode 15.3 27/08/2024, 16:50:46
Environment details
Node Version:
node == v18.20.4
npm == 10.7.0
node-gyp == 9.4.1
Platform:
Darwin __.local 23.6.0
Darwin Kernel Version 23.6.0: Mon Jul 29 21:13:00 PDT 2024;
root:xnu-10063.141.2~1/RELEASE_X86_64 x86_64
Compiler:
Apple clang version 15.0.0 (clang-1500.3.9.4)
Target: x86_64-apple-darwin23.6.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
Module: bindings-cpp (this is just the first - any module will trigger the error)
NPM verbose output
npm verbose cli /Users/Ian/.nvs/node/18.20.4/x64/bin/node /Users/Ian/.nvs/node/18.20.4/x64/bin/npm
npm info using [email protected]
npm info using [email protected]
npm verbose title npm
npm verbose argv "--loglevel" "verbose"
npm verbose logfile logs-max:10 dir:/Users/Ian/.npm/_logs/2024-08-27T16_48_29_766Z-
npm verbose logfile /Users/Ian/.npm/_logs/2024-08-27T16_48_29_766Z-debug-0.log
- 主要言語
- Python
- スター
- 10.7k
- フォーク
- 1.9k
- 平均マージ
- 1日 4時間
- マージ済み PR(30日)
- 5
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
nodejs/node-gyp のほかの issue
-
dependencies github_actions
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
-
難易度 4/5 3〜5日 初心者へのやさしさ 48/100
-
難易度 4/5 3〜5日 初心者へのやさしさ 48/100
-
MSYS2
難易度 4/5 3〜5日 初心者へのやさしさ 35/100
-
難易度 4/5 3〜5日 初心者へのやさしさ 48/100
nodejs/node-gyp の issue をすべて見る
似ている issue
-
難易度 1/5 1時間未満 初心者へのやさしさ 75/100
-
hcocena オープンpolicies-accepted pre-review precheck-passed
難易度 1/5 1時間未満 初心者へのやさしさ 88/100
Bioconductor/BiocContributions#214 · コメント 5 件 ·
-
難易度 1/5 1時間未満 初心者へのやさしさ 92/100
TencentCloud/Octop#1169 · コメント 1 件 ·
-
難易度 2/5 1〜3時間 初心者へのやさしさ 70/100
521xueweihan/HelloGitHub#3778 ·
-
The version checker's trailing attribute region has no control for a less-than inside a quoted value オープンarea: dashboard area: tests bug perceived difficulty: 2 python
難易度 2/5 1〜3時間 初心者へのやさしさ 84/100
Nitjsefnie-Harness-Commons/daedalus#1105 · コメント 1 件 ·