我应该如何组织包括库在内的Android项目的源代码管理?

时间:2011-09-19 19:25:42

标签: android git version-control github project-organization

我需要帮助找出组织我的Android项目的最佳方式(或最佳实践)。为简单起见,假设我的Android Eclipse工作区为C:\Android\Projects\。在该文件夹中,我喜欢将应用程序与库分开,我还有另外两个文件夹,C:\Android\Projects\ApplicationsC:\Android\Projects\Components

对于一个项目,我已经将一个库从GitHub克隆到Components文件夹中,假设C:\Android\Projects\Componentes\SampleLib(在该文件夹中有两个文件夹TheLibTheLibExample)。我的应用已创建为C:\Android\Projects\Applications\MyTestApp。然后我按照these instructions将该库添加到应用程序中。

现在假设我想使用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 个答案:

答案 0 :(得分:4)

也许git子模块可以解决您的问题。

答案 1 :(得分:2)

我个人认为Android的图书​​馆项目是FAIL设计。我想要引用/使用其他代码的唯一方法是获取另一个整个项目并在IDE配置级别设置所有内容,这是荒谬的。什么是图书馆?它应该是一个以可归档格式编译和打包的可重用组件。根据他们的重要说明Library project storage location,我认为没有一个简单的解决方法,我们可以打破平局并将图书馆作为一个真正的图书馆进行管理。如果您的库没有如此机械化,请尝试编写/ build作为普通jar库并使用maven管理jar库构建/发布和项目依赖项。

嗯,谷歌称它为Android库项目,而不是Android 是合理的。

答案 2 :(得分:1)

我个人认为git子模块并不能完全提供一个非常容易使用且功能强大的库依赖系统。

Git子树是一个更好的选择。我发现a very useful guide解释了如何做到这一点。

基本上,您可以创建一个包含依赖项的子文件夹,并在该子文件夹中克隆存储库:

$ 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/内的两个repos / libs;您只需将它们添加到IDE /构建系统即可。

与子模块相比,Git分支和修改更容易,更直接。

我甚至创建了a small script来自动执行此过程以获取lib列表。