当前位置: 首页 > 知识库问答 >
问题:

wix生成新的升级代码

松嘉颖
2023-03-14

我的项目需要能够同时安装 2 个或更多版本。据我所知,我找到的解决方案是更改安装程序每个版本的升级代码。

但是我想自动这样做。在常规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>

共有3个答案

洪雨石
2023-03-14

小心你想要实现的目标。您是否正在尝试安装同一软件的多个实例?或者您是否有此程序的不同应用程序,可能需要安装在同一台计算机上。

MSI 并非设计为允许并行安装同一软件。

正如@Glytzhokof提到的,MSI中有三个单独的代码需要处理。

通常,您会生成一个升级代码,该代码不会随着MSI的生命周期而改变。如果您尝试安装具有相同升级代码的MSI的两个版本,那么您将触发MSI中的升级逻辑(即升级现有安装或阻止回滚,除非您明确启用此功能)

您要实现的目标需要所有软件包的唯一产品、软件包和升级代码(以允许并排安装软件的V1和V2),但是您需要非常小心选择并排允许的方式。我见过版本控制,其中1.2. x有相同的升级代码,但1.3. x有一个新的升级代码,允许并排安装。

听起来你要找点乐子了。

步胜
2023-03-14

我不能100%确定您是否希望提供不同版本/语言版本的应用程序,或者是否希望同时安装相同的安装程序。听起来你想实现后者。让我试着简要解释这两种情况。

首先是基础知识:

  • 包代码:标识一个唯一的MSI文件(因此每次重新编译时它应该总是改变)
  • 产品
  • 代码:标识唯一的产品版本。同一产品的不同口味(如英语、德语、法语版本)往往具有不同的产品代码。
  • 升级代码:标识一系列相关产品。本质上是一组产品代码。

不同的应用程序版本/语言:如果您想要安装不同语言版本的设置,比如您提供英语、法语和德语版本,您可以通过保持所有版本的升级代码相同来实现,但每个设置使用不同的产品代码和软件包代码。这使得每个安装程序都可以轻松地卸载另一个已经安装在计算机上的安装程序。

并行安装:我不喜欢这个概念,因为在我看来,它倾向于指示设置设计中的错误,但“实例转换”的概念应该能够实现您可能提到的内容。

<InstanceTransforms Property="INSTANCEID">
   <Instance Id="Install2" ProductCode="*" 
             UpgradeCode="guid-goes-here" ProductName="Product" />
</InstanceTransforms>
    < li>Wix文档-实例元素 < li >使用实例转换创作多个实例 < li >使用实例转换安装多个实例 < Li > WIX漫游(未经我测试) < Li > Windows Installer实例转换如何与升级交互? < li>MSI/WiX -在多个实例转换期间分配组件GUID
澹台锐
2023-03-14

为了回答“如何自动生成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)">

我实际上在类似模板的捆绑包中使用它来打包一些一次性包,我不希望它们相互关联。但是,我仍然希望他们有一个升级代码,以防我以后需要升级它们。

我不能说这是否是这个用例的最佳解决方案,但似乎是可行的。

 类似资料:
  • 我发布了一系列测试版的产品,用户在安装“最终公开发行版”之前必须删除这些版本。 在这种情况下,我通常会执行主要升级,但在这种情况下,由于产品的性质,主要升级太难实现。未来的升级从“干净的基线”开始会容易得多。 是否有一种内置的方式来检测和通知用户以前安装的版本必须卸载? 或者我是否需要向捆绑包添加一个进行检查、显示消息并使捆绑包失败的包? 如果与答案相关,那么所有以前的版本都有相同的专业。少数的修

  • 我正在从Udacity构建一个示例项目。到目前为止,这还可以正常工作,但升级到AndroidStudio 3.2.1后,我面临以下构建错误。 渐变版本:4.6 项目链接:https://github.com/udacity/ud851-Sunshine/tree/student/S02.02-Solution-Menus 我怎么才能修好它?

  • Kubernetes到目前为止基本保持三个月发行一个新版本的节奏,更新节奏可以说非常快,这一部分将主要跟踪kubernetes及其相关组件的更新与升级。

  • 我最近更新了我的项目的gradle版本,从2.14.1到3.0。从那以后,gradle构建每次都失败,出现以下错误: 错误:原因:org.gradle.api.internal.tasks.defaultTaskinputs$TaskinputUnionFileCollection无法强制转换为org.gradle.api.internal.file.Collections.defaultConf

  • 我经常手动修改空格、语句对齐和表格,而不是使用Ctrl+Alt+L来形成代码。然后,启动我的应用程序需要很长时间,因为Android Studio创建了一个新的构建,即使代码本身是相同的。 有办法改变这个设置吗?

  • 我已经用flutter在play store上发布了一个应用程序,现在我想上传一个新版本的应用程序。我正在尝试使用以下命令更改版本代码: flutter build apk--Build-Name=1.0.2--Build-Number=3 或者像这样更改local.properties