Как построить по-другому, но с тем же package.json?

#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 подводных камня:

  1. У меня все еще возникает конфликт при слиянии, и мне приходится постоянно редактировать этот файл.
  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"
    },