問題の説明
pnpmでOpenClawをグローバルインストールすると、postinstallスクリプトが実行されなかったという警告やエラーが表示されます。
$ pnpm add -g openclaw
WARN Lifecycle script `postinstall` of package `[email protected]` was blocked by pnpm.
WARN Lifecycle script `postinstall` of package `[email protected]` was blocked by pnpm.
WARN To allow scripts from packages, run:
WARN pnpm approve-builds -g
インストールは完了したように見えますが、openclaw start を実行するとエラーが発生します。
Error: Cannot find module '../build/Release/sharp-linux-x64.node'
または:
Error: Could not locate the bindings file. Tried:
→ /path/to/better-sqlite3/build/better_sqlite3.node
これは、v9以降pnpmがセキュリティ向上のためにライフサイクルスクリプト(postinstallなど)をデフォルトでブロックするようになったためです。一部のパッケージ(sharpやbetter-sqlite3など)は、postinstallフェーズでプリコンパイルされたネイティブバイナリのダウンロードやローカルコンパイルを行う必要があります。スクリプトがブロックされると、これらのパッケージは正しく機能しません。
根本原因
pnpmのセキュリティポリシーは、悪意のあるパッケージがインストール中に危険なスクリプトを実行するのを防ぐように設計されています。しかし、OpenClawが依存する一部の正当なパッケージは、実際にpostinstallスクリプトの実行が必要です。
- sharp:postinstallでプラットフォーム固有のプリコンパイルされたlibvipsバイナリをダウンロード
- better-sqlite3:postinstallでネイティブSQLiteバインディングをコンパイルまたはダウンロード
- @napi-rsパッケージ:postinstallでRustコンパイルされたネイティブモジュールをダウンロード
これらのスクリプトが実行されないと、対応するネイティブモジュールが正しくインストールされず、実行時に「バイナリが見つかりません」エラーが発生します。
解決方法
方法1:pnpm approve-buildsを使用する(推奨)
pnpmは特定のパッケージのビルドスクリプトを明示的に承認するためのapprove-buildsコマンドを提供しています。グローバルインストールの場合:
pnpm approve-builds -g
実行すると、pnpmはブロックされたすべてのパッケージとそのスクリプトの内容を一覧表示し、それぞれを確認できます。
? Allow build scripts for the following packages?
[email protected] (postinstall: node install/sharp)
[email protected] (postinstall: prebuild-install -r napi || node-gyp rebuild)
✔ [email protected]
✔ [email protected]
承認するパッケージを選択すると、pnpmがそのpostinstallスクリプトを再実行します。
承認後、すべてのネイティブモジュールが正しくビルドされるようにOpenClawを再インストールしてください。
pnpm add -g openclaw
方法2:インストール時にスクリプト実行を許可する
OpenClawとその依存関係を信頼している場合は、--unsafe-permフラグを使用してインストール時のスクリプト実行を許可できます。
pnpm add -g openclaw --unsafe-perm
または、特定のパッケージからのビルドスクリプトをグローバルに許可するようにpnpmを設定します。
pnpm config set approve-builds-automatically true -g
注意:approve-builds-automaticallyはすべてのパッケージのビルドスクリプトを自動的に承認するため、セキュリティが低下します。インストールされたすべてのパッケージを信頼している場合のみ使用してください。
方法3:.pnpmfile.cjs設定を使用する
OpenClaw関連のパッケージのビルドスクリプトを事前に承認するグローバルpnpm設定を作成します。
まず、pnpmのグローバル設定ディレクトリを確認します。
pnpm config get global-dir
そのディレクトリに.pnpmfile.cjsを作成または編集します。
module.exports = {
hooks: {
readPackage(pkg) {
// これらのパッケージにビルドスクリプトの実行を許可する
const allowedPackages = ['sharp', 'better-sqlite3', '@napi-rs'];
if (allowedPackages.some(name => pkg.name.includes(name))) {
pkg.allowBuild = true;
}
return pkg;
}
}
};
方法4:npmでインストールに切り替える
pnpmのビルドスクリプト管理が継続的に問題を引き起こす場合は、グローバルインストールにnpmの使用を検討してください。npmはデフォルトでpostinstallスクリプトの実行を許可します。
npm install -g openclaw
プロジェクトにはpnpmを使い続けることができます。OpenClawのグローバルツールだけをnpmでインストールするだけです。両者は競合しません。
方法5:手動でビルドをトリガーする
OpenClawがすでにインストールされているがネイティブモジュールがビルドされていない場合、手動でリビルドをトリガーできます。
pnpm rebuild -g
これにより、グローバルパッケージのすべてのビルドスクリプトが再実行されます。一部のパッケージがまだブロックされている場合は、リビルドの前にpnpm approve-builds -gを実行してください。
特定のパッケージのみをリビルドすることもできます。
pnpm rebuild -g sharp
pnpm rebuild -g better-sqlite3
修正の確認
ネイティブモジュールが正しくビルドされたことを確認します。
# sharpの確認
node -e "require('sharp')" && echo "sharp OK" || echo "sharp FAILED"
# better-sqlite3の確認
node -e "require('better-sqlite3')" && echo "sqlite OK" || echo "sqlite FAILED"
OpenClawの環境チェックを実行します。
openclaw doctor
すべてのチェックに合格したら、サービスを起動します。
openclaw start
予防のヒント
将来OpenClawを更新する際に同じ問題を避けるために、最初の解決後に承認レコードを永続化することをお勧めします。pnpmは承認済みパッケージのリストをグローバル設定に保存し、以降のインストールや更新では承認済みパッケージのビルドスクリプトの実行を自動的に許可します。
現在の承認済みビルドリストを確認します。
pnpm audit --fix -g
pnpm approve-builds -g --list
pnpmを定期的に最新版に更新してください。新しいバージョンではビルドスクリプト管理が改善されている場合があります。
pnpm self-update