Змінити робочий каталог для сценаріїв 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-подібних системах, але не на вікнах.

Чому: Корінь проблеми полягає в тому, що configureкоманда репозиторію python виводить файли в каталог, де він викликається. Файли, однак, є відповідними для побудови makeта make installшукають файли в каталозі репозиторію.

У цьому випадку я не можу змінити, Makefileоскільки процес збірки Python, зрозуміло, складний.

Альтернатива: Альтернатива, ймовірно, це написання деяких install.jsта використання незалежного від ОС API вузла та деяких child_process.exec(), що я, мабуть, і зроблю. Однак не залишати npm було б дуже приємно.


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.

Зміни щодо використання nodeфункцій spawn були внесені в PR https://github.com/npm/npm/pull/10958 , але були відхилені через вищезазначене рішення.


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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.