【问题标题】:Create a .config folder in the user folder在用户文件夹中创建一个 .config 文件夹
【发布时间】:2018-02-08 22:21:58
【问题描述】:

安装程序时,我想在用户文件夹中创建一个.config 文件夹。 例如:

C:\Users\MyUser\.config

这是我尝试过的,但它不起作用:

<Directory Id="USERPROFILEFOLDER" Name="[%USERPROFILE]">
 <Directory Id="ConfigUserFolder" Name=".config">
   <Directory Id="UserConfig" Name="Config" >
     <Component Id="ConfigFolder" Guid="GUID">
       <RemoveFolder Id='RemoveConfig' Directory='UserConfig' On='uninstall' />
       <RemoveFolder Id='RemoveConfigUserFolder' Directory='ConfigUserFolder' On='uninstall' />
       <RegistryValue Root='HKCU' Key='Software\MySoftware' Type='string' Value='' KeyPath='yes' />
     </Component>
  </Directory>
 </Directory>
</Directory>

<Property Id="USERPROFILEFOLDER" />

知道我错过了什么/做错了什么吗?

【问题讨论】:

    标签: wix windows-installer


    【解决方案1】:

    此应用程序是否是常规可执行文件?还是某种网络应用程序或插件?换句话说:它有自己的启动顺序吗?

    这个建议听起来有点破纪录,但是:用户配置文件文件夹(和 HKCU 设置)中的文件夹和文件最好在应用程序启动时创建,而不是在安装过程中创建

    只需将此构造排除在您的设置之外,并使您的应用程序更智能,并能够在启动时为每个用户创建此文件夹 - 并且能够将任何数据文件从您的主只读模板位置复制到该文件夹​​中%ProgramFiles%安装文件夹。

    我之前写了一篇关于用户特定文件和设置部署问题的完整文章:Create folder and file on Current user profile, from Admin Profile。我描述了诸如 MSI 自我修复和主动设置之类的选项 - 并列出了一些关于它们不可靠的详细信息(并提出了一些可能更好的方法)。

    我想说:消除复杂性和错误来源留在熟悉的领域。避免高级设置功能,因为它们难以调试的性质以及不寻常和不熟悉的复杂性。 什么与您的问题相关避免通过安装程序完成每个用户的部署


    以上基本上就是所有要说的,但在这里充实它是使用应用程序启动顺序而不是为每个用户设置设置的主要原因:

    1. 可预测性和可靠性:这种方法可靠地为启动您的应用程序的任何用户创建文件夹 - 无需依赖 Windows Installer 将每个用户的文件和文件夹放置到位.

      • 可以通过策略阻止 Windows Installer 自我修复在某些计算机(例如终端服务器)上运行,并且您的文件夹将永远不会为未运行原始安装的用户创建。

      • 如果您还想安装用户特定文件(而不仅仅是文件夹),那么用户指定文件和设置的 MSI 部署充其量是不可靠的,并且容易意外覆盖文件和设置 (REINSTALLMODE = amus - 强制覆盖)以及意外卸载设置文件导致的用户设置和数据丢失,这些设置文件旨在永久保存,但未标记为此类(意外)。这会导致很多问题。

      • 非常技术性,但 MSI 的组件 GUID 概念在用于引用可能多次安装的计数文件时在概念上会发生故障。

    2. 实施和调试:应用程序启动顺序是“只是常规代码”,而 Windows Installer 和部署对于许多开发人员来说可能是陌生的领域.因此,您可以避免 the complexity of deployment 导致的意外问题(在 WiX 历史背景下编写的部署复杂性的简介)。

      • 如果您进入具有非常“阴谋复杂性”的复杂排序、模拟和条件反射方面的自定义操作(问题不是立即显而易见,但在最不方便时会浮出水面),则尤其如此。

      • 您的应用程序启动顺序具有可预测的用户上下文、对用户环境的完全访问权限以及可通过错误和警告消息获得的交互性。只需重新启动应用程序即可轻松调试问题,而不是编译和运行设置(并在自定义操作的情况下附加调试器 - 远远超出您的问题范围)。

      • 您避免了安装程序的“一次性”性质和调试困难,因为总体上部署错误的难以重现的性质(无法访问问题系统、通常缺少日志记录、难以清理先前的错误)。对于启动序列,您只需让用户重新启动应用程序并报告看到的错误 - 或检查事件日志或任何其他可用的日志记录。

      • 根据我的经验,QA 人员通常比部署功能更有经验测试应用程序启动序列。

      • 我可能会让应用程序调试听起来“过于乐观”,但相信我,这确实比部署调试更容易。

    3. 设置管理:您的应用程序的启动序列可以(更)可靠地对您的数据和设置文件执行任何形式的“维护”,而这是无法可靠地完成的设置。

      • 这些通常是“资源文件”而不是数据文件 - 换句话说,程序运行期间使用的模板和设置 - 不仅仅是用户创建的内容(有时还需要“清理” - 但你可以这样做文件打开而不是应用程序启动)。

      • 您想修复为每个用户重复的文件中的某些内容

        • 泄露元文件图片
        • 数据文件错误和故障
        • 真的只是每个用户设置引起的错误......
      • 强制执行新的强制设置
        • 将文件移动到新位置或备份它们
        • 删除不再有效(或错误地未加密)的设置
        • 从 HKCU 中删除导致应用程序崩溃的二进制流
      • 关于设置如何“标记”系统以激活应用程序的“启动序列维护功能”的说明:http://forum.installsite.net/index.php?showtopic=21552(2019 年 2 月转换为 WayBack Machine 链接)。

    一个设置基本上应该做任何需要提升权限的事情,大多数其他事情 - 在您的应用程序中进行 - 并且某些提升的事情实际上可以随着时间的推移作为服务运行 - 它没有困扰的排序、条件或模拟变量部署。

    【讨论】:

      【解决方案2】:

      要使用 WiX 执行此操作,您需要使用父组件下的 CreateFolder 元素。这和这个问题差不多:

      how to create folder in Wix?

      在我看来,作为一种更好的做法,您应该使用标准的 Windows Installer 文件夹属性作为位置。完整列表在这里:

      https://msdn.microsoft.com/en-us/library/windows/desktop/aa370905(v=vs.85).aspx#system_folder_properties

      例如 ProgramFiles64Folder、AppDataFolder(这可能是您的目录的最佳位置)、CommonAppDataFolder 等等。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-11
        • 2019-02-21
        • 1970-01-01
        • 1970-01-01
        • 2018-08-09
        • 2015-01-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多