Eclipse:来自单一来源的多个项目

时间:2012-04-13 15:04:39

标签: android eclipse cordova

起初我不得不说我对英语不是很好,所以如果我能很好地解释我的意思,我很抱歉:)

我有一个项目需要复制n次;每个新项目必须具有相同的源代码,但不同的资源(例如:图像,html文件,声音,pdf等)和不同的类/包名称。

我的项目不是标准的java,而是android + phonegap。 我有一个eclipse插件,可以创建一个空的phonegap项目...也许有一种方法可以修改这个插件来创建我的标准项目?

有可能吗?最好的方法是让一个系统将主要项目的源变更提交给孩子,但这不是强制性的。

再次对不起我的英语。

编辑:

很抱歉,如果我再次编辑这个问题,但实际上我找不到解决问题的方法。

我想将它与一个例子相结合,也许我可以解释我需要的东西。

想象一下,你已经开发了带有eclipse和phonegap的android应用程序,足球队,例如巴塞罗那。

该应用程序主要是在html + jquerymobile中,但你已经修改了活动,android清单,添加了一些phonegap插件,一些媒体资源等。

现在你必须为更多的团队,很多团队复制这个应用程序。对于每个人,您必须创建一个新的phonegap项目,修改每个文件,添加插件,添加资产....这些任务不能没有错误。

但是最大的问题是:如果您的代码中只有一点点更新,那么如何在10/20/50/100/1000项目中复制它?

我已经在帖子中添加了android,phonegap和cordova标签,以便更具体。

再次对不起我的英语。

编辑N°2

我刚刚玩了maven android插件一个多星期了,但没有成功。 我需要的是集中式代码,我可以在其中切换应用程序和包名,图标以及一些配置文件。

Android libs不是解决方案,因为它无法导出资产文件。

我开始为这个问题寻找详细答案的赏金......请帮忙:(

5 个答案:

答案 0 :(得分:7)

从维护角度来看,我不会考虑基于相同的代码库复制1000个项目。我将使用单个项目管理客户特定的资源,并在项目构建阶段交换所需的资源。换句话说,1个项目构建1000个apks,而不是1000个项目来构建1000个apks。

根据您在问题中提供的详细信息,解决此类使用场景(从单一源代码库构建多个应用程序)的正确方向(据我所知)是采用外部构建工具,如Ant或Maven支配构建过程(两者都提供了对完整构建生命周期中的每一步(即编译,dex,包等)进行精细控制的能力),并且如果需要,可以编写用于批量构建的shell脚本。

我对PhoneGap并不感兴趣,但根据我的理解快速浏览一下Get Started Guide,它只是Android SDK上的另一个编程层堆栈,主要提供编写移动应用程序的能力使用Web编程语言(HTML,CSS,Javascript),应用程序仍然保留原始项目框架,因此我不希望编写Ant / Maven脚本来构建PhoneGap应用程序。

Maven成功构建了PhoneGap应用程序。你可以开始调查如何解决你的场景,我之前在StackOverflow中看到了类似的场景,查看this threadthis thread进行一些案例研究。您可以启动概念验证项目进行可行性研究。

我发布了一些示例代码,显示了Maven如何实现这一点,见下文。

示例项目目录结构:

myApp/
  src/
  res-barcelona/
  assets-barcelona/
  res-realmadrid/
  assets-realmadrid/
  ... ...
  project.properties
  AndroidManifest.xml
  pom.xml

示例pom.xml文件:

<profiles>
  <profile>
    <id>barcelona</id>
    <properties>
      <app.package.name>com.company.app.barcelona</app.package.name>
      <app.res.dir>${project.basedir}/res-barcelona</app.res.dir>
      <app.assets.dir>${project.basedir}/assets-barcelona</app.assets.dir>
    </properties>
  </profile>
  <profile>
    <id>realmadrid</id>
    <properties>
      <app.package.name>com.company.app.realmadrid</app.package.name>
      <app.res.dir>${project.basedir}/res-realmadrid</app.res.dir>
      <app.assets.dir>${project.basedir}/assets-realmadrid</app.assets.dir>
    </properties>
  </profile>
  ... ...
</profiles>

....

<plugins>
  <plugin>
    <groupId>com.jayway.maven.plugins.android.generation2</groupId>
    <artifactId>android-maven-plugin</artifactId>
    <version>3.1.1</version>
    <extensions>true</extensions>
    <configuration>
      <sdk>
        <platform>13</platform>
      </sdk>
      <undeployBeforeDeploy>true</undeployBeforeDeploy>
      <renameManifestPackage>${app.package.name}</renameManifestPackage>
      <resourceDirectory>${app.res.dir}</resourceDirectory>
      <assetsDirectory>${app.assets.dir}</assetsDirectory>
    </configuration>
  </plugin>
  ... ...
</plugins>

要构建app-barcelona.apk,请运行mvn clean install -Pbarcelona 要构建app-realmadrid.apk,请运行mvn clean install -Prealmadrid 要构建其他1000个apks,请编写shell脚本。

Android Maven插件提供了许多配置,可让您在每个阶段/目标中精确控制构建过程。查看Project Documentation了解详细信息。

答案 1 :(得分:3)

希望我在你假设你更多地寻找一般的方法,然后你要改变的文件的实际列表时,你已经得到了你的权利。因为这是你可能不会自己解决的问题。 (虽然android项目结构合理,但仅仅更改res/asserts/文件夹和android.manifest文件就足够了。我只是在我的Phonegap项目中使用了更多内容。

所以我选择的武器就是git branches (Some words about git if you've not already heard about it.)

鉴于上次提交代表您已完成的应用程序。从这里你可以分叉项目(例如Valencia CF)版本。确保您只更改主程序中的资源但没有任何内容!重要的是,您的主要开发分支仍然是最发达的版本!

因此,在发布第二个和第三个应用程序后,您可能需要修复一些错误。 您将切换回开发分支并继续使代码更好。点击下一个版本,你将再次为你想要的所有其他团队的分支提供更新。
所以你有一些分支机构有更新的版本,但一方面是相同的资源,而且旧版本上的应用程序已经风格化。

如果你有一个迷人的git客户端,你可以轻松选择你想要更改的文件。这需要从易于“wtf-MOAH-pcCra $ h 丢弃计算机”变化,如果您要合并许多单个文件但不仅仅是大文件夹+少量文件,如res/android.manifest

另一种可能性是使用名为cherry-pick的git功能。我从来没有使用它,但描述听起来非常像你想要的:

  

给定一个或多个现有提交,每个提交应用更改   介绍,记录每个提交的新提交。这需要你的   工作树要干净(没有HEAD提交的修改)。

(这是我选择它的富人SO thread。)

您拥有干净的工作树,因为您刚刚对新版本进行了分支以重新应用Valencia CF设计。因此,HEAD是干净的,您可以从已经应用设计的旧版本中挑选提交。
很可能从旧版本到新版本已经发生了变化,需要更新资源。 (有些观点已经过去了,但其他观点也是如此)。然而,只需继续完成它,但确保提交你的最终结果,因为这个提交将是你已经开始在你的开发分支中工作的更好更好的版本的选择。

虽然与您的问题没有直接关系,但我还建议您阅读A successful Git branching model,这样可以让您了解如何使用分支机构对您有利。

无论如何,我不认为这是唯一可能的解决方案,但因为它似乎是最方便的方法。由于你所做的所有魔法都在项目文件夹中,你可以复制并粘贴它们并手动或通过巧妙的程序编辑这些东西。但我不确定Eclipse项目文件的存储位置,并且复制它们可能会让Eclipse发生一些变化。 (项目名称相同,但项目路径错误等)。 一直创建新的Eclipse项目对我来说听起来也很重要。虽然git独立于你的IDE(它只是项目中的一个额外文件夹)。你可以关闭Eclipse通过git切换分支并重新打开程序,你已经得到了你应用的更改。 (好的,您可能必须右键单击该项目并点击刷新...正确。)

答案 2 :(得分:3)

正如您已经发现的那样,共享Android Library project就是您所需要的。不幸的是(正如您已经提到的)assets仅在使用Android Maven Plugin构建版本时继承到依赖项目。

在我们的项目中,我们通过ADT out of eclipse为开发人员构建创建了一个Ant任务syncAssets.xml,它位于Android Library项目的基本文件夹中:

<?xml version="1.0" encoding="UTF-8"?>
<!-- This is an Ant build script to synchronize assets from Android library "pkonvert-base"
    because they are not included automatically by the ADT tools. See discussion
    at http://stackoverflow.com/questions/5889833/android-library-assets-folder-doesnt-get-copied
    and topic "Library projects cannot include raw assets" at http://developer.android.com/guide/developing/projects/index.html#considerations.
    The Maven build through the maven-android-plugin automatically includes dependent
    assets from referenced Android libraries, so this Ant script only has to
    be executed when the build is executed from within eclipse. -->
<project name="syncAssets" default="syncAssets" basedir=".">

    <property name="sync.source.dir" value="${ant.file}/../assets" />
    <property name="sync.target.dir" value="${basedir}/assets" />

    <target name="syncAssets" description="Synchronize assets from Android library pkonvert-base">
            <echo>Synchronizing assets from ${sync.source.dir} to ${sync.target.dir}</echo>
            <sync todir="${sync.target.dir}">
                    <fileset dir="${sync.source.dir}" includes="**" />
            </sync>
    </target>

    <target name="clean" description="Clean up assets">
            <delete dir="${sync.target.dir}" />
    </target>
</project>

此Ant任务将库项目assets - 文件夹的内容同步到项目assets - 文件夹中,并在触发Eclipse中的新构建时触发。要将此脚本的执行添加到您的Android项目goto 属性 - &gt; Builders 并创建一个必须是第一个的新 Ant Builder 在要调用的所有构建器的链中(使用向上按钮向上移动Ant构建器)。

在Tab Main 中选择Buildfile ${workspace_loc:/<YOUR_LIBRARY_PROJECT>/syncAssets.xml}和Base directory ${workspace_loc:/<YOUR_PROJECT>}

在选项卡刷新中选择完成后刷新资源特定资源,然后选择要刷新的项目文件夹。此外,选择递归包含子文件夹

在选项卡目标中,确保在手动构建自动构建之后干净后执行默认目标>。目标清理应该在 clean 期间执行。

答案 3 :(得分:0)

您可以将代码放在一个项目中并创建一个jar文件。然后将此项目或jar添加为“cusomized resources”项目的依赖项。

答案 4 :(得分:0)

PhoneGap的AppLaud Eclipse插件的源代码可用here。创建的项目的初始内容来自此resources directory。您可以将内容修改为您想要的任何内容,然后重建插件。由于代码具有EPL许可证,因此您必须开源您修改过的任何内容。