Macbook Air M2をセットアップ中の出来事になります。備忘録としてメモを残しておきます。
結論
- .npmがシンボリックリンクだった
- 移行アシスタントはシンボリックリンクは解決してくれない(そのまま移行する)ので注意
現象
npm i
を実行すると、何も出力せずに終わる。
% npm i yarn -g
%
npmはある(ホームディレクトリは ~ に置き換えています)。
% which npm
~/.nodenv/shims/npm
疑ったもの
nodenv
nodebrewにするも現象は変わらず。
M2
M1で普通に動いているけど。M2でまた何か特有の問題が起きているのかと思ったけれど、情報はなく。
調査
nodenvはコマンド実装が分かりづらかったので、結果的にnodebrewにしたのが解決につながったかも。nodenv
の npm はこれ(ホームディレクトリは ~ に置き換えています)。
#!/usr/bin/env bash
set -e
[ -n "$NODENV_DEBUG" ] && set -x
program="${0##*/}"
if [ "$program" = "node" ]; then
for arg; do
case "$arg" in
-e* | -- ) break ;;
*/* )
if [ -f "$arg" ]; then
export NODENV_DIR="${arg%/*}"
break
fi
;;
esac
done
fi
export NODENV_ROOT="~/.nodenv"
echo $program
echo $@
exec "/opt/homebrew/Cellar/nodenv/1.4.0/libexec/nodenv" exec "$program" "$@"
nodebrewのnpmはこれ。
% cat ~/.nodebrew/current/bin/npm
#!/usr/bin/env node
require('../lib/cli.js')(process)
ここから探っていって ~/.nodebrew/node/v18.7.0/lib/node_modules/npm/lib/npm.js
の load
関数で処理が終わっているのが分かったので、エラーを出してみる。
% npm i yarn -g
[Error: ENOENT: no such file or directory, mkdir '~/.npm'] {
errno: -2,
code: 'ENOENT',
syscall: 'mkdir',
path: '~/.npm'
}
ん? .npm …?
% ls -alt ~/.npm
lrwxr-xr-x 1 nakatsugawa staff 17 6 14 15:30 ~/.npm -> /Volumes/SSD/.npm
このディレクトリは移行前端末はストレージ不足で、外部ストレージを使っていたのでした…orz
ってことでディレクトリを改めて作成して解決。
% rm -Rf ~/.npm
% mkdir ~/.npm
% npm i yarn -g
added 1 package, and audited 2 packages in 1s
found 0 vulnerabilities
まとめ
原因が分かれば大した問題ではないのですが、原因とおぼしき場所が複数あると解決に時間がかかるという典型例でした。結果的にnodenvもM2も全く関係なかったので、誰の役に立つか分かりませんが。