2014-05-07 117 views
1

我的項目需要能夠同時安裝2個版本或更多。 據我所知,我找到的解決方案是更改安裝程序的每個版本的升級代碼。wix生成新的升級代碼

但是我想自動執行此操作。在常規GUID我只使用「*」但這不適用於升級代碼。 有沒有辦法在每個wix預建或任何其他解決方案中生成新的升級代碼?

<?xml version="1.0" encoding="utf-8"?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension" xmlns:bal="http://schemas.microsoft.com/wix/BalExtension" xmlns:netfx="http://schemas.microsoft.com/wix/NetFxExtension"> 
    <Bundle Name="Prog" Version="1.2.1.16" Manufacturer="Gilad Corporation" UpgradeCode="{7E71F945-BA46-4872-A6B2-AF992FFDF2D0}"> 
    <BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense"> 
     <bal:WixStandardBootstrapperApplication LicenseFile="..\SetupProject\Gilad.rtf" /> 
    </BootstrapperApplicationRef> 
    <Chain> 
     <!-- TODO: Define the list of chained packages. --> 
     <PackageGroupRef Id="Netfx45FullPackage" /> 
    </Chain> 
    </Bundle> 
+0

這是定義一個產品,不是的UpgradeCode的獨特的產品代碼。 – PhilDW

+0

如果你能描述爲什麼你需要多個實例,那將會很好。通過改變應用程序設計可能有更好的方法來實現這一點。 –

+0

@Glytzhkof我有一個應用程序,我創建錯誤修復和不同的新功能。因爲我的用戶需要能夠在2個不同的版本上工作,我不希望他們只是升級。我希望他們能夠並排安裝2個或多個版本。 – Gilad

回答

3

我不是100%肯定,如果你想實現你的應用程序的不同版本/語言版本,或者如果你想安裝相同的設置幾次並排側。這聽起來像你想達到後者。讓我試着簡要解釋兩種情況。

首先是基礎知識:

  • 封裝代碼:標識唯一的MSI文件(因此它應始終對每個重新編譯更改)
  • 產品編號:識別一個獨特的產品版本。相同產品的不同口味(如英語,德語,法語版)往往有不同的產品代碼。
  • 升級代碼:標識一系列相關產品。本質上是一組產品代碼。

不同的應用版本/語言: 如果你想要的是安裝你設置的不同語言版本 - 說你提供英語,法語和德語版本中,你可以做,通過保持升級代碼它們都是相同的,但是爲每個設置使用不同的產品代碼和包裝代碼。這使得每個設置都可以輕鬆地卸載另一個設備,前提是它已經存在於機器上。

並排安裝:我不喜歡這個概念,因爲它在我看來意味着在安裝設計中有錯誤,但是「實例轉換」的概念應該能夠實現你可能指的是。

<InstanceTransforms Property="INSTANCEID"> 
    <Instance Id="Install2" ProductCode="*" 
      UpgradeCode="guid-goes-here" ProductName="Product" /> 
</InstanceTransforms> 
+0

我想解釋一下爲什麼這是我的設計。我有一個算法的應用程序。算法進入硬件。所以如果我想有一個向後兼容的選項。所以如果我安裝的應用程序和2個月後,我想安裝新版本和舊版本並排我會有選擇。 – Gilad

1

小心你正在努力實現的目標。您是否嘗試安裝同一軟件的多個實例?或者你有不同的應用程序可能需要安裝在同一臺機器上。

MSI的設計不允許並排安裝相同的軟件。

正如@Glytzhokof提到,你必須在MSI您需要解決三個單獨的代碼。

通常你會產生一個升級代碼,從來沒有與MSI的生活變化。如果您嘗試安裝具有相同升級代碼的MSI的兩個版本,那麼您將在MSI中觸發升級邏輯(即升級現有安裝或防止回滾,除非您明確啓用此功能)

您正在嘗試要實現所有軟件包都需要一個獨特的產品,軟件包和升級代碼(以允許並行安裝軟件的V1和V2)。但是,您需要非常小心謹慎選擇並排放置。我已經看到版本1.2.x具有相同的升級代碼,但1.3.x有一個新的升級代碼允許並排安裝。

聽起來你是在爲一些樂趣。

3

只是回答了「如何自動生成的UpgradeCode」的問題,如果你正在使用的MSBuild,你可以做這樣的事情在你的項目:

<PropertyGroup> 
    <NewUpgradeCode>$([System.Guid]::NewGuid())</NewUpgradeCode> 
</PropertyGroup> 

<DefineConstants>NewUpgradeCode=$(NewUpgradeCode)</DefineConstants> 

,並在包:

<Bundle Name="!(bind.PackageName.Package)" 
     Version="!(bind.PackageVersion.Package)" 
     Manufacturer="!(bind.PackageManufacturer.Package)" 
     UpgradeCode="$(var.NewUpgradeCode)"> 

實際上,我在一個類似模板捆綁使用這種包裝一些一次性封裝,在這裏我不想讓他們能夠彼此關聯。不過,我仍然希望他們擁有升級代碼,以備日後升級時使用。

我不能說這是否爲這種使用情況最好的解決辦法,但似乎工作。

+0

我用這個成功,但我不知道我明白我做了什麼。你可以在wixproj文件中使用自定義節點(這裏是NewUpgradeCode)?和[System.Guid] :: NewGuid()是一個PowerShell命令? –

+0

我不會說這是一個PowerShell命令,因爲PowerShell沒有被調用,但MSBuild能夠調用與PowerShell相同的.NET類,並使用類似的語法。它所做的只是生成一個隨機的guid,並將其作爲WixVariable傳入。 –