Git субмодули и арматура

Мое приложение использует Mochiweb. Насколько я понимаю, rebar извлекает последнюю версию из Github при запуске makeпотому что есть строка в rebar.config:

{deps, [
  {mochiweb, ".*",
   {git, "git://github.com/mochi/mochiweb.git", "master"}}

Мое приложение имеет VCS, и это мерзавец. Итак, по сути, у меня есть один Git-репозиторий внутри другого:

myapp
 .git
 deps
  mochiweb
   .git
 src
 etc

Я знаю, что добавление git-репозитория внутри другого не очень хорошая идея (git add .). Вместо этого следует использовать функциональность подмодулей Git.

Итак, я добавил deps/mochiweb каталог как подмодуль в главном git-репозитории.

Проблема в том, что когда другой разработчик клонирует основной репозиторий, он должен init а также update подмодули в первую очередь, чтобы получить deps/mochiweb (иначе это было бы пусто).

Если разработчик просто запускает make сразу после того, как он клонирует главный репозиторий, Makefile сообщает следующее:

ERROR: Dependency dir deps/mochiweb failed application validation with reason:

{missing_app_file,"deps/mochiweb"}

make: *** [all] Error 1

Мой вопрос: как правильно добавить другое приложение в приложение Erlang, чтобы другие разработчики могли легко обновлять его без использования подмодулей git?

3 ответа

Решение

Как правильно добавить другое приложение в приложение Erlang, чтобы другие разработчики могли легко обновлять его без использования подмодулей git?

Добавьте приложение в rebar.config и используйте:

./rebar update-deps

Для обновления. В первый раз вам нужно использовать:

./rebar get-deps

Смотрите: https://github.com/basho/rebar/wiki/Rebar-commands

Теперь вернемся к вашей ошибке.

Я чувствую, что у вас есть (почти) пустой каталог для mochiweb в ваших deps, возможно, в результате игры с подмодулями Git. Когда вы запускаете get-deps Команда rebar молча отбрасывает mochiweb, так как каталог уже существует. Но он ожидает применения OTP и ищет mochiweb.app файл, которого там нет (каталог пуст). Поэтому ошибка. Если моя интерпретация верна, вы можете просто сделать:

rm -rf deps/mochiweb
./rebar get-deps

Однако просмотр вашего rebar.config поможет.

В наших внутренних проектах Erlang мы используем подход слияния Git поддеревьев к ссылочным зависимостям. На мой взгляд, хотя rebar get-deps это удобный способ получить зависимости для github размещенный проект не очень хорош в корпоративной среде:

  1. github должен быть доступен с каждой машины сборки (а источники для зависимостей жестко закодированы в rebar.config)
  2. Вы полагаетесь на не зависящее от проекта видение зависимого проекта (можете ли вы указать конкретный коммит?). Мало того, что невозможно воспроизвести состояние вашего проекта в прошлом (со всеми зависимостями в то время), но, что еще хуже, ваш проект также может быть легко нарушен после обновления какой-либо зависимости от github (без обновления своей версии).
  3. Что если вы хотите настроить зависимый проект? Как небольшое изменение в файле rebar.config зависимого проекта?

Так что вместо get-deps мы используем отдельную ветку (+ удаленное указание на конкретный github project) для каждого зависимого проекта и поддерева git объедините его в каталог 'dep' в нашей ветви проекта. Мы эффективно храним все зависимости в основной ветке, но таким образом решаем все перечисленные проблемы:

  1. Вы получаете всю кодовую базу, извлекая основную ветку проекта (или dev и т. Д.) Из наших внутренних репозиториев git. Это сразу же можно построить.
  2. Точные версии всех зависимостей объединяются в нашу основную ветку, и мы обновляем новую версию зависимости только тогда, когда нам нужно / нужно: просто переключиться на ветку зависимости, сделать git pull и их поддерево объединяет некоторую конкретную версию зависимости в основную ветвь. В любой момент вы можете получить любую прошлую версию всего проекта.
  3. Зависимость может быть настроена в ее собственной ветви (или другой настраиваемой ветви), как только пришло время обновить зависимость: вам придется git merge последний код с вашими изменениями, но обычно это не проблема. Вы даже можете указать свой пульт в свой собственный репозиторий (разветвленный на github или внутренний).

Конечно, мы не будем публиковать наш проект в этой форме (со всеми зависимостями) на "github", но вы можете удалить все зависимости (удалив папку "dep") в отдельную ветку и опубликовать результат. Недостатком этого подхода является небольшая проблема с обновлениями зависимостей: вместо rebar get-deps ты должен сделать git push + git merge -s subtree для каждой зависимости, которую вы хотите обновить, но это всего лишь следствие строгого управления зависимостями и простоты сборки.

Я думаю, что вы ищете команду rebar get-deps. Взгляните на Makefile и rebar.config, используемые Riak для хорошего примера.

Другие вопросы по тегам