我需要帮助找出组织我的Android项目的最佳方式(或最佳实践)。为简单起见,假设我的Android Eclipse工作区为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
。然后我按照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
文件夹中。在上一个文件夹组织中,这不需要,因为我引用了原始的克隆存储库而不是副本。
那我该怎么办?我应该选择一个选项,让任何人都可以根据自己的需要处理我的项目处理库依赖关系,或者我应该选择第二个文件夹,并通过保持两个文件夹同步来为每个人提供更多工作,当原始文件从其中获取更改时存储库
答案 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列表。