Npm: запускать скрипт postinstall только при установке в качестве зависимости - PullRequest
0 голосов
/ 16 января 2019

Я разработал пакет npm ("node_commons"), который включен в мой другой проект, например:

package.json (другой проект)

"node-commons": "git+ssh://git@stash.custom.domain.net:7999/npm/libs/node_commons.git"

Пакет node_commons написан на ES6, но эта версия позже не поддерживается, поэтому я использую скрипт postinstall для его переноса с помощью babel.

package.json (node_commons)

"postinstall": "babel src -d src"

Это отлично работает. Когда пакет включен в качестве зависимости в моем проекте, файлы передаются.

Моя проблема: при разработке пакета node_commons я использую npm install для установки внутренних зависимостей. Но тогда я не хочу это переносить. Я хочу перемещаться, только когда пакет установлен как зависимость (например, в моем другом проекте). Есть ли способ сделать это?

Примерно так:

package.json (node_commons)

"postinstall-as-dependency": "babel src -d src"

Ответы [ 2 ]

0 голосов
/ 12 июня 2019
  • Создать .no-postinstall файл в корне модуля.
  • Mac & Linux: Добавить следующее к package.json: "postinstall": "if [ ! -e .no-postinstall ]; then babel src -d src; fi"
  • Windows: Добавить следующее к package.json: "postinstall": if exist .no-postinstall () else (babel src -d src)"
  • Кроссплатформенность (дополнительная работа): Вы можете создать скрипт узла (т.е. ./my-script.js) и, используя модуль fs, проверить наличие .no-postinstall и выполнить babel src -d src, используя child_process.exec(), как описано в официальном документе здесь . Добавьте ваш скрипт в package.json: "postinstall": node my-script.js

Обратите внимание, что я использую Mac, поэтому не могу проверить версию Windows.

Объяснение

if [ ! -e .no-postinstall ] проверяет несуществование (с оператором отрицания !) данного файла. Если файл не существует, он выполняет ваш скрипт. Поскольку вы добавляете файл .no-postinstall в корень вашего модуля, скрипт не запускается при установке ваших внутренних модулей. С другой стороны, модули, устанавливающие ваш модуль как зависимость, не имеют файла .no-postinstall в своем корне, и ваш скрипт выполняется.

.no-postinstall не является специальным именем, вы можете использовать любое имя по вашему выбору.

0 голосов
/ 16 января 2019

Если я правильно понимаю, вы хотите, чтобы ваш пакет запускал сценарий postinstall, только если пользователь установил его как зависимость (npm install node-common)?

Когда ваш скрипт postinstall запускается, у него есть npm_config_save_dev, доступный для него, что является «истиной», когда пользователи устанавливают пакет с флагом --save-dev:

"postinstall": "! [ $npm_config_save_dev ] && echo \"Installed as a dependency\" || \"Installed as a dev dependency\""
...