Q: npmがスクリプトを実行するコンテキストを変更することは可能ですか?
私がしたいことは次のとおりです:
"scripts": {
"test": "gulp mocha",
"pre-install": "./deps/2.7/cpython/configure --prefix=$(pwd)/build --exec-prefix=$(pwd)/build && make -C deps/2.7/cpython && make -C deps/2.7/cpython install",
"install": "node-gyp rebuild"
},
明らかにcd deps/2.7/cpython/ && ./configure
はUNIXライクなシステムでは機能しますが、Windowsでは機能しません。
理由:問題の根本は、pythonリポジトリのconfigure
コマンドが、呼び出されたディレクトリにファイルを出力することです。ただし、これらのファイルは、make
およびmake install
に関連するビルドです。これらは、リポジトリのディレクトリでファイルを検索します。
この場合、Pythonのビルドプロセスは理解できるほど複雑なので、Makefile
を変更することはできません。
代替案:代替案は、おそらくいくつかのinstall.js
を記述し、ノードのOSに依存しないAPIといくつかのchild_process.exec()
を使用することです。ただし、npmを残さないことは本当に素晴らしいことです。
npm
は、cd dir && command -args
のみを許可します。これはWindowsでも実行されます。
node
のスポーン機能を使用するための変更がPR https://github.com/npm/npm/pull/10958 で行われましたが、上記の解決策により拒否されました。
上記のように:
npmはおそらく使用しています
var spawn = require('child_process').spawn
次のようなオプションを設定できます。
{cwd: pwd + 'somepath'}
しかし、それを公開していません。
かなり大きな
install.js
で解決しましたが、これは大まかにそれを行い、上記のようにpackage.json
から呼び出されます。ただし、child_process
のAPIは、デバッグが難しいエラーを大量にスローするため、それほど簡単に処理できません。しばらく時間がかかりましたが、今は幸せです。