2009-07-28 95 views
4

至於this question替代什麼是管理軟件的定製版本爲特定客戶的最佳方式是什麼?管理自定義客戶端釋放

大多數的客戶端版本之間的差異是更改用戶界面定製軟件,看起來它是由客戶端擁有。更常見的是,這是一個簡單的標誌變化。偶爾顏色方案也會改變。但有時會根據客戶端啓用或禁用功能。將所有這些版本保持最新狀態並使其容易供特定客戶的用戶使用的最佳方法是什麼?

在這一點上我們有五個不同的客戶端,每個都有自己的軟件構建和自己安裝(完全與他們的安裝程序中的標誌)。這成爲一種管理的痛苦,隨着越來越多的客戶開始使用我們的軟件,情況將會變得更糟。

因此,假設鏈接問題不是要走的路,那麼管理這些版本的最佳方法是什麼?

回答

2

「這已成爲一個痛苦的管理, 它只會更惡化和 多的客戶開始使用我們的軟件 。」

真正解決這部分的唯一方法是,以確保您的軟件具有支持自定義爲你的核心產品之上的一層的架構。理想情況下,它們只是運行時配置選項(顏色,標識和啓用/禁用對此非常合適)。如果您獲得(或需要)大量的客戶端,將可配置性權利推入核心產品,並使客戶能夠自行定製。

更新時,您構建(並測試)核心產品一次,並通過將已構建的核心產品鏈接(引用)爲庫來構建自定義版本。您可以讓每個客戶端分別構建,或者您可以使用一個生成過程來生成當前維護的客戶端版本(後者可能對更多客戶端更好)的更新爲全部。如果你有一個「vanilla」版本,你可以將它作爲核心的一部分或與客戶端版本一起構建,這取決於你的具體情況。

根據您的技術,定製層可能獨立於核心產品而構建。在這種情況下,客戶端重建很少是必需的(可能僅用於某些重大更改) - 您可以在運行時簡單鏈接到更新的核心產品。要部署到客戶端,只需部署更新的內核即可,如果您擁有支持此功能的部署方法。

如果不知道自己的平臺很難說更多的細節,但你已經高貴地保持這個問題不可知論。

0

可以說,唯一的不同需要是你擁有的任何版本的一個分支,在它的客戶唯一的變化。因此,例如:

/project 
    /trunk 
    /branches 
     /release-v1 
    /customer-branches 
     /release-v1-google 
     /release-v1-microsoft 
.... 

您的客戶端版本是您的客戶版本的分支機構。由於這些分支不會捲入樹幹或其他發佈分支,因此不要污染常規開發/分支樹。

+0

我們目前使用非常短的開發週期,因此每週通常會有「發佈」。那麼不會認爲每週都會在所有這些分支之間合併嗎?看起來好像要管理很多。 – 2009-07-28 19:50:00

0

我想這取決於你需要爲每個客戶定製的水平,但你可以做基於配置文件的基礎應用「定製」本身?所以你可以有樹幹被充分應用,然後有每個客戶的特殊配置文件可以控制外觀&以及啓用的功能,並且您的發佈過程將在安裝程序中部署正確的配置文件。

看來,如果你總是提供自定義(ISH)您的應用程序爲每個客戶端的版本,這將是值得以這種方式擴展應用程序的時間。

1
  1. 分隔源代碼樹中的公共和自定義部分。這可以消除絕大多數合併,具體取決於您的測試和發佈政策。總是有一種抽象和定製構建資源的方法,即使您的構建過程必須調用腳本來重寫某個文件。

  2. 在良好的源代碼管理系統中明智地使用分支。這些並不叫做「配置管理」系統。他們是爲了完成這項任務而優化的工具,所以如果沒有建立在一個頂層上,你可能不會得到更好的結果。

Subversion擅長設置多個分支,但最後我檢查了它只能對單個文件進行三次合併。 Perforce在這個部門非常棒,因爲它可以逐個文件地跟蹤分支歷史記錄,並使用它來自動合併整個分支之間的整套變更。這裏真的是貓的睡衣。

Git和darcs可能有類似的權力,但我沒有使用它們。他們似乎基於這樣的想法,即每個正在運行的結帳樹都會自始至終複製所有更改。這對我來說聽起來不切實際,因爲我需要在SCM控制下保留一些大的和不斷變化的SDK。

0

我設置了一個叫做的頭文件branding.h它包含了一堆#ifdefs,就像下面的例子一樣,可以改變任何需要改變的位。在Visual Studio中,通過定義適當的客戶端符號很容易設置多個構建。

#if defined BRAND_CLIENT1 
# define COMPANY_NAME "Client 1" 
# define PRODUCT_NAME "The Client 1 Widget App" 
# define LOGO_FILE  "res/logoClient1.ico" 

#elif defined BRAND_CLIENT2 
# define COMPANY_NAME "Client 2" 
# define PRODUCT_NAME "The Client 2 Super Widget App" 
# define ENABLE_EXTRA_MENU 
# define LOGO_FILE  "res/logoClient2.ico" 

#endif 

這都是假設C++的。