Zmień katalog roboczy dla skryptów npm

82

P: Czy można zmienić kontekst, w którym npm uruchamia skrypty?

Chcę tego:

"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"
},

Oczywiście cd deps/2.7/cpython/ && ./configuredziałałby na systemach typu UNIX, ale nie w systemie Windows.

Dlaczego: Problem polega na tym, że configurepolecenie repozytorium języka Python umieszcza pliki w katalogu, w którym jest wywoływane. Pliki są jednak odpowiednie dla kompilacji makei make installszukają plików w katalogu repozytorium.

W tym przypadku nie mogę zmienić, Makefileponieważ proces budowania Pythona jest zrozumiałe.

Alternatywa: Alternatywą jest prawdopodobnie napisanie części install.jsi użycie niezależnego API od systemu operacyjnego węzła i innych child_process.exec(), co prawdopodobnie zrobię. Jednak nie opuszczanie npm byłoby naprawdę miłe.

eljefedelrodeodeljefe
źródło
1
Uważam, że nie ma nic złego w napisaniu dodatkowego skryptu i uruchomieniu go z npm.
webduvet
2
cd deps/2.7/cpython/ && ./configurepowinien działać w systemie Windows - jaki problem napotykasz?
Richard Williams
Kilka. Nie możesz użyć ./configure --prefix=$(pwd)/somepath. To nie jest ładne. Nie znalazłem go jeszcze, ale npmprawdopodobnie używam var spawn = require('child_process').spawn, co pozwoliłoby ci ustawić opcje, takie jak {cwd: pwd + 'somepath'}, ale nie ujawnia tego. To również filozofia: zarządzanie pakietami ma wiele funkcji, które mają wspólnego z narzędziami do budowania. Jeśli pójdą tą drogą, muszą również mieć pewne funkcje, takie jak ta.
eljefedelrodeodeljefe
2
Rozwiązałem to za pomocą dość dużego install.js , który robi to z grubsza i jest wywoływany package.jsonjak powyżej. Interfejs API programu child_processnie jest jednak łatwy w obsłudze, ponieważ zawiera wiele trudnych do debugowania błędów. Zajęło mi to trochę czasu, ale teraz jestem szczęśliwy
eljefedelrodeodeljefe
Napisałem PR tutaj
eljefedelrodeodeljefe

Odpowiedzi:

91

npmpozwala tylko na to cd dir && command -args, co będzie działać również w systemie Windows.

W nodePR https://github.com/npm/npm/pull/10958 wprowadzono zmianę w używaniu funkcji spawn , ale została odrzucona z powodu powyższego rozwiązania.

eljefedelrodeodeljefe
źródło
1
Nie jestem pewien, czy coś zrobiłem, ale ostatnio miałem tę przerwę w systemie Windows.
6

Jak wspomniano wyżej:

npm prawdopodobnie używa

var spawn = require('child_process').spawn

co pozwoliłoby ci ustawić opcje takie jak:

    {cwd: pwd + 'somepath'}

ale nie ujawnia tego.

Rozwiązałem to za pomocą dość dużego install.js, który robi to z grubsza i jest wywoływany package.jsonjak powyżej. Interfejs API programu child_processnie jest jednak łatwy w obsłudze, ponieważ generuje mnóstwo trudnych do debugowania błędów. Zajęło mi to trochę czasu, ale teraz jestem szczęśliwy.

Paul Sweatte
źródło
Prawa. Niestety został odrzucony w PR, jak napisałem w mojej odpowiedzi.
eljefedelrodeodeljefe
podobny do: stackoverflow.com/questions/18894433/… który też działa dla mnie
yeahdixon