Установите CWD для NPM-скрипта, который запускает двоичный файл

#node.js #npm #npm-scripts #working-directory

#node.js #npm #npm-скрипты #рабочий каталог

Вопрос:

У меня есть суперпроект, в котором размещаются подпроекты и содержатся общие зависимости:

 super
  node_modules
    .bin
      foo-binary
      foo-binary.exe
    foo
  sub
    node_modules
    package.json
  package.json
 

Мне нужно иметь возможность вызывать foo либо как super сценарий NPM:

super/package.json

 "scripts": {
  "foo": "foo-binary" <-- should run with super/sub/ as CWD
}
 

В этом случае foo-binary выполняется с super/ CWD, в то время как он должен выполняться с. super/sub/ Использование cd приводит к кросс-платформенным проблемам; cd sub amp;amp; ..\node_modules\.bin\foo-binary с обратными косыми чертами работает в Windows, но не в операционных системах * nix, в то время cd sub amp;amp; ../node_modules/.bin/foo-binary как с косыми чертами не работает в Windows (протестировано в Windows 7):

«..» не распознается как внутренняя или внешняя команда, работоспособная программа или пакетный файл

Или мне нужно иметь возможность вызывать foo либо как super сценарий NPM:

super/sub/package.json

 "scripts": {
  "foo": "../node_modules/.bin/foo-binary"
}
 

В этом случае пути, зависящие от платформы, также не работают в Windows.

Существует несколько причин sub , по которым невозможно иметь foo собственную зависимость, одна из них заключается в том, что все подпроекты должны последовательно использовать одну и ту же foo версию и не занимать место несколькими foo копиями.

Как в этом случае можно установить текущий рабочий каталог, кроссплатформенный и предпочтительно без добавления пользовательских скриптов в проект?

Комментарии:

1. npmjs.com/package/run-script-os

2. @HolgerWill Спасибо, я буду иметь это в виду, но я надеюсь, что есть более простой способ.

3. @RobC Я обновил вопрос. С какой версией Windows вы его тестировали? Я пробовал это в Windows 7, но, возможно, это было исправлено позже cmd.exe .

4. Это была Vista , смею ли я это сказать 😉 Возможно, попробуйте заключить путь (в npm-script) в двойные кавычки, экранированные JSON "..." , т.Е., Например: "foo": "cd sub amp;amp; "../node_modules/.bin/foo-binary""

5. @RobC Спасибо, это все. Рассмотрите возможность публикации этого в качестве ответа, если вы не возражаете. Имеет смысл, что, поскольку Windows обрабатывает / как разделитель, нужны кавычки.

Ответ №1:

Заключите путь, который определен в вашем npm-скрипте, в двойные кавычки, экранированные JSON, т.е. "..." .

Например:

 "scripts": {
  "foo": "cd sub amp;amp; "../node_modules/.bin/foo-binary""
}
 

Теперь он будет успешно выполняться на разных платформах — через Windows cmd.exe и * nix sh .