Как запустить скрипт 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, который вы запускаете, является файлом. Это не будет применяться во всех

Другие вопросы по тегам