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
размещенный проект не очень хорош в корпоративной среде:
github
должен быть доступен с каждой машины сборки (а источники для зависимостей жестко закодированы вrebar.config
)- Вы полагаетесь на не зависящее от проекта видение зависимого проекта (можете ли вы указать конкретный коммит?). Мало того, что невозможно воспроизвести состояние вашего проекта в прошлом (со всеми зависимостями в то время), но, что еще хуже, ваш проект также может быть легко нарушен после обновления какой-либо зависимости от
github
(без обновления своей версии). - Что если вы хотите настроить зависимый проект? Как небольшое изменение в файле rebar.config зависимого проекта?
Так что вместо get-deps
мы используем отдельную ветку (+ удаленное указание на конкретный github
project) для каждого зависимого проекта и поддерева git объедините его в каталог 'dep' в нашей ветви проекта. Мы эффективно храним все зависимости в основной ветке, но таким образом решаем все перечисленные проблемы:
- Вы получаете всю кодовую базу, извлекая основную ветку проекта (или dev и т. Д.) Из наших внутренних репозиториев git. Это сразу же можно построить.
- Точные версии всех зависимостей объединяются в нашу основную ветку, и мы обновляем новую версию зависимости только тогда, когда нам нужно / нужно: просто переключиться на ветку зависимости, сделать
git pull
и их поддерево объединяет некоторую конкретную версию зависимости в основную ветвь. В любой момент вы можете получить любую прошлую версию всего проекта. - Зависимость может быть настроена в ее собственной ветви (или другой настраиваемой ветви), как только пришло время обновить зависимость: вам придется
git merge
последний код с вашими изменениями, но обычно это не проблема. Вы даже можете указать свой пульт в свой собственный репозиторий (разветвленный наgithub
или внутренний).
Конечно, мы не будем публиковать наш проект в этой форме (со всеми зависимостями) на "github", но вы можете удалить все зависимости (удалив папку "dep") в отдельную ветку и опубликовать результат. Недостатком этого подхода является небольшая проблема с обновлениями зависимостей: вместо rebar get-deps
ты должен сделать git push
+ git merge -s subtree
для каждой зависимости, которую вы хотите обновить, но это всего лишь следствие строгого управления зависимостями и простоты сборки.
Я думаю, что вы ищете команду rebar get-deps. Взгляните на Makefile и rebar.config, используемые Riak для хорошего примера.