Передайте сообщение git commit в скрипт npm и добавьте к предопределенной строке

В проекте NPM я хотел бы иметь фиксацию для каждой версии сборки. Это позволит мне вернуться к текущей версии сборки, исправить ошибку, без необходимости проходить весь контроль качества новой версии.

Мы можем зафиксировать с помощью скриптов npm, подобных этому (см. этот ответ):

package.json

"scripts": {
  "git": "git add . && git commit -m",
}

Затем вызовите скрипт, запустив:

npm run git -- "Message of the commit"

Я хотел бы автоматизировать его запуск после сборки npm run. Для этого мы можем создать новую команду.

package.json

"scripts": {
  "buildAndCommit": "npm run build && git add . && git commit -m",
}

Это можно запустить с помощью npm run buildAndCommit -- "commit for a new build"

Единственное, что осталось, это то, что я хотел бы идентифицировать этот коммит как тот, который может быть связан с коммитом. Можно ли автоматически начать сообщение с "BUILD -" и добавить к этому уникальное сообщение, которое передается в командной строке? Что-то типа:

package.json

"scripts": {
  "buildAndCommit": "npm run build && git add . && git commit -'Build' + $uniqueMessageFromTheCommandLine`",
}

Если невозможно создать шаблон строки в package.json, как мне добиться этого с помощью сценария командной строки? (Powershell — мой инструмент командной строки).


person Ben Carp    schedule 02.04.2019    source источник
comment
Используя Powershell, возможно, проще запустить npm run buildAndCommit -- "BUILD - commit for a new build", т.е. включить префикс BUILD -. Однако работа на * nix решение, если оно довольно тривиально.   -  person RobC    schedule 03.04.2019
comment
Ради интереса, почему вы не хотите включать часть BUILD - в аргумент, передаваемый npm run buildAndCommit ?   -  person RobC    schedule 03.04.2019
comment
@RobC, спасибо! Это действительно полезно. Идея заключается в том, что процесс сборки отделен от процесса контроля версий. Каждая новая версия требует определенного контроля качества. Я стараюсь создавать новые функции в отдельной ветке. Но иногда я меняю код в главной ветке. Чем, если для живой версии требуется немедленный патч, который не может ждать, пока будет выпущена следующая версия. Хотелось бы вернуться к стабильной сборке, которая была протестирована, и просто изменить необходимое. Делает снезе?   -  person Ben Carp    schedule 03.04.2019
comment
Итак, является ли префикс BUILD - способом идентификации последней стабильной сборки, которая была протестирована?   -  person RobC    schedule 03.04.2019
comment
@RobC, да. Очевидно, что тестирование происходит после сборки, поэтому BUILD сам по себе не означает, что я могу идентифицировать его как проверенную версию. Но я все еще могу отличить его от других коммитов, и, надеюсь, это поможет мне очень близко подобрать конкретный коммит, который я ищу.   -  person Ben Carp    schedule 03.04.2019


Ответы (1)


Работает на платформах *nix

На платформе *nix npm по умолчанию использует sh для выполнения скриптов npm. В этом случае вы можете просто использовать функцию оболочки и ссылаться на аргумент сообщения git, переданный через интерфейс командной строки, с использованием $1 позиционного параметра< /а>.

Ваш скрипт npm будет переопределен следующим образом:

"scripts": {
  "build": "...",
  "buildAndCommit": "func() { npm run build && git add . && git commit -m \"BUILD - $1\"; }; func"
}

Кроссплатформенный

К сожалению, через Windows Powershell решение не такое простое и лаконичное.

При использовании Powershell npm по умолчанию использует cmd для выполнения скриптов npm. Точно так же npm использует cmd по умолчанию и в других консолях Windows, таких как Командная строка.

Один из способов выполнить ваше требование — вызвать node.js через ваш скрипт npm. Ниже приведены два разных метода, которые по существу одинаковы. Либо будет успешно работать кроссплатформенно (в вашем случае через Powershell).

Способ A – использование отдельного скрипта node.js

  1. Создайте следующий скрипт node.js. Назовем файл script.js и сохраним его в корне каталога проекта, то есть в том же каталоге, где находится package.json.

    script.js

    const execSync = require('child_process').execSync;
    const mssg = 'BUILD - ' + process.argv[2];
    execSync('npm run build && git add . && git commit -m \"' + mssg + '\"', { stdio:[0, 1, 2] });
    

    Пояснение

    • Встроенная функция node.js process.argv фиксирует аргумент в индексе два, то есть сообщение фиксации git, который был предоставлен через CLI. Сообщение коммита git объединяется с подстрокой BUILD - для формирования желаемого сообщения коммита. Результирующая строка присваивается переменной mssg.

    • Затем мы используем встроенный в node.js execSync() для выполнения заданного вами сценария npm. Как видите, значение переменной mssg используется в качестве сообщения коммита git.

    • Параметр stdio используется для обеспечения правильной конфигурации каналов, т. е. stdin, stdout, 'stderr', устанавливаются между родительским и дочерним процессами.

  2. Определите свой скрипт npm с именем buildAndCommit следующим образом:

    package.json

    "scripts": {
      "build": "...",
      "buildAndCommit": "node script"
    }
    

    Выше node вызывает script.js.

Метод Б. Встраивание скрипта node.js в скрипт npm

В качестве альтернативы, вышеупомянутый скрипт node.js (например, script.js) может быть встроен в ваш скрипт npm, что исключает использование отдельного файла .js.

package.json

"scripts": {
  "build": "...",
  "buildAndCommit": "node -e \"const mssg = 'BUILD - ' + process.argv[1]; require('child_process').execSync('npm run build && git add . && git commit -m \\\"' + mssg + '\\\"', { stdio:[0, 1, 2] })\""
}

Здесь используется тот же код из метода A, хотя и с небольшим рефакторингом. Заметные отличия:

  • Параметр командной строки nodejs -e используется для оценки встроенного JavaScript.
  • process.argv на этот раз захватит аргумент, т. е. сообщение фиксации git, по индексу один в массиве аргументов.
  • Необходимо дополнительное экранирование двойных кавычек, т.е. \\\"

Запуск скрипта npm

Используя Метод A или Метод B, запустите команду через интерфейс командной строки по желанию: Например:

$ npm run buildAndCommit -- "commit for a new build"

Это приведет к следующему сообщению git commit:

BUILD - commit for a new build

person RobC    schedule 03.04.2019