Как передать текущее время в сценарии npm для сообщения git commit в Windows и кроссплатформенности? - PullRequest
0 голосов
/ 06 марта 2019

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

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

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

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

вместо

Выпуск от 03.06.2009 11: 43: 57

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

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

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

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

1 Ответ

0 голосов
/ 06 марта 2019

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

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

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

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

  • Использование сценария nodejs для shell-out ваших 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 ::

    deploy.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 в обычном режиме, запустив через CLI следующее:

    npm run deploy
    

Объяснение:

  • В deploy.js нам требуется пакет moment и встроенный в nodejs execSync().
  • .текущую дату / время мы вызываем moment() и вызываем его метод format(), чтобы соответствовать вашему заданному форматированию, т.е. MM/DD/YYYY HH:mm:ss.
  • Мы тогда shell-out ваши cd и git сс помощью execSync.Ссылка на дату / время предоставляется в части сообщения git с использованием литералов шаблона , то есть ${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.
...