2010-04-01 66 views
24

我們正在開發AppExchange應用程序,並試圖找出開發和發佈管理的最佳方式。有幾個問題圍繞此:託管SalesForce應用程序開發的最佳實踐?

1)程序包前綴。我們正在以非託管模式開發代碼並以託管方式發佈,因此我們必須將所有包前綴添加到代碼中。有沒有辦法在運行時動態地執行此操作?現在我們正在使用Ant腳本,這阻止了我們從force.com IDE插件中受益。

2)資源文件...我們正在做一些Ajax-ey的東西,因此我們上傳了一些不同的資源文件,其中一些是多個文件資源(zip文件)。有沒有人使用ANT自動建立這些資源,並且這樣做是否正常?

我們的環境似乎非常脆弱,適用於一些開發人員而不是其他人;有其他人有這個問題嗎?你是如何解決它的?

+0

8投票,0回答:) – NAVEED 2010-04-14 19:17:46

回答

13

我討厭這麼說,但聽起來你已經解決了我所知道的最佳方法。 Salesforce打包環境可能是一個完整的噩夢。一旦你的託管包有一個前綴,除非你像你所做的那樣編寫腳本,否則真的沒有回到一個普通的包。因此,您會發現整個代碼中包含的軟件包名稱,系統將爲您添加該代碼。

我發現使用它的最佳方式是保持應用程序的「純」版本,該版本將從Ant內部安全地安裝到開發組織中。一旦你在Ant中獲得了代碼,它就可以被添加到「正常」的源代碼控制中。似乎並沒有太多的大型應用程序在Salesforce中與多個團隊成員一起構建,因爲據我所知,對包含源代碼控制的工作流沒有太多支持。他們試圖將一些發佈管理添加到開發組織配置中,該配置現在處於測試階段,但看起來並不好。

我認爲使用Salesforce Force.com遷移工具的Ant是絕大部分方法。然而,一旦你想製作一個託管軟件包,你就會被凍結在那個代碼庫中,並且用那個前綴,然後你必須從包裝系統中打包發佈(來自測試版等)本身。要刷新到沙盒(每月一次的硬限制!!),然後讓開發人員退出該沙箱並部署到單個開發組織中,然後可以定期將其合併到「組開發組織」中重新部署到沙盒(使用Force.com IDE或Ant),然後部署到生產環境中。

整個過程基本上是一個完整的災難。 Salesforce離擁有一個超級強大的平臺非常近,但很多時候感覺就像一輛沒有方向盤的超級跑車。

就靜態資源而言,您應該能夠使用Eclipse以相對簡單的方式自動執行自動操作,以便您可以在一個步驟中單獨部署這些資源。 API也應該支持它。

我曾經研究過一些相當龐大的Apex代碼庫(我認爲和希望),而且恐怕真的沒有明顯的優雅解決方案。在某些情況下,使用Ant進行部署會出現奇怪的組合,例如Eclipse等。

從其他開發環境來看,它往往令人迷惑,而且很奇怪。例如,令人費解的是,您無法輕鬆地在一個步驟中轉儲數據庫,同時跟蹤對象之間的關係,然後在一個步驟中將其「導入」另一個組織。實際上,我們必須編寫一個工具,它可以很容易地從xls文件中遍歷對象關係,加載所有數據,遞歸刪除數據等等時提取所有數據,因爲我們需要一種簡單的方法來測試組織。

順便說一句,開發組織基本上扔掉了組織。我們爲了不同的測試目的創建了數十種不同的版本和配置。

對不起,我不能給你更好的消息。在這裏,可能會有更多的古茹指導您使用優雅的方式來管理包裝,我會對您感興趣並作爲答案!如果你想表達的話,你可以在suprasphere --- --- --- gmail上給我發電子郵件! :)

+0

可能需要查看Change Sets如何用於解決此問題。它們是Salesforce.com最近的補充。當我們給出這個答案時,我不認爲他們是可用的。 – Born2BeMild 2012-05-24 23:30:45

+0

變更集不能用於Developer Orgs(您創建AppExchange應用程序的地方),所以在這種情況下沒有任何幫助。 – ceiroa 2012-11-27 22:38:07

0

我們最近切換到使用前綴管理器,而不是做替換。

這是我們的代碼。

public class PrefixMgr { 
    private static string objPrefix = null; 

    public static string getObjPrefix() { 
     if(objPrefix == null) { 
      try { 
       Database.query('select MyColumn__c from my_prefix__MySmallTable__c'); 
       objPrefix = 'my_prefix__'; 
      } 
      catch(Exception e) { 
       objPrefix = ''; 
      } 
     } 

     return objPrefix; 
    } 

    public static string getAppPrefix() { 
     return 'my_prefix__'; 
    } 

    public static string getObjName(string inp) { 
     return getObjPrefix() + inp; 
    } 
} 

基本上,這試圖針對具有前綴名稱的表進行查詢(一次)。如果它不存在,那麼我們處於非託管模式,沒有包前綴。如果確實成功了,那麼我們就適當地設置前綴。 getObjName是一種方便,因爲PrefixMgr.getObjName('MyObject__c')PrefixMgr.getObjPrefix() + 'MyObject__c'更易讀(尤其是字符串連字符)。

想法和意見。

+3

爲什麼你需要添加前綴到你的查詢?只有引用包中對象/類的包之外的代碼需要使用名稱空間。看到http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_classes_namespace_prefix.htm – 2012-04-04 16:19:52

+0

原來我們不需要那樣做,我們最終沒有使用它。我們收到了一些錯誤信息,花了一段時間才弄清楚了:)。 – Fiid 2012-04-04 20:49:23