Запустить скрипт (например, postinstall) после npm установки одного пакета? - PullRequest
4 голосов
/ 27 января 2020

Я начинаю играть с Snowpack. Он использует иной подход, чем Webpack, связывая отдельные пакеты сразу после их установки.

«Проблема» заключается в том, что при установке пакета мне сначала нужно запустить npm install --save my-package, а затем - вручную упаковать это с npx snowpack. В Snowpack docs упоминается, что я могу включить prepare сценарий, который snowpack будет все * после запуска npm install, но не относится к отдельным пакетам, только для обобщенного c npm install из всех зависимостей в моем package.json. Насколько я могу судить, так обстоит дело со всеми npm хуками, упомянутыми в npm документах .

. Есть ли способ автоматически запустить скрипт при установке индивидуальный пакет? Единственный способ, которым я могу придумать, - это переписать скрипт установки и добавить в него что-нибудь. Есть ли примеры этого на GitHub или где-либо еще?

Обновление: Для пояснения, я бы хотел запускать npx snowpack каждый раз, когда я устанавливаю новый пакет с --save, но желательно не с --save-dev или без --save. Это никогда не будет отличаться для любого пакета. Это будет определено c для определенного репо / проекта, не глобального в моей системе.

Недостаточно запустить snowpack после простого запуска npm install, как если бы вы подключились к postinstall или release. Кроме того, я хочу убедиться, что разработчики, работающие над моим проектом, могут использовать npm install --save newdep, как обычно, и тогда snowpack будет работать. Я не хочу, чтобы разработчики использовали собственный с именем скрипт.

Ответы [ 2 ]

2 голосов
/ 06 февраля 2020

Краткий ответ: К сожалению, 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 файлов запуска.

  1. Спецификация проекта 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
    }
    

    Примечание: Для лучшего понимания того, что этот файл делает, обратитесь к "Объяснение " раздел ниже.

  2. Файл ~/.bashrc:

    Для создания пользовательских логи c, т.е. npm функция в вышеупомянутом файле .bashrc, эффективная, необходимо настроить Bash для чтения вышеупомянутого "проекта, специфицированного c" .bashrc файла. Чтобы настроить это, добавьте следующую строку кода в ~/.bashrc:

    PROMPT_COMMAND='if [[ "$bashrc" != "$PWD" && "$PWD" != "$HOME" && -e .bashrc ]]; then bashrc="$PWD"; . .bashrc; fi'
    

    Примечание: Чтобы лучше понять, что эта строка кода ссылается на «Объяснение» * раздел 1099 * ниже.

  3. Файл ~/.bash_profile:

    Обычно ваш ~/.bash_profile содержит следующая строка кода для загрузки файла ~/.bashrc (или его разновидности):

    if [ -f ~/.bashrc ]; then . ~/.bashrc; fi
    

    Если его нет, его необходимо добавить к ~/.bash_profile.


Дополнительная информация.

Помощники по настройке / конфигурации:

Рассмотрим, как ваши разработчики используют следующие две команды для настройки своих Bash загрузочных файлов, в соответствии с вышеупомянутыми шагами два и три.

  1. Для второго шага выполните следующую команду:

    echo $'\n'"PROMPT_COMMAND='if [[ \"\$bashrc\" != \"\$PWD\" && \"\$PWD\" != \"\$HOME\" && -e .bashrc ]]; then bashrc=\"\$PWD\"; . .bashrc; fi'" >> ~/.bashrc
    

    Это добавит PROMPT_COMMAND=... строка кода к существующему файлу ~/.bashrc или создайте новый, если он еще не существует:

  2. Для третьего шага запустите следующую папку Благодаря команде добавить строку кода, необходимую в ~/.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

Примечание. Чтобы изменения вступили в силу, вам потребуется создать новый сеанс.


Пояснение

  1. Файл проекта 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, мы выполняем следующие задачи в его теле:

      1. Запускаем данную команду npm install --save ... как есть через строка, которая гласит:

        command npm "$@"
        
      2. Проверьте, существует ли команда 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 всегда будет существовать, поэтому сделайте вывод, что эта проверка не нужна.

      3. Если команда npx существует глобально, мы запускаем команду псевдо "postinstall" команда, то есть

        command npx snowpack
        
    • Когда условия, указанные в операторе if, НЕ выполнены, т.е. они false, пользователь, по сути, выполняет любую другую команду npm, отличную от npm install --save <pkg_name>. Поэтому в ветке else мы запускаем команду как есть:

      command npm "$@"
      
  2. Файл ~ / .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 для дальнейшей информации объяснение.

0 голосов
/ 04 февраля 2020

Я думаю, что лучше всего было бы создать новый скрипт, который выполняет желаемое действие. Что-то вроде следующих строк в вашем пакете. json:

{
  "scripts": {
    "snowpack-install" : "npm install --save && npx snowpack"
  }
}

Исправление

Вы можете фактически использовать опцию postinstall в пакете. json. После установки будет запущено «ПОСЛЕ установки пакета». Это будет выглядеть примерно так:

{
  "scripts": {
    "postinstall" : "npx snowpack"
  }
}
...