Изменить рабочий каталог для сценариев npm

82

В: Можно ли изменить контекст, в котором 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 .

Eljefedelrodeodeljefe
источник
1
Я считаю, что нет ничего плохого в том, чтобы написать дополнительный скрипт и запустить его из npm.
webduvet
2
cd deps/2.7/cpython/ && ./configureдолжен работать в Windows - с какой проблемой вы столкнулись?
Ричард Уильямс,
Несколько. Вы не можете использовать ./configure --prefix=$(pwd)/somepath. Это некрасиво. Я еще не нашел его, но npm, вероятно, использую var spawn = require('child_process').spawn, что позволит вам установить такие параметры, как {cwd: pwd + 'somepath'}, но не раскрывает его. Это тоже философия: управление пакетами обладает множеством функций, общих с инструментами сборки. Если они пойдут по этому пути, им также понадобятся определенные функции, подобные этой.
eljefedelrodeodeljefe
2
Я решил это с помощью довольно большого install.js , что примерно так, и он вызывается, package.jsonкак указано выше. Однако с API-интерфейсом child_processне так-то легко справиться, поскольку он проходит через множество трудных для отладки ошибок. Мне
потребовалось
Автор пиара здесь
eljefedelrodeodeljefe

Ответы:

91

npmпозволяет только делать cd dir && command -args, что также будет работать в Windows.

В nodePR https://github.com/npm/npm/pull/10958 было внесено изменение в использование функции спауна , но оно было отклонено из-за вышеуказанного решения.

Eljefedelrodeodeljefe
источник
1
Не уверен, что я что-то сделал, но недавно в Windows произошел перерыв.
6

Как указано выше:

npm, вероятно, использует

var spawn = require('child_process').spawn

что позволит вам установить такие параметры, как:

    {cwd: pwd + 'somepath'}

но не раскрывает это.

Я решил это с помощью довольно большого install.js, что примерно так, и он вызывается, package.jsonкак указано выше. Однако с API-интерфейсом child_processне так-то легко справиться, поскольку он создает множество сложных для отладки ошибок. Мне потребовалось время, но теперь я счастлив.

Пол Свитт
источник
Человека. К сожалению, он был отклонен в PR, как отмечалось в моем ответе.
eljefedelrodeodeljefe
похоже на: stackoverflow.com/questions/18894433/… который тоже работает для меня
yeahdixon