2010-02-15 39 views
15

Tôi đang đấu tranh để kích hoạt chức năng nâng cấp chính trong WiX.Làm cách nào để nâng cấp chính WiX hoạt động?

Tôi muốn mọi phiên bản mới của trình cài đặt là nâng cấp chính (gỡ cài đặt đầy đủ, sau đó cài đặt mới) vì chúng tôi không muốn các phiên bản nâng cấp và cài đặt sạch khác nhau.

Tôi đã bắt đầu cố gắng thực hiện việc này bằng cách sử dụng thẻ, nhưng tôi tiếp tục nhận được "Phiên bản khác được cài đặt". thông báo lỗi khi tôi chạy trình cài đặt.

Vì vậy, tôi đã triển khai thẻ mới đã được thêm vào trong V3.5 để nâng cấp dễ dàng hơn. Tôi vẫn nhận được thông báo lỗi.

Sau đó tôi đọc ở đâu đó mà bạn cần thay đổi GUID Id cho mỗi phiên bản mới. Vì vậy, tôi đặt Id = "*" để WiX tạo chúng.

Bây giờ khi tôi cài đặt phiên bản mới hơn, nó sẽ không gỡ cài đặt phiên bản cũ hơn và bạn kết thúc với hai cài đặt vào cùng một thư mục. Tôi làm việc này bởi vì chạy MSI (mới hoặc cũ) sẽ mang đến màn hình sửa chữa/gỡ bỏ.

Ngoài ra chương trình không được ghi đè bằng phiên bản mới.

Đây là sự khởi đầu của kịch bản WiX tôi:

<?xml version="1.0" encoding="UTF-8"?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 

    <Product Id="*" 
      Name="Foo" 
      Language="1033" 
      Codepage="1252" 
      Version="!(bind.FileVersion.Foo.exe)" 
      Manufacturer="Foo Bar Ltd." 
      UpgradeCode="dac2fab2-7d76-4e47-b25f-0748380dab81"> 

     <Package 
       Description="Foo" 
       Comments="This installer database contains the logic and data required to install Foo." 
       InstallerVersion="300" 
       Languages="1033" 
       SummaryCodepage="1252" 
       Platform="x86" 
       Compressed="yes" /> 

     <!-- Remove older versions --> 
     <!-- Important note: MSI ignores the last version digit 1.0.0.? when comparing versions, so always change at least the 3rd digit for new external releases--> 
     <MajorUpgrade DowngradeErrorMessage="The version currently installed is newer than the version you are attempting to install."/> 

Trả lời

20

Dưới đây là một đoạn của những gì tôi sử dụng cho tất cả các gói của tôi, tinh chế qua nhiều phiên bản nội bộ và công

<Product Id="*" 
     UpgradeCode="$(var.Property_UpgradeCode)" 
     Name="!(loc.ApplicationName)" 
     Language="!(loc.Property_ProductLanguage)" 
     Version="$(var.version)" 
     Manufacturer="!(loc.ManufacturerName)" > 

    <Package Description="!(loc.Package_Description) $(var.version)" 
      Comments="!(loc.Package_Comments)" 
      Manufacturer="!(loc.ManufacturerName)" 
      InstallerVersion="301" 
      Compressed="yes" 
      InstallPrivileges="elevated" 
      InstallScope="perMachine" 
      Platform="$(var.ProcessorArchitecture)" /> 

    <Media Id="1" Cabinet="media1.cab" EmbedCab="yes" /> 

    <Upgrade Id="$(var.Property_UpgradeCode)"> 
     <UpgradeVersion OnlyDetect="yes" 
         Minimum="$(var.version)" 
         Property="NEWERVERSIONDETECTED" 
         IncludeMinimum="no" /> 

     <UpgradeVersion OnlyDetect="no" 
         Maximum="$(var.version)" 
         Property="OLDERVERSIONBEINGUPGRADED" 
         IncludeMaximum="no" /> 

     <!-- Detect for changes in 4th field only --> 
     <UpgradeVersion Property="ANOTHERBUILDINSTALLED" 
       Maximum="$(var.version)" Minimum="$(var.version)" 
       IncludeMinimum="yes" IncludeMaximum="yes" OnlyDetect="yes" /> 

    </Upgrade> 

    <CustomAction Id="CA_BlockOlderVersionInstall" Error="!(loc.LaunchCondition_LaterVersion)" /> 
    <CustomAction Id="CA_BlockAnotherBuildInstall" Error="!(loc.LaunchCondition_AnotherBuild)" /> 

    <InstallExecuteSequence> 
     <Custom Action="CA_BlockOlderVersionInstall" After="FindRelatedProducts"> 
      <![CDATA[NEWERVERSIONDETECTED]]> 
     </Custom> 

     <!-- Prevent installation on 4th version field change only --> 
     <Custom Action="CA_BlockAnotherBuildInstall" After="FindRelatedProducts"> 
      <![CDATA[ANOTHERBUILDINSTALLED]]> 
     </Custom> 

     <LaunchConditions After="AppSearch" /> 

     <!-- Schedule RemoveExistingProducts early --> 
     <RemoveExistingProducts After="InstallInitialize" /> 
    </InstallExecuteSequence> 

    <InstallUISequence> 
     <Custom Action="CA_BlockOlderVersionInstall" After="FindRelatedProducts"> 
      <![CDATA[NEWERVERSIONDETECTED]]> 
     </Custom> 

     <!-- Prevent installation on 4th version field change only --> 
     <Custom Action="CA_BlockAnotherBuildInstall" After="FindRelatedProducts"> 
      <![CDATA[ANOTHERBUILDINSTALLED]]> 
     </Custom> 

     <LaunchConditions After="AppSearch" /> 
    </InstallUISequence> 

    <!-- .... --> 

</Product> 
1

Tôi biết bài này là cũ và trả lời, nhưng, trong trường hợp bất cứ ai chạy qua này, tôi đã có vấn đề với trình cài đặt nâng cấp của tôi. Các phần nâng cấp đều ổn. Trình cài đặt sẽ chạy, nhưng, phiên bản trước đó chưa bao giờ bị xóa, do đó, phiên bản mới chưa được cài đặt. Vấn đề là này

<Feature Id="ProductBinaries" Title="ProductBinariesInstaller" Level="0"> 

Các Cấp = "0" ở trên, cần phải có được Cấp = "1" vì nó là dưới đây:

<Feature Id="ProductBinaries" Title="ProductBinariesInstaller" Level="1"> 

Scott

1

Nếu đó là của bất kỳ sử dụng để những người phát hiện ra chủ đề này, tôi cũng đã gặp phải một vấn đề tương tự mà tôi vừa mới tìm ra.

Trong trường hợp của tôi (và vẫn đang trong giai đoạn phát triển trình cài đặt ban đầu), sự khác biệt quan trọng là, giữa các phiên bản, tôi đã chuyển từ cài đặt cho mỗi người dùng sang cài đặt trên mỗi máy. Cụ thể hơn, tôi đã thêm dòng sau vào Product.wxs tôi:

<Property Id='ALLUSERS' Value='1'/> 

tôi vẫn nhận được đầu của tôi xung quanh rất nhiều các idiosyncrasies của Windows Installers, nhưng tôi muốn rằng bằng cách chuyển các loại cài đặt theo cách này sẽ có thể so sánh với việc chuyển sang dòng phiên bản độc quyền lẫn nhau theo nhiều cách (thậm chí cho phép hai phiên bản giống hệt nhau được cài đặt song song!).

Thật đáng tiếc khi Bảng điều khiển Windows không phân biệt rõ ràng giữa các cài đặt cho mỗi người dùng và tất cả người dùng.

Các vấn đề liên quan