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

Мне нужна небольшая помощь в выяснении наилучшего способа (или лучшей практики) для организации моего проекта 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 ]

4 голосов
/ 20 сентября 2011

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

2 голосов
/ 20 сентября 2011

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

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

1 голос
/ 13 июня 2013

Мне лично кажется, что подмодули 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 намного проще и проще, чем с подмодулями.

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

...