npmスクリプトの作業ディレクトリを変更する


82

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では動作しません。

理由:問題の根本は、configurePythonリポジトリのコマンドが呼び出されたディレクトリにファイルを出力することです。ただし、ファイルはビルドに関連してmakeおりmake install、リポジトリのディレクトリでファイルを検索します。

この場合Makefile、Pythonのビルドプロセスは当然複雑なので、変更することはできません。

代替案:代替案は、おそらくいくつかを記述しinstall.js、ノードのOSに依存しないAPIといくつかを使用するchild_process.exec()ことです。これは、おそらく私が行うつもりです。ただし、npmを離れないのは本当にいいことです。


1
追加のスクリプトを作成してnpmから実行しても問題はないと思います。
webduvet 2015年

2
cd deps/2.7/cpython/ && ./configureWindowsで動作するはずです-どのような問題が発生しますか?
リチャードウィリアムズ

いくつか。は使用できません./configure --prefix=$(pwd)/somepath。かわいくないです。私はまだそれを見つけていませんが、npmおそらくを使用していますvar spawn = require('child_process').spawn。これにより{cwd: pwd + 'somepath'}、のようなオプションを設定できますが、公開されていません。それも哲学です。パッケージ管理には、ビルドツールと共通する機能がたくさんあります。彼らがこの道を行く場合、彼らはこのような特定の機能も持っている必要があります。
eljefedelrodeodeljefe 2015年

2
私はかなり大きなものでそれを解決しましたinstall.js 、それは大まかにそれをします、そしてそれはpackage.json上記のように呼び出されます。child_processただし、のAPIは、デバッグが難しいエラーを大量に処理するため、処理はそれほど簡単ではありません。しばらく時間がかかりましたが、今は幸せです
eljefedelrodeodeljefe 2015年

回答:


91

npmのみを許可cd dir && command -argsします。これはWindowsでも実行されます。

nodeのスポーン機能を使用するための変更がPRhttps ://github.com/npm/npm/pull/10958で行われましたが、上記の解決策のために拒否されました。


1
私が何かをしたかどうかはわかりませんが、最近Windowsでこの中断がありました。

6

上記のように:

npmはおそらく使用しています

var spawn = require('child_process').spawn

これにより、次のようなオプションを設定できます。

    {cwd: pwd + 'somepath'}

しかし、それを公開していません。

私はかなり大きなものでそれを解決しましたinstall.js、それは大まかにそれをします、そしてそれはpackage.json上記のように呼び出されます。child_processただし、のAPIは、デバッグが難しいエラーを大量にスローするため、処理はそれほど簡単ではありません。しばらく時間がかかりましたが、今は幸せです。


権利。残念ながら、私の回答に記載されているように、PRでは拒否されました。
eljefedelrodeodeljefe 2016年

に似ています: stackoverflow.com/questions/18894433/… これも私のために機能します
yeahdixon 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.