Как организовать управление исходным кодом для проектов Android, включая библиотеки?

Мне нужна небольшая помощь в выяснении наилучшего способа (или лучшей практики) для организации моего проекта Android. Для простоты, скажем, мое рабочее пространство Eclipse для Android C:\Android\Projects\, Внутри этой папки мне нравится отделять приложения от библиотек, и у меня есть две другие папки, C:\Android\Projects\Applications а также C:\Android\Projects\Components,

Для одного проекта я клонировал библиотеку из GitHub в Components папка, скажем C:\Android\Projects\Componentes\SampleLib (внутри этой папки есть две папки TheLib а также TheLibExample). И мое приложение создано в C:\Android\Projects\Applications\MyTestApp, Затем я включил библиотеку в приложение, следуя этим инструкциям.

Теперь предположим, что я хочу использовать GitHub, чтобы поделиться своим приложением с сообществом разработчиков открытого кода. Я создам репозиторий и вытолкну все из C:\Android\Projects\Applications\MyTestApp в какой-то репозиторий.

Если кто-то захочет раскрутить мое приложение или даже помочь мне, ему понадобится библиотека для его компиляции и запуска, которая не включена в сам мой проект. default.properties файл будет иметь что-то вроде android.library.reference.1=../Components/SampleLib/TheLib и что кому-то тоже нужно будет вручную клонировать эту библиотеку, и он должен будет поместить ее в тот же относительный путь, иначе это испортит контроль над исходным кодом для моего приложения.

Единственный способ решить эту проблему - организовать рабочее пространство следующим образом:

C:\Android\Projects\Applications\MyTestApp\TheApp
C:\Android\Projects\Applications\MyTestApp\TheLib
C:\Android\Projects\Componentes\SampleLib

И мой репозиторий должен быть заполнен содержимым из C:\Android\Projects\Applications\MyTestApp\,

Но что происходит, когда библиотека обновляется? Я не могу просто вытащить новые изменения, мне нужно скопировать их в TheLib папка. В предыдущей организации папок это не понадобилось, поскольку я ссылался на исходный клонированный репозиторий, а не на его копию.

Что мне тогда делать? Должен ли я пойти с первым вариантом и позволить любому разветвляющемуся моему проекту иметь дело с зависимостью библиотеки по своему усмотрению, или я должен пойти со вторым и дать всем больше работы, синхронизируя две папки, когда исходная папка извлекает изменения из хранилище?

3 ответа

Решение

Возможно, подмодули git решат вашу проблему.

Лично я считаю, что проект библиотеки Android - это проект FAIL. Смешно, что единственный способ, которым я хочу ссылаться / использовать другой кусок кода, - это получить еще один проект целиком и настроить все на уровне конфигурации IDE. что такое библиотека? это должен быть повторно используемый компонент, скомпилированный и упакованный в архивном формате. В соответствии с их важной записью о месте хранения проекта библиотеки, я не думаю, что есть простой обходной путь, по которому мы можем разорвать связь и управлять библиотекой как настоящей библиотекой. Если ваша библиотека не так androidized, попробуйте написать / собрать как обычную библиотеку jar и использовать maven для управления сборкой / выпуском библиотеки jar и зависимостями проекта.

Хм, разумно, что Google называет это Android Library Project, а не Android Library.

Мне лично кажется, что подмодули git не совсем обеспечивают очень простую в использовании и мощную систему для библиотечных зависимостей.

Git поддеревья - лучшая альтернатива. Я нашел очень полезное руководство, которое объясняет, как это сделать.

По сути, вы можете создать подпапку, содержащую ваши зависимости, и клонировать репозитории внутри этой подпапки:

$ mkdir vendor
$ git remote add -f ABS https://github.com/JakeWharton/ActionBarSherlock
$ git merge -s ours --no-commit ABS/master
$ git read-tree --prefix=vendor/ABS/ -u ABS/master
$ git commit -m "Merged ABS into vendor/ABS/"
# Now another lib
$ git remote add -f Crouton https://github.com/keyboardsurfer/Crouton
$ git merge -s ours --no-commit Crouton/master
$ git read-tree --prefix=vendor/Crouton/ -u Crouton/master
$ git commit -m "Merged Crouton into vendor/Crouton/"

Тогда у вас будет два репозитория в этом примере vendor/; вам просто нужно добавить их в вашу систему IDE/build.

Разветвление и модификации Git намного проще и понятнее, чем с подмодулями.

Я даже создал небольшой скрипт, который автоматизирует этот процесс для списка библиотек.

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