正在安装未选择的功能

Unselected Feature Being Installed

我在工作中被推到 DevOps 职位,对 InstallShield 或我正在做的事情知之甚少。我所学到的一切都是通过阅读和阅读 Flexera 的文档学到的。我们的一张票是一个问题,我在谷歌搜索时无法找到结果 - 我可能使用了错误的搜索词,但不知道正确的词是什么。

基本上,我们的安装程序有一大堆功能。其中一些功能具有子功能,如果您 select 主要功能,则始终会安装这些子功能。一切都设置为默认安装,但您可以禁用任何功能。如果您愿意,它们应该是完全独立的。功能 1 的子功能在安装程序中可见(虽然您不能删除select它们,或者 select 它们与功能 1 分开),但功能 4 则不是。

|- FEATURE 1
|---- FEATURE A
|---- FEATURE B
|---- FEATURE C
|- FEATURE 2
|- FEATURE 3
|- FEATURE 4
|---- FEATURE D
|---- FEATURE E
|---- FEATURE F
| ...

功能 F 下只有一个组件。该组件安装了一大堆 DLL 和配置文件——这不是最佳实践,但也不是我可以在此问题范围内更改的内容。查看组件的功能列表时,它仅设置为功能 F。它 - 以及它包含的文件夹 - 在查看任何其他功能的文件时不会显示。

当您 select 功能 1 作为唯一选项时,正在安装功能 F。其他功能也可能会发生这种情况,但功能 1 安装速度最快,因此经过最多测试。

这是一个基本的 MSI 项目。我试图通过将 'Create MSI Logs' 选项设置为是来让 InstallShield 创建日志,但是当我 运行 通过 运行 [=24] 的测试安装时它没有生成日志文件=].我浏览了 UI 和执行安装序列中的脚本,它看起来不像是 selecting Feature F.

我是否遗漏了一个特征可以相互链接的地方 - 如果是,在哪里?

短版

  • Feature F 可能被设置为 Feature 1(可能还有其他人)的必需功能。
  • 请检查 Feature 1Required Features 值。
  • 为此,只需转至功能视图并 select Feature 1 - 然后查看 Required Features 值。如果 Feature F 列在那里,那将导致您看到的行为。

错误,错误 - 黑客帝国找到了你:-):我写了一篇关于如何使用 select 功能的长篇回答对于 Basic MSI projects,ion 会受到很多因素的影响,但再次阅读您的问题我几乎确信这是一个 Installscript MSI project 而不是 Basic MSI project,原因是功能对话框行为你描述的。

Installscript MSI: Installshield 应用程序的左上角 window 将显示项目类型。它会说:"My Project Name-1 - Installshield [InstallScript MSI Project]。你能证实它说的是什么吗? (最后一部分 - 括号内 - 是关键)。在这两种项目类型中,功能的处理方式大不相同。 Installscript MSI projects 具有自定义 Installshield 对话框(Win32 对话框),相对于 Basic MSI projects 的标准 Windows 安装程序对话框(在表中定义)。我非常不喜欢 Installscript MSI 项目 - 我发现它们有问题,但它们确实有一些不错的功能。我不会使用它们。主观意见。基本 MSI 项目是标准 MSI 文件,更适合企业部署。

"Required Features": 当您在 Installshield 中查看 Installscript MSI project 的功能视图时,您有更多比 Basic MSI project 可用的选项。 Required Features 设置特别包装了很多功能以允许功能相互依赖 - 在 Basic MSI 项目中必须由您自己以完全不同的方式实现的东西方法。该字段是您所看到的 selection 行为特征的关键 - 我非常确定这一点。请参阅下面的建议方法。

Logging:为了启用日志记录,请尝试打开您的项目,然后转到 Build => Settings... => MSI Log File,现在单击 All Error MessagesVerbose Output 并在 Log File 框中键入文件名。单击 OK。现在尝试构建并 运行 您的项目。

总结:

  1. 我会验证项目类型到底是什么。 Installscript MSI - 可能。
  2. 在确认它是一个 Installscript MSI 项目后,我将打开 Feature view 并依次检查每个功能的 Required Features 值。
  3. 我的猜测是所有逻辑都是来自 Installshield 的 "automagic" - 您只需通过调整“Required Features”值来为每个功能定义它需要的其他功能.
  4. 似乎只要您不需要任何其他逻辑,Installshield 就会处理 selection "automagically" 功能,您将获得功能齐全的功能 select离子对话框 - 如果您已正确定义功能依赖性。
  5. 我没有对 Installscript MSI 对话框进行任何自定义,所以我不能真正帮助你,但我很确定调整“Required Features”值应该是一个很好的起点来弄清楚你需要什么。
  6. 能否请您也查看 Installscript view 以查看是否有任何与 GUI 相关的自定义代码?您可能还想检查 Custom Actions & Sequences 视图 - 检查以其他方式(VBScripts、PowerShell、JavaScript 等)实现的任何自定义逻辑。

尝试的具体答案:

Custom Actions:根据可用信息(0 个条件),我假设一个或多个 custom actions 用于实现您上面描述的功能逻辑。我想您应该能够在项目的 Installscript view 中找到自定义操作代码? (在 Custom actions view 中有关联的自定义操作条目)。

也有可能没有使用Installscript,但是逻辑是用其他语言实现的(VBScriptC++JavaScriptPowerShell等...) - 在这种情况下,您应该直接转到 Custom actions view 并寻找嫌疑人。源可以嵌入自定义操作(脚本)中,或存储在其他地方(C++ 总是如此)。

Logging:为了启用日志记录,请尝试打开您的项目,然后转到 Build => Settings... => MSI Log File,现在单击 All Error MessagesVerbose Output 并在 Log File 框中键入文件名。单击 OK。现在尝试构建并 运行 您的项目。 Here is how to enable logging using msiexec.exe(在 Installshield 之外)。具体例子;最简单形式的日志记录命令:

msiexec.exe /i C:\Path\Your.msi /L*v C:\Your.log

更新I found this sample in Installshield's KDB (Q208877) (KDB)。它使用了一些非常奇怪的特征 selection 技术 - 请参阅实际文章了解详细信息。有一个可下载的 ISM 文件。

我无法从 Wayback 中恢复上述 link。但是,也许这是同一篇文章:Change Installation State of a Feature, Based on Another Feature's Selection State.

A slightly better approach in my view is here。您的设置 可以 使用其中的一些技术。 link 也没有在档案中找到。


尝试的一般答案:

有一整套可以影响特征 selection 的机制,如下所示。以下主要针对 Basic MSI 项目,对于 Installscript MSI 项目,还有更多机制可用 - 主要是 Installscript 函数。在列表之前,一些重要的花絮:

  • 特征名称区分大小写!
  • 下面不同的机制肯定会互相干扰

现在是列表。据我所知,feature selection 可能会受到(至少)以下机制的影响:

  1. 标准msiexec.exe命令行
  2. 用户交互设置 GUI
    • MSI GUI 功能selection 对话框(如果在设置中可用)。
    • 一些设置(不是全部)有一个“自定义”对话框,允许用户select安装和不安装哪些功能。
    • 可见特征会受到直接影响(及其子特征 - 可见与否 - depending on feature configuration - 搜索 msidbFeatureAttributesFollowParent)。
    • 在某些设置中可以设置多种可能的功能状态。宣传功能、安装功能、不安装功能等...
    • 设置 GUI 中可能有自定义操作 运行ning,它会影响功能 select离子状态 (请参阅下面的自定义操作部分)。
      • 例如,基于用户交互 select 一个功能,那么其​​他功能可以 selected - 或取消 selected.
      • 对于 Installscript MSI 设置,其逻辑是内置的(也可自定义)。对于 Basic MSI 设置,可以执行类似的操作,但可用的 automagic 较少。
  3. INSTALLLEVEL
    • 这个强制设置属性应该被提及。它是确定是否要安装特定功能的基线。每个设置都有一个 INSTALLLEVEL.
    • 每个 feature 都有自己的 level 属性,如果将其 level 属性设置为等于或更低的数字,将安装该功能比设置的整体 INSTALLLEVEL.
    • 因此,可以通过调整设置的 INSTALLLEVEL.
    • 来影响多个功能的请求安装状态
    • 一个不好但并不少见的做法是最大输出 INSTALLLEVEL 到 32767 以强制安装所有功能。这是错误的,因为某些功能可能与系统不兼容(错误系统的错误文件)。
  4. Feature Conditions
    • 如前所述,所有功能都有一个 级别属性 ,可以通过在 运行 时间评估的条件语句进行操作。
    • 这与上一点有关,但恰恰相反:现在我们正在更改每个特征的级别属性,而不是设置自己的基线特征级别 (INSTALLLEVEL)。
    • 查看 Feature Table 中的 级别列
    • 实际的条件逻辑在Condition table using Conditional Statement Syntax中。因此会评估条件,如果它们评估为真,则会影响功能的安装级别。
    • AppSearch可以涉及设置构成特征条件的属性。
    • 对于每个功能,如果功能的安装级别低于或等于设置的 INSTALLLEVEL property,则功能设置为安装。
  5. 自定义操作
  6. MigrateFeatureStates
    • 最后想提一下MigrateFeatureStates。一个标准的 MSI 操作,它将尝试在主要升级场景中“重现”安装状态 selected 在您的原始安装中。
    • 根据 Upgrade table 中的设置,可以为设置启用或禁用 [​​=149=]MigrateFeatureStates - 因此它可以在不同的环境中以不同方式影响功能状态设置。
    • PhilDW 提醒我 .

一些链接:

  • 推荐:这里是各种特征操作的简短说明:
  • 有关功能的更多信息:有一个名为“2.MSI 功能”的部分在这个涉及不同主题的长答案中(WiX), but the logic is generic with regards to features - it tries to explain feature conditions: Wix Installer : Setting component condition property when doing a MSIEXEC admin install at command line
  • 一些相关的回答: