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 .


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:



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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.