Как запустить скрипт npm зависимого пакета
У меня есть пакет, в котором есть скрипт package.json
что я хотел бы иметь возможность работать в моем проекте верхнего уровня. Этот пакет является одной из моих зависимостей от проектов верхнего уровня. Я ищу способ прямо или косвенно вызвать скрипт пакетов зависимостей.
Давайте предположим, что имя модуля, с которым я работаю, называется foo
и скрипт, который я хочу запустить updateFooData
,
Я пытался использовать синтаксис npm run-script <package> <...>
чтобы запустить его, но это кажется устаревшей функциональностью, так как я не могу найти его в текущей официальной документации, но вижу в других (очень старых) результатах поиска.
npm run-script foo updateFooData
# npm ERR! missing script: foo
Я также посмотрел на API нпм и в то время как npm.commands.run-script(args, callback)
будет делать то, что я хочу, я не могу понять, как загрузить модуль в npm
{
...
"scripts":{
"foo:updateFooData": "node --eval \"... ??; npm.commands.run-script('updateFooData', callback)\""
}
}
npm run foo:updateFooData
# Obviously fails
Единственное, что я нашел, что работает до сих пор - это CD в каталог submodule и запуск оттуда npm. Это не предпочтительное решение для меня.
cd node_modules/foo
npm run updateFooData
2 ответа
Я столкнулся с этим, пытаясь запустить скрипт updatedb для geoip-lite. Вы должны использовать команду npm explore, которая вызовет новую оболочку в каталоге зависимостей.
Так что для вашего случая использования попробуйте npm explore foo -- npm run updateFooData
Замечания:
Это не очень хорошая идея. У вас нет гарантии, в какой модуль папки node_modules будет установлен, поскольку NPM попытается оптимизировать пространство путем установки общих пакетов на максимально возможном уровне. - @superluminary
Что-то, что я нашел, что работает:
Если запущенный скрипт запускает файл скрипта, вы можете посмотреть путь к файлу, который он запускает, и запустить скрипт, используя require:
# if node_modules/foo/package.json looks like this
{
"scripts": {
"updateFooData":"scripts/updateFooData.js"
}
}
# then package.json can look like this
{
"scripts": {
"foo:updateFooData":"node --eval \"require('foo/scripts/updateFooData.js')\""
}
}
# or package.json can look like this
{
"scripts": {
"foo:updateFooData":"node node_modules/foo/scripts/updateFooData.js"
}
}
# and you can run it like this
npm run foo:updateFooData
Мне не нравится это решение, потому что оно работает, только если скрипт npm, который вы запускаете, является файлом. Это не будет применяться во всех