Вы действительно понимаете npm-скрипты?

NPM

Автор: Фэн Вэйяо

Гитхаб:tank0317

Мы все знакомы черезnpm run script-nameМожет быть выполнен в package.jsonscriptsСкрипт для настройки объекта. Тем не менее, вы можете не знать следующие знания.

Нижеnpm-scirptОтносится к package.jsonscriptsКоманда сценария, настроенная в .name-scirptОтносится к команде сценария с именем name.

Сценарии жизненного цикла/Пользовательские сценарии

когда мы используем командуnpm start, npm попытается выполнить package.jsonscriptsНастройте команды сценария запуска. Конфигурация по умолчанию для start-script"start": "node server.js". Итак, если в корневом каталоге есть файл server.js, тоnpm startБудет запускать код в server.js напрямую.

За исключением start-script , при использованииnpm startкоманда, npm также попытается включить в package.jsonscriptsВыясните, настроены ли команды предстартового и постстартового сценариев. Если настроены оба, npm выполнит сценарии в следующем порядке.

  • npm run prestart
  • npm run start
  • npm run poststart

похожий,npm test, npm restart, npm stopСоответствующие скрипты, настроенные в скриптах, будут выполняться вышеописанным образом. При этом npm пройдетnpm_lifecycle_eventПеременные среды определяют, в какой фазе (так называемом жизненном цикле) находится в данный момент. Например, на этапе выполнения скрипта перед запуском значением npm_lifecycle_event является «prestart», а на этапе запуска скрипта — «start», то есть package.json.scriptsИмя скрипта конфигурации объекта.

Выше приведена логика выполнения скрипта, соответствующая встроенной команде npm, которая нам наиболее знакома.пользовательский скрипт, действует та же логика. Например, мы настраиваем"build": "webpack --mode=production", при настройкеprebuildтак же какpostbuildСценарий, когдаnpm run build, prebuild-script, build-script и post-build-script также будут выполняться последовательно.

произвольный сценарий

Мы настраиваем команды скрипта, такие как"start": "node server.js",node server.jsОн будет передан в виде строки кода в SHELL системы для интерпретации и выполнения.Фактическая используемая оболочка SHELL может различаться в зависимости от системной платформы.В UNIX-подобных системах, таких как macOS или Linux, это относится к /bin/sh, а в Windows — к cmd.exe.

Поскольку он передается в SHELL для интерпретации и выполнения, это означает, что сконфигурированный сценарий может быть любой командой, которую можно запустить в SHELL, а не только сценариями узлов или программами js. То есть, если у вас в системе установлен python (или команду python можно найти в системной переменной PATH), вы также можете настроить скрипты как"myscript": "python xxx.py"

переменная среды

упоминалось выше с использованиемnpm run script-nameКоманда npm устанавливает переменную среды npm_lifecycle_event.На самом деле, npm также устанавливает множество переменных среды с помощью встроенных команд.npm run envВы можете просмотреть все переменные среды, установленные npm для среды выполнения скрипта.Все поля, установленные в package.json, будут установлены наnpm_package_Начало переменных среды. Если вы установите следующий пакет.

{
  "name": "npm-demo",
  "version": "1.0.0",
  "script": {
    "build": "webpack --mode=production"
  },
  "files": ["src"]
}

Затем вы можете получить npm_package_name, npm_package_version, npm_package_script_build, npm_package_files_0 и другие переменные. Обратите внимание, что каждое поле в объекте и массиве в package.json выше будет иметь соответствующие переменные среды.

Не только package.json, но и все конфигурации, связанные с npm.npm_config_переменные окружения в начале.

Кроме того, важно отметить, что даже если вы используете команду npm run в подкаталоге, скрипт будет выполняться в корневом каталоге проекта. Если вы хотите определить, где используется команда запуска npm, вы можете использовать переменную среды INIT_CWD, которая содержит абсолютный путь к каталогу, в котором была запущена команда запуска npm.

Как использовать эти переменные среды? Если ваш сценарий представляет собой сценарий оболочки, вы можете получить значение переменной непосредственно через соответствующее имя переменной среды.Если это сценарий узла, вы можете использовать глобальную переменную в nodejsprocess.envGet, например, чтобы получить номер версии проекта, вы можете использоватьprocess.env.npm_package_version.

PATH

Как упоминалось выше, перед выполнением npm-скрипта будут установлены некоторые переменные среды, одна из самых важных переменных среды — PATH. npm поместит проектnode_modules/.binДобавьте абсолютный путь к переменной окружения PATH. Таким образом, мы можем использовать некоторые инструменты командной строки, установленные локально в проекте в npm-скрипте. Сценарий сборки, как указано выше:"build": "webpack --mode=production".

Пока у нас локально установлен webpack, мы можемnode_modules/.binСм. исполняемый файл веб-пакета в пути. и потому, чтоnode_modules/.binПуть был добавлен в PATH, поэтому при запуске сценария он сможет найти команду webpack в PATH и без проблем выполнить ее.

Наконец, почему веб-пакет можно установить вnode_modules/.binНайти соответствующий исполняемый файл в пути? может просматриватьдокументы The Horse Plus.com/files/crackka…

Reference

docs.thathorseplus.com/handle/run-sichuan…

docs.thathorseplus.com/secretary/script…

документы The Horse Plus.com/files/crackka…