Передайте сообщение git commit в скрипт npm и добавьте в предопределенную строку - PullRequest
0 голосов
/ 02 апреля 2019

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

Мы можем зафиксировать, используя npm-скрипты, подобные этому ( смотри этот ответ ):

package.json

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

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

npm run git -- "Message of the commit"

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

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 - мой инструмент командной строки).

1 Ответ

1 голос
/ 03 апреля 2019

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

На * nix платформа npm по умолчанию использует sh для выполнения сценария (ов) npm.В этом сценарии вы можете просто использовать функцию оболочки и ссылаться на аргумент git-сообщения, передаваемый через CLI, используя позиционный параметр $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 commit, которое было предоставлено через CLI.Сообщение git commit объединяется с подстрокой BUILD -, чтобы сформировать желаемое сообщение commit.Результирующая строка присваивается переменной mssg.

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

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

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

    package.json

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

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

Метод B - встроить скрипт 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 commit, по индексу 1 в массиве аргументов.
  • Необходимо дополнительное экранирование двойных кавычек, т. е. \\\"

Запуск сценария npm

Использование Метод A или Метод B Запустите команду через CLI по желанию: Например:

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

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

BUILD - commit for a new build

...