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/ && ./configure
działałby na systemach typu UNIX, ale nie w systemie Windows.
Dlaczego: Problem polega na tym, że configure
polecenie repozytorium języka Python umieszcza pliki w katalogu, w którym jest wywoływane. Pliki są jednak odpowiednie dla kompilacji make
i make install
szukają plików w katalogu repozytorium.
W tym przypadku nie mogę zmienić, Makefile
ponieważ proces budowania Pythona jest zrozumiałe.
Alternatywa: Alternatywą jest prawdopodobnie napisanie części install.js
i 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.
node.js
npm
makefile
package.json
eljefedelrodeodeljefe
źródło
źródło
cd deps/2.7/cpython/ && ./configure
powinien działać w systemie Windows - jaki problem napotykasz?./configure --prefix=$(pwd)/somepath
. To nie jest ładne. Nie znalazłem go jeszcze, alenpm
prawdopodobnie używamvar 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.install.js
, który robi to z grubsza i jest wywoływanypackage.json
jak powyżej. Interfejs API programuchild_process
nie 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ęśliwyOdpowiedzi:
npm
pozwala tylko na tocd dir && command -args
, co będzie działać również w systemie Windows.W
node
PR https://github.com/npm/npm/pull/10958 wprowadzono zmianę w używaniu funkcji spawn , ale została odrzucona z powodu powyższego rozwiązania.źródło
Jak wspomniano wyżej:
var spawn = require('child_process').spawn
{cwd: pwd + 'somepath'}
źródło