【问题标题】:Visual Studio Setup Project - conditionally install fileVisual Studio 安装项目 - 有条件地安装文件
【发布时间】:2010-12-17 18:42:33
【问题描述】:

我有一个 VS 2008 安装项目。如果目标系统上尚不存在 XML 文件,我只想安装它。安装程序会为非版本化文件覆盖rules,确保文件在在目标系统上未被修改时永远不会被覆盖。但我想从不覆盖该文件。可以在文件的 Visual Studio 安装程序属性中为文件设置 Condition 属性。 Condition 属性检查文件是否存在并仅在文件不存在时才安装的正确语法是什么?

【问题讨论】:

    标签: visual-studio installation setup-project


    【解决方案1】:

    您需要转到“启动条件”选项卡并在目标计算机上搜索要检查的文件。启动条件将让您指定属性的名称,如果文件存在,它将设置为文件的路径,否则将为空。您现在可以将此属性用作文件的条件。

    【讨论】:

    • 你测试过这个吗?搜索在目标文件夹下名为 ConfigurationSettings 的文件夹中找不到我的文件 ApplicationSettings.config。我设置名称 = 搜索应用程序设置,深度 = 3(也尝试了 1 和 2),文件名 = ApplicationSettings.config,文件夹 = [TARGETDIR] 和属性 = FILEEXISTS1。为了调试,我在欢迎屏幕上显示 FILEEXISTS1,它是空的。 (不过文件在那里)。
    • 我认为 VS Setup 项目不支持此功能。 TARGETDIR 通常在执行搜索之后的成本计算期间解决。所以搜索不能使用 TARGETDIR。通常解决方案是在计算成本后移动 AppSearch 操作(例如使用 Orca)或使用 InstallUISequence 自定义操作来执行搜索并在计算成本后设置属性。
    • 是的,TARGETDIR 在搜索时未解析。奇怪的是,UI 在下拉菜单中显示了这个选项。当我在 ProgramFilesFolder 下搜索时,文件搜索有效。但这是一个过于笼统的搜索。我最终使用了 Windows Installer Search,按组件 ID。这有点棘手,但非常具体并且效果很好。我会发布详细信息。
    【解决方案2】:

    我能够使用启动条件来设置属性,并将其用于文件的有条件安装,因此我将“heavyd”标记为正确答案。但是,正如所建议的那样,无法有效地使用文件搜索(请参阅答案中的 cmets)。相反,我使用了带有 MSI ComponentID 的 Windows Installer Search(VS 2008 安装项目中可用的三种搜索类型之一),如下所示(我发现了技术here):

    1. 产品 1 已安装并且有一个名为 MyFile.txt 的文件。
    2. 您使用 ORCA(来自 Windows Installer SDK)查看文件表,并找到代表 MyFile.txt 的行。
    3. 您获取 Component_ 列的值,然后打开 Component Table。
    4. 在 Component Table 中,您可以在 Component 列中找到具有 Component_ 值的行,并获取 ComponentID。将此值复制到剪贴板。关闭 ORCA。
    5. 在您的安装项目中,打开启动条件编辑器并添加 Windows Installer 组件搜索。对于新搜索的 ComponentID 属性,粘贴 ComponentID。
    6. 复制 Property 属性。它应该类似于 COMPONENTEXISTS1。
    7. 打开文件系统编辑器并选择应用程序文件夹,然后选择您要有条件地安装的文件。
    8. 将 Condition 属性编辑为 COMPONENTEXISTS1 = FALSE。
    9. 如果您希望在每次运行安装程序时(不仅仅是第一次)都评估条件,请将 Transitive 属性设置为 true。
    10. 现在,MyFile.txt 只有在它不存在时才会安装。

    这种技术有一个警告:对安装进行修复会导致文件被删除,即使该文件被标记为永久!不好。我通过添加一些自定义操作(调用 vbscript 文件)来备份和恢复我的文件来解决这个问题。

    完成如此简单的任务真是太麻烦了:在初始安装时安装一次文件,然后再也不会覆盖它。

    如果有人有更好的解决方案,我会全力以赴。

    【讨论】:

      猜你喜欢
      • 2022-10-15
      • 2012-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多