Краткий ответ: К сожалению, npm не предоставляет никаких встроенных функций для удовлетворения ваших требований.
Хуки / сценарии жизненного цикла, такие как postinstall
вызываются только при выполнении команды generi c npm install
, а не когда кто-то запускает npm install --save <pkg_name>
на этапе разработки проектов.
Обходной путь: Попробуйте настроить logi c составной команды npm install --save
, существенно переопределив команду npm
на уровне оболочки.
Следующее решение, хотя и Bash один, описывает, как этот пользовательский лог c может быть актуализирован для определенных c проектов. Однако это решение зависит от следующих условий:
- Разработчики, работающие над вашим проектом, должны иметь для своей оболочки значение Bash при выполнении составной команды
npm install --save
. - Разработчики, работающие над вашим проектом, должны будут настроить свои Bash загрузочные файлы , а именно
~/.bashrc
и, возможно, ~/.bash_profile
. - Каталог проекта, т.е. Каталог проекта, для которого вы хотите, чтобы пользовательский лог c был эффективным, должен содержать пользовательский файл
.bashrc
.
Bash Решение:
Следующее для настройки проекта и операционной системы необходимо выполнить три шага, чтобы при запуске разработчиком npm install --save <pkg_name>
(или его разновидностей) впоследствии вызывалась команда npx snowpack
.
Примечание : Пункты два и три (ниже) - это задачи, которые разработчики должны выполнить (один раз) для настройки своих Bash файлов запуска.
Спецификация проекта c .bashrc
файл:
F сначала создайте следующий "файл спецификаций проекта c" .bashrc
в root каталога вашего проекта, т.е. сохраните его на том же уровне, на котором находится файл ваших проектов package.json
:
/some/path/to/my-project/.bashrc
npm() {
local name_badge="\x1b[37;40mpostinstall\x1b[0m"
array_includes() {
local word=$1
shift
for el in "$@"; do [[ "$el" == "$word" ]] && return 0; done
}
log_warn_message() {
local cmd_name=$1 warn_badge warn_mssg
warn_badge="\x1b[30;43mWARN!\x1b[0m"
warn_mssg="${cmd_name} command not found. Cannot run npx snowpack."
echo -e "\n${name_badge} ${warn_badge} ${warn_mssg}" >&2
}
log_run_message() {
echo -e "\n${name_badge} Running pseudo postinstall hook."
}
if [[ $* == "install "* || $* == "i "* ]] && array_includes --save "$@"; then
# 1. Run the given `npm install --save ...` command.
command npm "$@"
# 2. Check whether the `npx` command exists globally.
command -v npx >/dev/null 2>&1 || {
log_warn_message npx
return 1
}
log_run_message
# 3. Run the pseudo "postinstall" command.
command npx snowpack
else
# Run all other `npm` commands as per normal.
command npm "$@"
fi
}
Примечание: Для лучшего понимания того, что этот файл делает, обратитесь к "Объяснение " раздел ниже.
Файл ~/.bashrc
:
Для создания пользовательских логи c, т.е. npm
функция в вышеупомянутом файле .bashrc
, эффективная, необходимо настроить Bash для чтения вышеупомянутого "проекта, специфицированного c" .bashrc
файла. Чтобы настроить это, добавьте следующую строку кода в ~/.bashrc
:
PROMPT_COMMAND='if [[ "$bashrc" != "$PWD" && "$PWD" != "$HOME" && -e .bashrc ]]; then bashrc="$PWD"; . .bashrc; fi'
Примечание: Чтобы лучше понять, что эта строка кода ссылается на «Объяснение» * раздел 1099 * ниже.
Файл ~/.bash_profile
:
Обычно ваш ~/.bash_profile
содержит следующая строка кода для загрузки файла ~/.bashrc
(или его разновидности):
if [ -f ~/.bashrc ]; then . ~/.bashrc; fi
Если его нет, его необходимо добавить к ~/.bash_profile
.
Дополнительная информация.
Помощники по настройке / конфигурации:
Рассмотрим, как ваши разработчики используют следующие две команды для настройки своих Bash загрузочных файлов, в соответствии с вышеупомянутыми шагами два и три.
Для второго шага выполните следующую команду:
echo $'\n'"PROMPT_COMMAND='if [[ \"\$bashrc\" != \"\$PWD\" && \"\$PWD\" != \"\$HOME\" && -e .bashrc ]]; then bashrc=\"\$PWD\"; . .bashrc; fi'" >> ~/.bashrc
Это добавит PROMPT_COMMAND=...
строка кода к существующему файлу ~/.bashrc
или создайте новый, если он еще не существует:
Для третьего шага запустите следующую папку Благодаря команде добавить строку кода, необходимую в ~/.bash_profile
для загрузки файла ~/.bashrc
:
echo $'\n'"if [ -f ~/.bashrc ]; then . ~/.bashrc; fi" >> ~/.bash_profile
Настроена ли моя оболочка на Bash?
Чтобы проверить, настроена ли оболочка на Bash, вы можете создать новый сеанс, т.е. создать новое окно терминала и запустить:
echo $0
Если он печатает -bash
тогда он использует Bash.
Как мне настроить мою оболочку на Bash?
Если echo $0
не печатает -bash
, тогда вы ' Нужно поменять оболочку. Чтобы изменить его на Bash, запустите:
chsh -s /bin/bash
Примечание. Чтобы изменения вступили в силу, вам потребуется создать новый сеанс.
Пояснение
Файл проекта c .bashrc
файл:
Этот .bashrc
файл содержит функцию оболочки с именем npm
. Тело этой функции содержит лог c, необходимый для переопределения команды npm install|i --save
по умолчанию.
Условия, указанные в операторе if
, т. Е. Часть, которая читает;
if [[ $* == "install "* || $* == "i "* ]] && array_includes --save "$@"; then
...
fi
, по сути, читает специальный параметр $*
, чтобы проверить, начинаются ли аргументы, переданные в функцию npm
; install
, или его сокращенный эквивалент i
, и был ли передан параметр / аргумент --save
.
Чтобы проверить существование аргумента --save
, мы передаем специальный $@
параметр для функции array_includes
. Мы обрабатываем этот аргумент по-разному, потому что положение опции --save
в составной команде может отличаться. Например, пользователь может установить пакет, запустив это;
# Example showing `--save` option at the end
npm install <pkg_name> --save
или это (или какой-либо другой вариант):
# Example showing `--save` option in the middle
npm i --save <pkg_name>
Когда указаны условия в операторе if
, то есть они true
, мы выполняем следующие задачи в его теле:
Запускаем данную команду npm install --save ...
как есть через строка, которая гласит:
command npm "$@"
Проверьте, существует ли команда npx
глобально через часть, которая читает:
command -v npx >/dev/null 2>&1 || {
log_warn_message npx
return 1
}
Если команда npx
недоступно (глобально), мы предупреждаем пользователя, что команда npx snowpack
не может быть запущена, и return
из функции досрочно со статусом выхода 1
.
Примечание: Мой логик c в этой проверке предполагает, что вы будете устанавливать npx
во всем мире. Однако, если вы устанавливаете npm
локально в своем проекте, вам нужно изменить этот лог c. Возможно, проверив, существует ли ./node_modules/.bin/npx
вместо этого. Или вы можете быть уверены, что команда npx
всегда будет существовать, поэтому сделайте вывод, что эта проверка не нужна.
Если команда npx
существует глобально, мы запускаем команду псевдо "postinstall" команда, то есть
command npx snowpack
Когда условия, указанные в операторе if
, НЕ выполнены, т.е. они false
, пользователь, по сути, выполняет любую другую команду npm, отличную от npm install --save <pkg_name>
. Поэтому в ветке else
мы запускаем команду как есть:
command npm "$@"
Файл ~ / .bashr c:
В разделе 5.2 Bash Переменные справочного руководства "Bash" переменная PROMPT_COMMAND
описывается следующим образом:
PROMPT_COMMAND
Если установлено, значение интерпретируется как команда, выполняемая перед печатью каждого основного приглашения ($PS1
).
Итак, эта строка кода (здесь это снова):
PROMPT_COMMAND='if [[ "$bashrc" != "$PWD" && "$PWD" != "$HOME" && -e .bashrc ]]; then bashrc="$PWD"; . .bashrc; fi'
загружает "спецификацию проекта c" .bashrc
(если она существует), которая в свою очередь переопределяет * Команда 1290 * с функцией npm
. Это то, что по существу обеспечивает механизм для переопределения составной команды npm install --save
для определенных c проектов.
См. этот ответ на @Cyrus
для дальнейшей информации объяснение.