2013-02-08 99 views
11

我有一個WPF應用程序,我想通過ClickOnce部署到我們的用戶。我們有四個環境,系統測試,用戶測試,並行生產和生產。每個需要一個不同的配置文件,其中包含特定於環境的服務器名稱和其他內容,因此它們不能全部使用相同的代碼庫。大部分代碼是相同的,但由於不同的.config文件,最終的包會略有不同。Clickonce部署到多個環境

我發現的是,我們在用戶測試中安裝了一個版本,說05版,然後他們測試,然後當它給他們下一個版本時,我們應該能夠把一個更新的軟件包在用戶測試Web服務器上,他們可以通過點擊部署URL來更新他們的版本。但是當他們這樣做時,它說「已經存在具有相同身份的應用程序」,我們必須通過控制面板卸載才能安裝版本06。這似乎是錯誤的,而不是clickonce的要點。

你會如何建議我將這個應用程序構建並部署到四個不同的環境中,以便在每個環境中我們都有能力在服務器上放置一個新版本,並且用戶在該環境下測試或使用它只會拉動停止更新並且不需要卸載任何東西?

回答

2

首先,您無法從兩個不同的URL安裝具有相同部署名稱的應用程序,而無需首先卸載它。 ClickOnce使用此安全性來確保某人不會嘗試劫持您的部署。

其次,要做不同的構建,可以在項目下設置四個文件夾,每個文件夾各有一個名稱。然後設置四個構建配置(稱它們爲同一件事)。然後設置一個後期製作命令,將文件複製到\ bin文件夾中。如果您將文件夾名稱設置爲在其中具有構建配置,則它將複製隨該配置一起發佈的文件夾名稱。

COPY/Y "$(TargetDir)myfile_$(ConfigurationName)\*.*" "$(TargetDir)" 

第三,你必須包括項目本身,使他們將被標記爲包含在部署的文件,即使你是一個複製命令替換它們構建完成之後。而且這四個目錄也必須包括在內,儘管最終它們不被使用。

+0

我不知道這個時候發佈清單仍然會指將工作到原始服務器?你不能手動編輯清單文件,因爲它沒有簽名? – MickyD 2014-03-31 06:23:32

0

我一直試圖在過去兩天做同樣的事情,沒有運氣。我目前的方法執行以下操作:

msbuild /t:clean /p:Configuration=Release;PlatformTarget=x86 "C:\Product\Product.csproj 
del c:\Product\app.config 
ren C:\Product\systest.config C:\Product\app.config 
msbuild /t:publish /p:Configuration=Release;PlatformTarget=x86;UpdateEnabled=true;UpdateMode=Foreground;UpdatePeriodically=false;MinimumRequiredVersion=2013.2.1086.5496;ApplicationVersion=2013.2.1086.5496;UpdateRequired=true;ProductName="System Test Product";InstallUrl="http://systest.product.temp-uri.org/install/" 
ren C:\Product\bin\Release\app.publish systest.app.publish 

msbuild /t:clean /p:Configuration=Release;PlatformTarget=x86 "C:\Product\Product.csproj 
del c:\Product\app.config 
ren C:\Product\usertest.config C:\Product\app.config 
msbuild /t:publish /p:Configuration=Release;PlatformTarget=x86;UpdateEnabled=true;UpdateMode=Foreground;UpdatePeriodically=false;MinimumRequiredVersion=2013.2.1086.5496;ApplicationVersion=2013.2.1086.5496;UpdateRequired=true;ProductName="User Test Product";InstallUrl="http://usertest.product.temp-uri.org/install/" 
ren C:\Product\bin\Release\app.publish usertest.app.publish 

msbuild /t:clean /p:Configuration=Release;PlatformTarget=x86 "C:\Product\Product.csproj 
del c:\Product\app.config 
ren C:\Product\parallelprod.config C:\Product\app.config 
msbuild /t:publish /p:Configuration=Release;PlatformTarget=x86;UpdateEnabled=true;UpdateMode=Foreground;UpdatePeriodically=false;MinimumRequiredVersion=2013.2.1086.5496;ApplicationVersion=2013.2.1086.5496;UpdateRequired=true;ProductName="Parallel Prod Product";InstallUrl="http://parallelprod.product.temp-uri.org/install/" 
ren C:\Product\bin\Release\app.publish parallelprod.app.publish 

msbuild /t:clean /p:Configuration=Release;PlatformTarget=x86 "C:\Product\Product.csproj 
del c:\Product\app.config 
ren C:\Product\prod.config C:\Product\app.config 
msbuild /t:publish /p:Configuration=Release;PlatformTarget=x86;UpdateEnabled=true;UpdateMode=Foreground;UpdatePeriodically=false;MinimumRequiredVersion=2013.2.1086.5496;ApplicationVersion=2013.2.1086.5496;UpdateRequired=true;ProductName="Prod Product";InstallUrl="http://prod.product.temp-uri.org/install/" 
ren C:\Product\bin\Release\app.publish prod.app.publish 

我揍得意識到,如果要更改配置文件,版本或產品名稱,必須重新編譯應用程序的第一個障礙。在常規構建之後簡單地運行發佈將無法完成此任務。在這一點上,我認爲這是可行的,因爲每個人在應用程序清單中都有不同的安裝URL和不同的產品名稱,但它們仍然與您所看到的相同消息相沖突。如果我得到它的工作,我會回來並修復這個問題。

11

已經有一段時間尋找一個解決方案我自己,我突然想到,我想出了最後一個居然是如此簡單:

  • Slow Cheetah基於選擇的構建轉化配置文件配置(例如調試/發佈)
  • 每個構建配置的屬性組以及項目文件中特定的一次性項目屬性(例如ProductName和AssemblyName(用於並行安裝測試和產品版本),InstallUrl)。
  • 執行/目標時指定附加屬性(比如ApplicationVersion,MinimumRequiredVersion)通過的msbuild:發佈

沒有必要複製任何配置文件手動慢獵豹將處理此。點擊一次包將在相應的構建配置的輸出文件夾中創建(例如bin/Debug或任何你所擁有的)。

的最大優點是,構建爲使用Visual Studio相同或自動構建使用的msbuild(除了完全是可選的一些額外的屬性)。所有你需要做的添加額外的環境到你的構建是創建新的構建配置和相應緩慢的獵豹轉換和項目文件中的屬性組。

整個安裝與.NET 3.5(不能談論早期版本),後來至少工作。

也許這對任何人都有幫助。隨意詢問詳情。

PS:屬性組看起來像這樣(把它們定義了默認的ClickOnce設置在第一組後):

<PropertyGroup Condition=" '$(Configuration)' == 'Demo' "> 
    <AssemblyName>Com.MyApplication.Main.Demo</AssemblyName> 
    <InstallUrl>http://demoserver/myapp/</InstallUrl> 
    <ProductName>My Application %28Demo%29</ProductName> 
    </PropertyGroup> 
    <PropertyGroup Condition=" '$(Configuration)' == 'Test' "> 
    <AssemblyName>Com.MyApplication.Main.Test</AssemblyName> 
    <InstallUrl>http://testserver/myapp/</InstallUrl> 
    <ProductName>My Application %28Test%29</ProductName> 
    </PropertyGroup> 
    <PropertyGroup Condition=" '$(Configuration)' == 'Prod' "> 
    <AssemblyName>Com.MyApplication.Main</AssemblyName> 
    <InstallUrl>http://prodserver/myapp/</InstallUrl> 
    <ProductName>My Application</ProductName> 
    </PropertyGroup> 
+3

無論何時更改構建配置,如何讓Visual Studio不會過度編寫InstallUrl,UpdateURl和ProductName屬性? – MyItchyChin 2016-03-08 15:24:07

+2

@MyItchyChin嗯,其實我沒有。只要不在Visual Studio中打開項目屬性頁面,就不應更改屬性組。此外,源代碼控制可確保您至少注意到並有機會在出現問題時恢復。還是比使用法師好多了...... – 2016-04-08 07:57:17