#git #heroku #version-control
#git #heroku #контроль версий
Вопрос:
У меня есть 2 версии (ветви) моего приложения: master и dev. Они размещены на разных доменах на Heroku.
Я храню исходные тексты в Bitbucket, а затем использую конвейер для развертывания в Heroku. Это очень удобно, но у меня проблема в том, что я не могу сказать BB, чтобы он строил по-другому. В package.json есть строка, которая должна отличаться:
для производства (master):
"scripts": {
"heroku-postbuild": "webpack --config webpack.prod.js"
},
для разработчиков:
"scripts": {
"heroku-postbuild": "webpack --config webpack.dev.js"
},
В результате я хочу иметь скомпилированный, сжатый код JavaScript на производстве и отлаживаемый, несжатый — на dev.
Я не могу понять, как решить эту проблему.
Я попытался создать 2 разные версии package.json, используя git .gitattributes и merge=ours. Но у него есть 2 подводных камня:
- У меня все еще возникает конфликт при слиянии, и мне приходится постоянно редактировать этот файл.
- Если я установлю какой-нибудь новый пакет в dev, package.json будет обновлен автоматически, но у prod есть своя версия, и сборка завершится неудачей, потому что у него нет обновленного списка пакетов.
Каково правильное решение этой проблемы?
Решение найдено!
Спасибо @piotr.wittchen, хотя я использую другое решение, он подтолкнул меня к его поиску. Оказалось, что я могу использовать переменные окружения в package.jsonhttps://devcenter.heroku.com/articles/node-best-practices#hook-things-up
Итак, я просто изменил строку в package.json:
"scripts": {
"heroku-postbuild": "webpack --config webpack.$env.js"
},
Переменная env — это «dev» в приложении для разработки Heroku и «prod» в prod, и это работает как шарм, нет необходимости иметь разные версии одного и того же файла.
Комментарии:
1. Я не эксперт в области проектов JavaScript, но возможно ли экспортировать этот параметр в отдельный файл, а затем импортировать его в
package.json
? Если да, то вы можете создать отдельный файл для рабочей среды / среды разработки с помощью этойpostbuild
команды, но один файл для остальной конфигурации. Это было бы наиболее разумным вариантом.2. @piotr.wittchen Я думал об этом варианте, но я не знаю, как его реализовать. Вероятно, мне следует создать для этого отдельный вопрос…
Ответ №1:
Я некоторое время играл с npm
, и вот мое предложение решения этой проблемы:
Создайте скрипт bash с именем heroku-post-build.sh
.
Для master
ветви она должна содержать содержимое:
#!/usr/bin/env bash
webpack --config webpack.prod.js
и для dev
ветки:
#!/usr/bin/env bash
webpack --config webpack.dev.js
Внутри heroku-postbuild
цели вызовите скрипт bash следующим образом:
{
"name": "test",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"heroku-postbuild": "./heroku-post-build.sh"
},
"keywords": [],
"author": "",
"license": "ISC"
}
Проблема будет в ситуации, когда вы захотите объединить dev
в master
, потому что это переопределит сценарий. В таком случае вам нужно будет выбрать git cherry.
Другой подход (который ИМО лучше) заключается в создании 2 целей, подобных этому:
{
"name": "test",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"heroku-postbuild-dev": "webpack --config webpack.dev.js"
"heroku-postbuild-prod": "webpack --config webpack.prod.js"
},
"keywords": [],
"author": "",
"license": "ISC"
}
и вызвать соответствующую цель в соответствии с ситуацией. Тогда у вас не будет проблем со слияниями. Я не знаю, возможно ли это в настройках вашего проекта.
Комментарии:
1. Это тоже хороший подход!
Ответ №2:
Мне пришлось изменить строку в package.json и поместить туда переменную env, которая отличается для разных приложений («dev» и «prod»):
"scripts": {
"heroku-postbuild": "webpack --config webpack.$env.js"
},