Как передать текущую дату и время в скрипте npm для сообщения git commit в Windows и на разных платформах?

Я работаю в Windows 10 и пытаюсь использовать скрипт npm для git commit с сообщением, которое включает дату и время фиксации:

"deploy": "cd dist && git add . && git commit -m \"Release at $(date)\" && git push"

Результирующее сообщение git commit

Релиз в $(дата)

вместо

Релиз 06.03.2019 11:43:57

что я получаю при запуске в терминале той же команды:

git commit -m "Release at $(date)"

Что такое кроссплатформенное решение?

Можете ли вы объяснить, что вызывает разные результаты?


person ChrisK    schedule 06.03.2019    source источник
comment
Возможно, это поможет . Это баш-решение. Вы можете запустить bash на окнах   -  person clmno    schedule 06.03.2019
comment
Я пробовал: deploy: cd dist && git add -A; timestamp=$(date \+%s\) && git commit -m \Release at $timestamp\ && git push, но я получаю сообщение об ошибке: неизвестный переключатель `;'   -  person ChrisK    schedule 06.03.2019
comment
Вы должны использовать bash shell. Проверьте это из. Я думаю, что git-bash, тот, который вы получили при установке git, может запускать скрипты bash.   -  person clmno    schedule 06.03.2019


Ответы (1)


Кросс-платформенная совместимость не может быть реализована с помощью команды оболочки date, которая доступен на платформах *nix. Это связано с тем, что команда Windows/cmd.exe DATE ведет себя иначе. Различия:

  • Команда *nix date печатает дату/время.
  • Команда Windows/cmd.exe DATE предлагает пользователю установить системную дату/время.

Также подстановка команд, т.е. часть $(...) является bash функция, присутствующая в большинстве оболочек * nix - она ​​не будет работать через Windows cmd.exe.

Для кроссплатформенного решения (т. е. того, которое успешно работает в Windows, Linux и macOS...) рассмотрите следующий подход:

  • Используйте скрипт nodejs для оболочки ваших команд cd и git с помощью встроенных execSync().
  • Получите дату с помощью пакета moment или, альтернативно, с помощью JavaScript Date() объект, похожий на этот ответ вместо этого.
  • Вызовите скрипт nodejs из раздела scripts файла package.json.

Решение:

Есть несколько различных способов приблизиться к этому, как описано в следующих двух подразделах под названием:

  • Использование внешнего файла nodejs (.js)
  • Встраивание вашего JavaScript в package.json.

Примечание. оба подхода дают одинаковый желаемый результат.

Использование внешнего файла nodejs (.js)

  1. Следующее использует moment для получения даты. Чтобы установить это, выполните следующую команду в каталоге вашего проекта:

    npm i -D moment
    
  2. Создайте скрипт nodejs следующим образом, назовите файл deploy.js и сохраните его в корне каталога вашего проекта, то есть в том же каталоге, где в настоящее время находится package.json ::

    развертывание.js

    const moment = require('moment');
    const execSync = require('child_process').execSync;
    
    const dateTime = moment().format('MM/DD/YYYY HH:mm:ss');
    
    execSync(`cd dist && git add . && git commit -m \"Release at ${dateTime}\" && git push`, { stdio: [0, 1, 2]} );
    
  3. В разделе scripts файла package.json замените текущий скрипт deploy следующим:

    package.json

    "scripts": {
      "deploy": "node deploy"
    }
    
  4. Вызовите скрипт npm deploy как обычно, запустив через интерфейс командной строки следующее:

    npm run deploy
    

Пояснение:

  • В deploy.js нам требуется пакет moment и встроенный пакет nodejs execSync().
  • Чтобы получить текущую дату/время, мы вызываем moment() и вызываем его метод format() в соответствии с вашим задано форматирование, т.е. MM/DD/YYYY HH:mm:ss.
  • Затем мы обрабатываем ваши cd и gitкоманды с помощью execSync. Ссылка на дату/время предоставляется в части сообщения git с использованием Литералы шаблонов, ie${dateTime}
  • Параметр options.stdio настраивает каналы между родительским и дочерним процессами — [0, 1, 2] эффективно наследует stdin, stdout и stderr.

Встраивание вашего JavaScript в package.json.

Кроме того, вы можете встроить свой код nodejs/JavaScript в раздел scripts файла package.json.

  1. В разделе скриптов файла package.json замените текущий скрипт deploy следующим:

    package.json

    "scripts": {
      "deploy": "node -e \"const dateTime = require('moment')().format('MM/DD/YYYY HH:mm:ss'); require('child_process').execSync(`cd dist && git add . && git commit -m \"Release at ${dateTime}\" && git push`, { stdio: [0, 1, 2]} );\""
    }
    

Пояснение:

  • Фактически это то же самое, что и вышеупомянутое решение, в котором использовался отдельный файл .js (хотя и с небольшим рефакторингом). Использование отдельного скрипта/файла nodejs теперь излишне.
  • Параметр командной строки nodejs -e используется для оценки встроенного JavaScript.
person RobC    schedule 06.03.2019