2012-04-13 86 views
6

起初,我不得不說,我是不是很好的英文,所以我很抱歉,如果我能很好地解釋我的意思:)的Eclipse:從單一來源

我有一個項目中的多個項目我需要重複n次;每個新項目必須具有相同的源代碼,但是不同的資源(例如:圖像,html文件,聲音,pdf等)以及不同的類/包名稱。

我的項目不是標準的java,而是android + phonegap。 我有一個eclipse插件,可以創建一個空的phonegap項目...也許有一種方法來修改這個插件來創建我的標準項目?

可能嗎?最好還有一個系統,將主項目的源代碼更改提交給孩子,但這不是強制性的。

對不起,我的英語。

編輯:如果我重新編輯了這個問題,但我真的找不到我的問題的解決方案

對不起。

我想整合一個例子,也許我可以解釋我需要什麼。

想象一下,您已經開發了一個用eclipse和phonegap開發的Android應用程序,用於一個橄欖球隊,例如Barcelona。

的應用主要是在HTML + jquerymobile,但你已經修改了活動,Android清單,增加了一些插件的PhoneGap,一些媒體資源等

現在你要複製這個應用程序的多的球隊,很多球隊。對於每個人,你必須創建一個新的phonegap項目,修改每一個文件,添加插件,添加資產....這些任務不能沒有錯誤。

但是,最大的問題是:如果您的代碼只有一點點更新,您可以如何在10/20/50/100/1000項目中複製它?

我在帖子中添加了android,phonegap和cordova標籤以更具體。

對不起,我的英語。

編輯N°2

我只是打與Maven Android插件現在一個多星期,但沒有成功。 我需要的是集中式代碼,我可以在其中切換應用程序和軟件包名稱,圖標以及只是很少的配置文件。

Android庫不是一個解決方案,因爲它不能導出資產文件。

我開始爲這個問題尋找一個詳細的解答賞金......請幫助:(

+0

可能我已經找到了解決辦法。 http://stackoverflow.com/questions/8077042/building-many-similar-android-apk-files-at-the-same-time – Laphroaig 2012-04-13 20:35:02

+0

你成功使用Maven構建你的PhoneGap項目之一,到目前爲止? – yorkw 2012-04-20 03:23:52

回答

0

你可以把你的代碼在一個項目中,並創建一個jar文件,不是增加項目或JAR爲依賴性到你的'cusomized資源'項目

+0

是的,這是一個標準的java項目的解決方案。但我是一個android/phonegap項目,將編譯一個apk文件...我會更新我的第一篇文章。不管怎樣,謝謝你! – Laphroaig 2012-04-13 15:14:42

3

希望我認爲你的權利,當你更多地尋找一個普通的方式如何做到這一點,然後你需要改變的文件的實際列表因爲這是你'你可能不會自己想出來。(雖然機器人項目良好的結構可能是不夠的,只是改變res/asserts/文件夾和android.manifest文件。我只是用任何東西在我的PhoneGap項目。

所以我選擇的武器會的Git分支。
(Some words about git if you've not already heard about it.)

鑑於上次提交代表完成的應用程序。從這裏你可以派生的(如瓦倫西亞CF)發佈項目。請確保您只更改的資源,但沒有在主程序!重要的是,你的主發展部門仍是最發達的版本!

因此,在發佈第二個和第三個應用程序後,您可能需要修復一些錯誤。 您將切換回您的開發分支,並繼續使您的代碼更好。在下一個版本中,您將再次爲所有其他想要更新的團隊提供支持。
所以你有幾個分支與更新的版本,但一方面相同的資源,並已在舊版本的應用程序都已風格。

如果你有一個迷人的git客戶端,你可以很容易地選擇你想要更改的文件。如果你有很多單獨的文件要合併,但不是簡單的大文件夾+ res/android.manifest等幾個文件,這需要從容易到「wtf-MOAH-pcCra $ h 丟掉計算機」。

另一種可能性是使用名爲cherry-pick的git功能。我從來沒有使用它,但描述聽起來很像你想要什麼:

由於一個或多個現有的提交,應用更改每一個 介紹,記錄每個新的提交。這要求您的工作樹是乾淨的(不需要修改HEAD提交)。

(這裏有豐富的SO thread那裏我挑選它了。)

你有你乾淨的工作樹因爲你只是支的新版本重新申請瓦倫西亞CF設計。因此,HEAD是乾淨的,你可以選擇已經應用了設計的舊版本的提交。
很可能有東西從舊版本更改爲需要更新資源的新版本。 (有些意見去了,但其他的例子已經介紹)。然而,繼續前進並完成它,但一定要提交你的最終結果,因爲這個提交將成爲你已經開始在開發分支中開始工作的更好更好版本的選擇。

雖然與您的問題沒有直接關係,我也建議您閱讀A successful Git branching model,這可以讓您瞭解如何使用分支機構來幫助您。

無論如何,我不認爲這是唯一可能的解決方案,但它似乎是最方便的方法。由於您所做的所有魔法都在項目文件夾中,因此您可以複製並粘貼它們,並手動或通過巧妙的程序編輯它們。但是我不確定Eclipse項目文件的存儲位置,而且複製這些文件可能會讓Eclipse感到有些不適。 (相同的項目名稱,但錯誤的項目路徑等)。 創建新的Eclipse項目對我來說聽起來像是很多工作。雖然git獨立於您的IDE進行協作(它只不過是項目中的額外文件夾。)你可以關閉Eclipse,通過git切換分支並重新打開程序,並且你已經應用了更改。 (好的,你可能必須右鍵點擊該項目並點擊刷新...)。

7

從維護的角度來看,我不會考慮複製基於相同代碼庫的1000個項目。我將使用單個項目來管理客戶特定資源,並在項目構建階段交換所需的資源。換句話說,1個項目建立1000個訪問點,而不是1000個項目建立1000個訪問點。

根據您在問題中提供的細節,解決這種使用場景(從單一來源構建多個應用程序)的正確方向(據我所知)是採用外部構建工具,如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> 

要構建的應用程序,barcelona.apk,運行mvn clean install -Pbarcelona
要構建應用程序realmadrid.apk,請運行mvn clean install -Prealmadrid
要構建其他1000個應用程序,請編寫shell腳本。

Android Maven Plugin提供了許多配置,讓您可以精確控制每個階段/目標的構建過程。查看Project Documentation瞭解詳細信息。

0

PhoneGap的AppLaud Eclipse插件的源代碼可用here。創建的項目的初始內容來自resources directory。您可以將內容修改爲任何您想要的內容,然後重新構建插件。由於代碼具有EPL許可證,因此您必須開放源代碼才能修改。

3

正如你已經發現的,共享Android Library project是你所需要的。不幸的是(正如您已經提到的)assets僅在構建版本爲Android Maven Plugin時才被繼承到依賴項目。

在我們的項目中,我們創造了開發商一個Ant任務syncAssets.xml通過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 - 將文件夾放入項目assets - 文件夾中,並在觸發Eclipse中的新構建時觸發。要添加這個腳本的執行你的Android項目轉到屬性 - >建設者並創建一個新Ant構建這必須是在所有的建設者鏈中第一個被調用(使用最多按鈕向上移動螞蟻生成器)。

在標籤選擇Buildfile ${workspace_loc:/<YOUR_LIBRARY_PROJECT>/syncAssets.xml}和基本目錄${workspace_loc:/<YOUR_PROJECT>}

在標籤刷新選擇完成後刷新資源和特定資源並選擇您的項目文件夾被刷新。此外,請選擇遞歸包含子文件夾

在標籤目標確保默認目標得到乾淨後執行,在手工打造自動建立。目標清潔應在清潔期間執行。