ホーム チュートリアル カテゴリ Skills サイトについて
ZH EN JA KO
トラブルシューティング

pnpmでOpenClawをインストールする際のpostinstallスクリプト失敗の修正

· 9 分で読了

問題の説明

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など)をデフォルトでブロックするようになったためです。一部のパッケージ(sharpbetter-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
OpenClawは無料のオープンソースAIアシスタント。WhatsApp、Telegram、Discordなど多数のプラットフォームに対応