Arbeitsverzeichnis für npm-Skripte ändern

82

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/ && ./configurefunktionieren würde auf UNIX-ähnlichen Systemen , aber nicht an den Fenstern.

Warum: Die Wurzel des Problems ist, dass der configureBefehl des Python-Repos Dateien in das Verzeichnis ausgibt, in dem es aufgerufen wird. Die Dateien sind jedoch für den Build relevant makeund make installsuchen nach den Dateien im Verzeichnis des Repos.

In diesem Fall kann ich das nicht ändern, Makefileda der Erstellungsprozess von Python verständlicherweise komplex ist.

Alternative: Die Alternative besteht wahrscheinlich darin, einige zu schreiben install.jsund 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 .

eljefedelrodeodeljefe
quelle
1
Ich glaube, es ist nichts Falsches daran, ein zusätzliches Skript zu schreiben und dieses ab npm auszuführen.
Webduvet
2
cd deps/2.7/cpython/ && ./configuresollte unter Windows funktionieren - auf welches Problem stoßen Sie?
Richard Williams
Mehrere. Sie können nicht verwenden ./configure --prefix=$(pwd)/somepath. Es ist nicht schön. Ich habe es noch nicht gefunden, verwende es aber npmwahrscheinlich var 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.
Eljefedelrodeodeljefe
2
Ich habe es mit einem ziemlich großen gelöst install.js , was ungefähr das tut und es wird package.jsonwie oben aufgerufen . Die API von child_processist jedoch nicht so einfach zu handhaben, da sie viele schwer zu debuggende Fehler durchläuft. Hat einige Zeit
gedauert
Verfasste eine PR hier
eljefedelrodeodeljefe

Antworten:

91

npmerlaubt nur zu tun cd dir && command -args, was auch unter Windows läuft.

Eine Änderung der nodeSpawn-Funktionalität wurde in PR https://github.com/npm/npm/pull/10958 vorgenommen , jedoch aufgrund der oben genannten Lösung abgelehnt.

eljefedelrodeodeljefe
quelle
1
Ich bin mir nicht sicher, ob ich etwas getan habe, habe aber kürzlich diese Pause in Windows gehabt.
6

Wie oben beschrieben:

npm verwendet wahrscheinlich

var spawn = require('child_process').spawn

Damit können Sie folgende Optionen festlegen:

    {cwd: pwd + 'somepath'}

aber macht es nicht sichtbar.

Ich habe es mit einem ziemlich großen gelöst install.js, was ungefähr das tut und es wird package.jsonwie oben aufgerufen . Die API von child_processist jedoch nicht so einfach zu handhaben, da sie viele schwer zu debuggende Fehler verursacht. Hat einige Zeit gedauert, aber ich bin jetzt glücklich.

Paul Sweatte
quelle
Rechte. Leider wurde es in der PR abgelehnt, wie in meiner Antwort angegeben.
eljefedelrodeodeljefe
ähnlich wie: stackoverflow.com/questions/18894433/… was auch für mich funktioniert
yeahdixon