【问题标题】:Eclipse: multiple project from single sourceEclipse:来自单一来源的多个项目
【发布时间】:2012-04-13 15:04:39
【问题描述】:

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

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

我的项目不是标准的java,而是android + phonegap。 我有一个 Eclipse 插件,它创建了一个空的 phonegap 项目......也许有办法修改这个插件来创建我的标准项目?

有可能吗?最好还有一个系统将源代码更改从主项目提交给子项目,但这不是强制性的。

再次对不起我的英语。

编辑:

对不起,如果我再次编辑这个问题,但我真的找不到我的问题的解决方案。

我想把它和一个例子结合起来,也许我可以解释一下我需要什么。

想象一下,您已经使用 eclipse 和 phonegap 为一支足球队(例如巴塞罗那)开发了一个 android 应用程序。

app主要是html + jquerymobile,但是你修改了activity,android manifest,添加了一些phonegap插件,一些媒体资源等等。

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

但最大的问题是:如果您的代码只有一点点更新,如何将其复制到 10/20/50/100/1000 个项目?

为了更具体,我还在帖子中添加了 android、phonegap 和 cordova 标签。

再次对不起我的英语。

编辑 N°2

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

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

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

【问题讨论】:

标签: android eclipse cordova


【解决方案1】:

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

根据您在问题中提供的详细信息,解决这种使用场景(从单一源库构建多个应用程序)的正确方向(据我所知)是采用外部构建工具,如 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 个 apk,请编写 shell 脚本。

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

【讨论】:

    【解决方案2】:

    希望我在假设您更多地寻找一种通用的方法时,然后是您必须更改的文件的实际列表。因为这是您可能不会自己解决的问题。 (虽然 android 项目结构良好,但只需更改 res/asserts/ 文件夹和 android.manifest 文件就足够了。我只是在 Phonegap 项目中使用了更多内容。

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

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

    因此,在发布第二个和第三个应用程序后,您可能需要进行一些错误修复。 您将切换回您的开发分支并继续使您的代码变得更好。在发布下一个版本时,您将再次为您想要提供更新的所有其他团队分支。
    因此,您有几个具有更新版本的分支,但一方面具有相同的资源,并且旧版本上的所有应用程序都已设置样式。

    如果您有一个迷人的 git 客户端,您可以轻松选择您想要更改的文件。如果您有很多单独的文件要合并,而不是简单的大文件夹+像res/和@这样的少数文件,这需要从简单到“wtf-MOAH-pcCra$h 扔掉计算机”不等987654329@.

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

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

    (这里是富豪SO thread,我从那里捡到的。)

    您拥有干净的工作树,因为您刚刚分支了新版本以重新应用 Valencia CF 设计。因此 HEAD 是干净的,您可以从已应用该设计的旧版本中挑选提交。
    很可能已经从旧版本更改为新版本,需要更新资源。 (例如,一些观点去了,但其他观点得到了介绍)。但是,请继续完成它,但请确保提交您的最终结果,因为此提交将成为您已经开始在开发分支中工作的更好和更大版本的最佳选择。

    虽然与您的问题没有直接关系,但我也建议您阅读A successful Git branching model,它让您了解如何使用分支来满足您的需求。

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

    【讨论】:

      【解决方案3】:

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

      在我们的项目中,我们创建了一个 Ant 任务 syncAssets.xml 用于开发人员通过 Eclipse 中的 ADT 构建,该任务位于 Android 库项目的基本文件夹中:

      <?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-folder 的内容同步到项目 assets-folder 中,并在触发 Eclipse 中的新构建时触发。要将此脚本的执行添加到您的 Android 项目,请转到 Properties->Builders 并创建一个新的 Ant Builder,它必须是第一个要调用的所有构建器的链(使用 Up 按钮向上移动 Ant 构建器)。

      在标签 Main 中选择 Buildfile ${workspace_loc:/&lt;YOUR_LIBRARY_PROJECT&gt;/syncAssets.xml} 和 Base directory ${workspace_loc:/&lt;YOUR_PROJECT&gt;}

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

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

      【讨论】:

        【解决方案4】:

        您可以将代码放在一个项目中并创建一个 jar 文件。不如将此项目或 jar 作为依赖项添加到您的“自定义资源”项目中。

        【讨论】:

        • 是的,这是标准 java 项目的解决方案。但我是一个 android/phonegap 项目,它将编译一个 apk 文件......我将更新我的第一篇文章。还是谢谢你!
        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-05
          • 2010-10-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多