Установите CWD для сценария 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 && ..\\node_modules\\.bin\\foo-binary с обратной косой чертой работает в Windows, но не в ОС *nix, а cd sub && ../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.

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


person Estus Flask    schedule 13.04.2019    source источник
comment
npmjs.com/package/run-script-os   -  person Holger Will    schedule 14.04.2019
comment
@HolgerWill Спасибо, я буду иметь это в виду, но надеюсь, что есть более простой способ.   -  person Estus Flask    schedule 14.04.2019
comment
@RobC Я обновил вопрос. С какой версией Windows вы его тестировали? Я пробовал это в Windows 7, но возможно, что это было исправлено в более позднем cmd.exe.   -  person Estus Flask    schedule 14.04.2019
comment
Это была Vista, осмелюсь сказать;) Может быть, попробовать обернуть путь (в npm-скрипте) с помощью экранированных двойных кавычек JSON, то есть \"...\". Например: "foo": "cd sub && \"../node_modules/.bin/foo-binary\""   -  person RobC    schedule 14.04.2019
comment
@RobC Спасибо, вот и все. Подумайте о том, чтобы опубликовать это как ответ, если вы не возражаете. Имеет смысл, поскольку Windows рассматривает / как разделитель, нужны кавычки.   -  person Estus Flask    schedule 14.04.2019


Ответы (1)


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

Например:

"scripts": {
  "foo": "cd sub && \"../node_modules/.bin/foo-binary\""
}

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

person RobC    schedule 14.04.2019