F: Ist es möglich, den Kontext zu ändern, in dem npm Skripte ausführt?
Was ich möchte, ist Folgendes:
"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"
},
Offensichtlich cd deps/2.7/cpython/ && ./configure
funktionieren würde auf UNIX-ähnlichen Systemen , aber nicht an den Fenstern.
Warum: Die Wurzel des Problems ist, dass der configure
Befehl des Python-Repos Dateien in das Verzeichnis ausgibt, in dem es aufgerufen wird. Die Dateien sind jedoch für den Build relevant make
und make install
suchen nach den Dateien im Verzeichnis des Repos.
In diesem Fall kann ich das nicht ändern, Makefile
da der Erstellungsprozess von Python verständlicherweise komplex ist.
Alternative: Die Alternative besteht wahrscheinlich darin, einige zu schreiben install.js
und die betriebssystemunabhängige API des Knotens zu verwenden, und einige child_process.exec()
, was ich wahrscheinlich tun werde. Es wäre jedoch sehr schön , npm nicht zu verlassen .
quelle
cd deps/2.7/cpython/ && ./configure
sollte unter Windows funktionieren - auf welches Problem stoßen Sie?./configure --prefix=$(pwd)/somepath
. Es ist nicht schön. Ich habe es noch nicht gefunden, verwende es abernpm
wahrscheinlichvar spawn = require('child_process').spawn
, wodurch Sie Optionen wie festlegen können{cwd: pwd + 'somepath'}
, es aber nicht verfügbar machen. Es ist auch eine Philosophie: Die Paketverwaltung verfügt über eine Vielzahl von Funktionen, die sie mit Build-Tools gemeinsam haben. Wenn sie diesen Weg gehen, müssen sie auch bestimmte Funktionen wie diese haben.install.js
, was ungefähr das tut und es wirdpackage.json
wie oben aufgerufen . Die API vonchild_process
ist jedoch nicht so einfach zu handhaben, da sie viele schwer zu debuggende Fehler durchläuft. Hat einige ZeitAntworten:
npm
erlaubt nur zu tuncd dir && command -args
, was auch unter Windows läuft.Eine Änderung der
node
Spawn-Funktionalität wurde in PR https://github.com/npm/npm/pull/10958 vorgenommen , jedoch aufgrund der oben genannten Lösung abgelehnt.quelle
Wie oben beschrieben:
var spawn = require('child_process').spawn
{cwd: pwd + 'somepath'}
quelle