В: Можно ли изменить контекст, в котором npm запускает скрипты?
Я хочу следующее:
"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"
},
Очевидно, cd deps/2.7/cpython/ && ./configure
будет работать в UNIX-подобных системах, но не в Windows.
Почему: Корень проблемы в том, что configure
команда репозитория python выводит файлы в каталог, в котором она вызывается. Однако файлы соответствуют сборке make
и make install
ищут файлы в каталоге репо.
В этом случае я не могу изменить, Makefile
поскольку процесс сборки Python по понятным причинам сложен.
Альтернатива: альтернативой, вероятно, будет написать некоторые install.js
и использовать независимый от ОС API узла, а некоторые child_process.exec()
, что я, вероятно, сделаю. Однако было бы неплохо не покидать npm .
node.js
npm
makefile
package.json
Eljefedelrodeodeljefe
источник
источник
cd deps/2.7/cpython/ && ./configure
должен работать в Windows - с какой проблемой вы столкнулись?./configure --prefix=$(pwd)/somepath
. Это некрасиво. Я еще не нашел его, ноnpm
, вероятно, используюvar spawn = require('child_process').spawn
, что позволит вам установить такие параметры, как{cwd: pwd + 'somepath'}
, но не раскрывает его. Это тоже философия: управление пакетами обладает множеством функций, общих с инструментами сборки. Если они пойдут по этому пути, им также понадобятся определенные функции, подобные этой.install.js
, что примерно так, и он вызывается,package.json
как указано выше. Однако с API-интерфейсомchild_process
не так-то легко справиться, поскольку он проходит через множество трудных для отладки ошибок. МнеОтветы:
npm
позволяет только делатьcd dir && command -args
, что также будет работать в Windows.В
node
PR https://github.com/npm/npm/pull/10958 было внесено изменение в использование функции спауна , но оно было отклонено из-за вышеуказанного решения.источник
Как указано выше:
var spawn = require('child_process').spawn
{cwd: pwd + 'somepath'}
источник