Windows Solution (cmd.exe)
Эквивалент этого build
сценария, запущенного с помощью Командная строка или PowerShell в Windows:
"scripts": {
"build": "rd /s/q \"deployment/static\" 2> nul & react-scripts build && md \"deployment/static\" && move \"build\" \"deployment/static\""
}
Объяснение:
- Эквивалент
rm-rf
для Windows (cmd.exe) составляет rd /s/q
mv
эквивалент для Windows (cmd.exe) равен move
Все пути к каталогам заключены в экранированные двойные кавычки \"...\"
.Например,
deployment/static
было переписано как \"deployment/static\"
.
Хотя экранированные двойные кавычки не являются полностью необходимыми в этом сценарии, это хорошая практика и необходимо делать это, когда пути могут включатьпробелы или знаки пунктуации.
Точка с запятой ;
заменена одним оператором &
, чтобы обеспечить выполнение части react-script build
независимо от того, является ли начальный rd /s/q ...
Сбой или успех команды.
При использовании rd
для удаления папки / пути, которые могут не существовать, на консоль выводится следующее сообщение об ошибке:
Системе не удается найти указанный путь
Чтобы предотвратить потенциальную печать этого сообщения об ошибке на консоли, мы перенаправляем сообщение об ошибке на NUL
, используя 2> nul
part.
- Часть
md \"deployment/static\"
использует команду Windows md
для создания каталога static
, что очень похоже на команду mkdir
в bash.
Примечание: Приведенный выше синтаксис не будет работать в операционных системах nix , таких как macOS и Linux.
Кроссплатформенное решение (Windows / Linux /macOS ...)
Чтобы создать кроссплатформенное решение (то есть то, которое успешно работает в Windows, Linux и macOS), я предлагаю написать два служебных скрипта Nodejs вместо rm -rf
и mv
команды bash.Эти два сценария Nodejs могут затем вызываться с помощью вашего npm-сценария.
Следующие шаги описывают, как этого можно достичь.
Установка shelljs который предоставляет переносимые команды оболочки Unix для Nodejs.Для этого cd
в каталог вашего проекта выполните следующую команду:
npm i -D shelljs
Создайте новый скрипт Nodejs с именем rm.js
со следующим содержимым:
rm.js
const shell = require('shelljs');
const args = process.argv.slice(2);
const dir = args[0];
shell.rm('-rf', dir);
Сохраните этот файл в корневом каталоге вашего проекта, на том же уровне, где хранятся ваши проекты package.json
.
Создайте еще один скрипт Nodejs с именем mv.js
со следующим содержимым:
mv.js
const shell = require('shelljs');
const args = process.argv.slice(2);
const src = args[0];
const dest = args[1];
// Check src path has been provided and is valid
if (!src || !shell.test('-d', src)) {
console.log('\x1b[31m\x1b[40mERR!\x1b[0m src path cannot be found: %s', src);
process.exit(1);
}
// Check dest path has been provided.
if (!dest) {
console.log('\x1b[31m\x1b[40mERR!\x1b[0m dest path must be provided:');
process.exit(1);
}
// Make dest directory if necessary.
shell.mkdir('-p', dest);
// Move the file.
shell.mv(src, dest);
Также сохраните этот файл вкорень каталога вашего проекта на том же уровне, где хранятся ваши проекты package.json
.
Затем настройте сценарий build
в package.json
следующим образом:
"scripts": {
"build": "node rm \"deployment/static\" & react-scripts build && node mv \"build\" \"deployment/static\""
}
Примечание
Два служебных скрипта rm.js
и mv.js
вызываются в npm-script
с именем build
через частичтение;node rm ...
и node mv ...
соответственно.
Если вы решите сохранить эти два сценария в другой папке, а не в корневом каталоге проектов (как было предложено ранее в шагах 2 и 3), вам потребуетсяизменить пути к файлам.Например;если они оба были сохранены в папке с именем scripts
, которая находится в корневом каталоге вашего проекта, сценарий build
изменится на:
"scripts": {
"build": "node scripts/rm \"deployment/static\" & react-scripts build && node scripts/mv \"build\" \"deployment/static\""
}