#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
.