Как организовать управление исходным кодом для проектов 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 ответа
Лично я считаю, что проект библиотеки 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 намного проще и понятнее, чем с подмодулями.
Я даже создал небольшой скрипт, который автоматизирует этот процесс для списка библиотек.