Реагируйте на развертывание в AWS S3, используя файл npm - index.html как последний

У меня есть приложение React (использующее приложение React Create), которое я хочу загрузить в производство с помощью сценария. Моя продукция - ведро AWS S3. Я добавил в package.json скрипт "deploy" следующим образом:

"scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test --env=jsdom",
    "eject": "react-scripts eject",
    "deploy": "aws s3 cp ./build s3://app.example.com --recursive --exclude \"*.DS_Store\" --cache-control public,max-age=604800 --profile production-profile"
  },

Это обновит все файлы сборки в рабочую корзину. Поскольку статические файлы сборки (css, js и т. Д.) Получают собственный хэш-код, они не перезаписываются каждой версией, и это нормально.

Проблема в том, что я не хочу, чтобы файл index.html загружался до тех пор, пока другие файлы не завершат загрузку. Таким образом, после перезаписи index.html последней версией автоматически используются новые статические файлы.

Есть идеи как этого добиться? Если бы был лучший скрипт для загрузки приложения реакции на S3, было бы здорово.

2 ответа

Решение

Сначала вы можете скопировать все остальное, кроме index.html, а затем скопировать его.

 "aws s3 cp ./build s3://app.example.com --recursive --exclude \"*.DS_Store\" --exclude \"index.html\" --cache-control public,max-age=604800 --profile production-profile && aws s3 cp ./build/index.html s3 ://app.example.com  --cache-control public,max-age=604800 --profile production-profile "

Если я не ошибаюсь, вы хотите, чтобы файл index.html загружался последним, чтобы он содержал статические имена файлов js/css, которые должны быть загружены в ваше приложение (старый index.html содержит старые версии), верно?

Что вы можете сделать, это вместо этого удалить файлы s3, которые не существуют в загружаемых файлах:

aws s3 sync build/ s3://app.example.com --delete --exclude \"*.DS_Store\" --cache-control public,max-age=604800 --profile production-profile

Команда "синхронизирует каталоги и префиксы S3. Рекурсивно копирует новые и обновленные файлы из исходного каталога в место назначения. Создает папки в месте назначения, только если они содержат один или несколько файлов". - Документы AWS

"Флаг --delete приведет к тому, что CLI удалит файлы, которые находятся в месте назначения, но не находятся в источнике". - Помощь AWS

Так что это все равно должно загрузить все в вашу директорию сборки, но также удалить старые версии файлов.

Изменить (вместо удаления старых файлов):

# Exclude the index.html file for first upload, you could probably use cp instead of sync
aws s3 sync build/ s3://app.example.com --exclude \"*.DS_Store\" --exclude "index.html" --cache-control public,max-age=604800 --profile production-profile
# Add it after everything else is uploaded
aws s3 sync build/index.html s3://app.example.com --exclude \"*.DS_Store\" --cache-control public,max-age=604800 --profile production-profile
Другие вопросы по тегам