【问题标题】:How should I organize source control for Android projects including libraries?我应该如何组织包括库在内的 Android 项目的源代码控制?
【发布时间】:2011-11-20 12:43:58
【问题描述】:

我需要一些帮助来找出组织我的 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 中的所有内容推送到某个存储库。

如果有人想要 fork 我的应用程序甚至帮助我,它将需要库来编译和运行它,这不包含在我的项目本身中。 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 文件夹中。在以前的文件夹组织中,这将不需要,因为我引用的是原始克隆存储库而不是副本。

那我该怎么办?我应该使用选项一并让任何分叉我的项目的人按照他们认为合适的方式处理库依赖项,还是我应该使用第二个选项并通过在原始文件夹从其中提取更改时保持两个文件夹同步来给每个人更多的工作仓库?

【问题讨论】:

  • 你是如何为 bitbucket 解决这个问题的? bitbucket 没有在项目中添加我的库

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


【解决方案1】:

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

嗯,google 称它为 Android Library Project 是合理的,而不是 Android Library

【讨论】:

  • 我同意你对另一个项目的整个设置。来自 Windows/C# 我在哪里可以引用一个 .dll 文件,现在我不能在 Android 中做类似的事情。不过,您的回答并没有真正回答我的问题。图书馆不是我的,是别人的。老实说,我不知道 Maven 是什么,现在也懒得去学习新东西。
  • 我知道这不是答案,我试图将其添加为评论但大小溢出:P
  • Android 库项目和你从 Java 中知道的库之间有一个非常重要的区别,你只有一个 jar。不同之处在于库项目不只是复制到主项目中。为了节省磁盘大小,仅将使用过的部分复制并编译到主项目中。此外,资源可以在主项目中轻松更改,因为它们只是替换库的东西。非常适合白标应用!如果您不喜欢这样,您仍然可以开发一个库并将其作为 jar 文件添加到您的项目中。请不要拿苹果和香蕉比较!
【解决方案2】:

也许 git 子模块会解决你的问题。

【讨论】:

  • 使用这些有点混乱。我将不得不在未来更深入地挖掘,因为现在我只是让事情保持原样。但我想子模块正是我想要的:)
  • Git 子模块非常令人困惑,我认为对于您的情况来说太复杂了。从我读过的内容来看,如果您想包含一个很少更新的第三方库(只有在有另一个版本时),建议您使用子模块。它们不适用于您自己的库,您会经常更新这些库。您可能想尝试使用 git subtree:apenwarr.ca/log/?m=200904#30
【解决方案3】:

我个人认为 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/lib;您只需要将它们添加到您的 IDE/构建系统中。

Git 分支和修改比使用子模块更容易、更直接。

我什至创建了a small script,它可以自动执行此过程以获取库列表。

【讨论】:

    猜你喜欢
    • 2015-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多