Каковы альтернативные способы написания bash-скрипта для обновления зависимостей проекта? - PullRequest
0 голосов
/ 08 июля 2019

Я написал скрипт, который обновляет зависимости проекта (только миноры и патчи).Я хотел автоматизировать процесс обновления, так как все версии точны, и, насколько я знаю, нет никакого способа намекнуть npm update, что я хочу поднять все, независимо от того.

Одним словом, требуется выводработает npm outdated, создает список пакетов в соответствии с критериями и передает его в npm install в самом конце.Все работает так, как задумано, однако мне было интересно, можно ли написать его более кратко, например, без создания временного текстового файла?Я также ищу некоторые общие отзывы.

PS Я только начинаю со сценариев bash, поэтому, пожалуйста, избавьте меня: D Ваш совет очень ценится!

Вот примервывод npm outdated:

Package                          Current  Wanted  Latest  Location
@commitlint/cli                    7.5.0   .....   8.0.0    .....
@commitlint/config-conventional    7.5.0   .....   8.0.0    .....
eslint                            5.13.0   .....   6.0.1    .....
eslint-plugin-jsx-a11y             6.2.0   .....   6.2.3    .....
eslint-plugin-react               7.12.4   .....  7.14.2    .....
eslint-plugin-react-hooks          1.6.0   .....   1.6.1    .....

Вот код:

# Temporary file to hold output of `npm outdated` command
OUTPUT=updates.log
PACKAGES_TO_UPDATE=()

function get_major_version { echo $(echo $1 | grep -o -E '^[0-9]{1,2}'); }

# /1079371/kak-ya-mogu-obedinit-elementy-massiva-v-bash
function join_by { local d=$1; shift; echo -n "$1"; shift; printf "%s" "${@/#/$d}"; }

# Redirect output once.
{
  npm outdated
} > $OUTPUT

wait

{
  # Skip first line as it contains column headers.
  read

  while read package current wanted latest location
    do
      # Filter out major updates.
      if [ "$(get_major_version $current)" = "$(get_major_version $latest)" ]; then
        PACKAGES_TO_UPDATE+=("${package}@latest")
      fi
  done
} < $OUTPUT

npm install "${PACKAGES_TO_UPDATE[@]}"

rm $OUTPUT

1 Ответ

1 голос
/ 08 июля 2019

Используйте Подстановка процесса , чтобы получить более краткий синтаксис:

PACKAGES_TO_UPDATE=()

function get_major_version { echo $(echo $1 | grep -o -E '^[0-9]{1,2}'); }
function join_by { local d=$1; shift; echo -n "$1"; shift; printf "%s" "${@/#/$d}"; }

while read package current wanted latest location; do
  if [ "$(get_major_version $current)" = "$(get_major_version $latest)" ]; then
    PACKAGES_TO_UPDATE+=("${package}@latest")
  fi
done < <(npm outdated|awk 'NR>1')

npm install "${PACKAGES_TO_UPDATE[@]}"

От bash man :

  Process Substitution
       Process substitution is supported on systems that support named pipes  (FIFOs)  or  the  /dev/fd
       method  of naming open files.  It takes the form of <(list) or >(list).  The process list is run
       with its input or output connected to a FIFO or some file in /dev/fd.  The name of this file  is
       passed  as  an  argument  to the current command as the result of the expansion.  If the >(list)
       form is used, writing to the file will provide input for list.  If the <(list) form is used, the
       file passed as an argument should be read to obtain the output of list.

Пояснение

  • npm outdated|awk 'NR>1': здесь мы передаем вывод от npm outdated до awk, что, в свою очередь, обрезает нежелательные заголовки ('NR>1' означаетначните чтение со второй строки), чтобы мы могли избежать лишних read.Давайте псевдоним это как input_process .

  • <(input_process): процесс выполняется и его выходные данные передаются в цикл while read, используя ту же механику, что и при чтении файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...