【问题标题】:Stuck on preserving config file in WIX major upgrade!坚持在 WIX 主要升级中保留配置文件!
【发布时间】:2011-02-15 15:46:23
【问题描述】:

啊! Wix 快把我逼疯了。

所以,我当然在 stackoverflow 和其他地方看到了许多关于 WiX 和重大升级的帖子。我使用 WiX 继承了这个软件项目,并正在发布一个新版本。我需要这个新版本只保留一个配置文件(如果存在),并替换其他所有文件。无论我到目前为止做了什么,这个安装程序都可以工作,新的 XML 文件在每次安装时都会替换旧的。甚至尝试使用 NeverOverwrite="yes",甚至尝试使用 OnlyDetect="no" 来回搞乱!我只是被困住了,谦卑地请求一些指导。需要保留的文件名为 SETTINGS.XML,位于 All Users->ApplicationData 目录中。这是(大部分)我的 .wxs 文件!

    <Package Id='$(var.PackageCode)'
             Description="Pathways Directory Software"
             InstallerVersion="301"
             Compressed="yes" />

    <WixVariable Id="WixUILicenseRtf" Value="License.rtf" />
    <Media Id="1" Cabinet="Pathways.cab" EmbedCab="yes" />

    <Upgrade Id="$(var.UpgradeCode)">
        <UpgradeVersion
            OnlyDetect="no"  
            Maximum="$(var.ProductVersion)"
            IncludeMaximum="no"
            Language="1033"
            Property="OLDAPPFOUND"
        />
        <UpgradeVersion
            Minimum="$(var.ProductVersion)"
            IncludeMinimum="yes"
            OnlyDetect="no"
            Language="1033"
            Property="NEWAPPFOUND"
        />
    </Upgrade>

        <!-- program files directory -->
        <Directory Id="ProgramFilesFolder">
            <Directory Id="INSTALLDIR" Name="Pathways"/>
        </Directory>

        <!-- application data directory -->
        <Directory Id="CommonAppDataFolder" Name="CommonAppData">
            <Directory Id="CommonAppDataPathways" Name="Pathways" />
        </Directory>

        <!-- start menu program directory -->
        <Directory Id="ProgramMenuFolder">
            <Directory Id="ProgramsMenuPathwaysFolder" Name="Pathways" />
        </Directory>

        <!-- desktop directory -->
        <Directory Id="DesktopFolder" />

    </Directory>

    <Icon Id="PathwaysIcon" SourceFile="\\Fileserver\Release\Pathways\Latest\Release\Pathways.exe" />

    <!-- components in the reference to the install directory -->
    <DirectoryRef Id="INSTALLDIR">
        <Component Id="Application" Guid="EEE4EB55-A515-4872-A4A5-06D6AB4A06A6">
            <File Id="pathwaysExe" Name="Pathways.exe" DiskId="1" Source="\\Fileserver\Release\Pathways\Latest\Release\Pathways.exe" Vital="yes" KeyPath="yes" Assembly=".net" AssemblyApplication="pathwaysExe" AssemblyManifest="pathwaysExe">
                <!--<netfx:NativeImage Id="ngen_Pathways.exe" Platform="32bit" Priority="2"/> -->
            </File>

            <File Id="pathwaysChm" Name="Pathways.chm" DiskId="1" Source="\\fileserver\Release\Pathways\Dependencies\Pathways.chm" />

            <File Id="publicKeyXml" ShortName="RSAPUBLI.XML" Name="RSAPublicKey.xml" DiskId="1" Source="\\fileserver\Release\Pathways\Dependencies\RSAPublicKey.xml" Vital="yes" />
            <File Id="staticListsXml" ShortName="STATICLI.XML" Name="StaticLists.xml" DiskId="1" Source="\\fileserver\Release\Pathways\Dependencies\StaticLists.xml" Vital="yes" />

            <File Id="axInteropMapPointDll" ShortName="AXMPOINT.DLL" Name="AxInterop.MapPoint.dll" DiskId="1" Source="\\fileserver\Release\Pathways\Dependencies\AxInterop.MapPoint.dll" Vital="yes" />
            <File Id="interopMapPointDll" ShortName="INMPOINT.DLL" Name="Interop.MapPoint.dll" DiskId="1" Source="\\fileserver\Release\Pathways\Dependencies\Interop.MapPoint.dll" Vital="yes" />
            <File Id="mapPointDll" ShortName="MAPPOINT.DLL" Name="MapPoint.dll" DiskId="1" Source="\\fileserver\Release\Pathways\Dependencies\Interop.MapPoint.dll" Vital="yes" />

            <File Id="devExpressData63Dll" ShortName="DAAT63.DLL" Name="DevExpress.Data.v6.3.dll" DiskId="1" Source="\\fileserver\Release\Pathways\Dependencies\DevExpress.Data.v6.3.dll" Vital="yes" />
            <File Id="devExpressUtils63Dll" ShortName="UTILS63.DLL" Name="DevExpress.Utils.v6.3.dll" DiskId="1" Source="\\fileserver\Release\Pathways\Dependencies\DevExpress.Utils.v6.3.dll" Vital="yes" />
            <File Id="devExpressXtraBars63Dll" ShortName="BARS63.DLL" Name="DevExpress.XtraBars.v6.3.dll" DiskId="1" Source="\\fileserver\Release\Pathways\Dependencies\DevExpress.XtraBars.v6.3.dll" Vital="yes" />
            <File Id="devExpressXtraNavBar63Dll" ShortName="NAVBAR63.DLL" Name="DevExpress.XtraNavBar.v6.3.dll" DiskId="1" Source="\\fileserver\Release\Pathways\Dependencies\DevExpress.XtraNavBar.v6.3.dll" Vital="yes" />
            <File Id="devExpressXtraCharts63Dll" ShortName="CHARTS63.DLL" Name="DevExpress.XtraCharts.v6.3.dll" DiskId="1" Source="\\fileserver\Release\Pathways\Dependencies\DevExpress.XtraCharts.v6.3.dll" Vital="yes" />
            <File Id="devExpressXtraEditors63Dll" ShortName="EDITOR63.DLL" Name="DevExpress.XtraEditors.v6.3.dll" DiskId="1" Source="\\fileserver\Release\Pathways\Dependencies\DevExpress.XtraEditors.v6.3.dll" Vital="yes" />
            <File Id="devExpressXtraPrinting63Dll" ShortName="PRINT63.DLL" Name="DevExpress.XtraPrinting.v6.3.dll" DiskId="1" Source="\\fileserver\Release\Pathways\Dependencies\DevExpress.XtraPrinting.v6.3.dll" Vital="yes" />
            <File Id="devExpressXtraReports63Dll" ShortName="REPORT63.DLL" Name="DevExpress.XtraReports.v6.3.dll" DiskId="1" Source="\\fileserver\Release\Pathways\Dependencies\DevExpress.XtraReports.v6.3.dll" Vital="yes" />
            <File Id="devExpressXtraRichTextEdit63Dll" ShortName="RICHTE63.DLL" Name="DevExpress.XtraRichTextEdit.v6.3.dll" DiskId="1" Source="\\fileserver\Release\Pathways\Dependencies\DevExpress.XtraRichTextEdit.v6.3.dll" Vital="yes" />

            <RegistryValue Id="PathwaysInstallDir" Root="HKLM" Key="Software\Tribal Data Resources\Pathways" Name="InstallDir" Action="write" Type="string" Value="[INSTALLDIR]" />
        </Component>

    </DirectoryRef>

    <!-- application data components -->
    <DirectoryRef Id="CommonAppDataPathways">

        <Component Id="CommonAppDataPathwaysFolderComponent" Guid="087C6F14-E87E-4B57-A7FA-C03FC8488E0D">
            <CreateFolder>
                <Permission User="Everyone" GenericAll="yes" />
            </CreateFolder>

            <RemoveFolder Id="CommonAppDataPathways" On="uninstall" />
            <RegistryValue Root="HKCU" Key="Software\TDR\Pathways" Name="installed" Type="integer" Value="1" KeyPath="yes" />
            <File Id="settingsXml" ShortName="SETTINGS.XML" Name="Settings.xml" DiskId="1" Source="\\fileserver\Release\Pathways\Dependencies\Settings\settings.xml" Vital="yes" />
        </Component>

        <Component Id="Database" Guid="1D8756EF-FD6C-49BC-8400-299492E8C65D">
            <File Id="pathwaysMdf" Name="Pathways.mdf" DiskId="1" Source="\\fileserver\Shared\Databases\Pathways\SystemDBs\Pathways.mdf" />
            <RemoveFile Id="pathwaysLdf" ShortName="Pathways.ldf" Name="Pathways_log.LDF" On="uninstall" />
        </Component>

    </DirectoryRef>

    <!-- shortcut components -->
    <DirectoryRef Id="DesktopFolder">
        <Component Id="DesktopShortcutComponent" Guid="1BF412BA-9C6B-460D-80ED-8388AC66703F">
            <Shortcut Id="DesktopShortcut"
                      Target="[INSTALLDIR]Pathways.exe"
                      Name="Pathways"
                      Description="Pathways Tribal Directory"
                      Icon="PathwaysIcon"
                      Show="normal"
                      WorkingDirectory="INSTALLDIR" />
            <RegistryValue Root="HKCU" Key="Software\TDR\Pathways" Name="installed" Type="integer" Value="1" KeyPath="yes"/>
        </Component>
    </DirectoryRef>

    <DirectoryRef Id ="ProgramsMenuPathwaysFolder">
        <Component Id="ProgramsMenuShortcutComponent" Guid="83A18245-4C22-4CDC-94E0-B480F80A407D">
            <Shortcut Id="ProgramsMenuShortcut" Target="[INSTALLDIR]Pathways.exe" Name="Pathways" Icon="PathwaysIcon" Show="normal" WorkingDirectory="INSTALLDIR" />
            <RemoveFolder Id="ProgramsMenuPathwaysFolder" On="uninstall"/>
            <RegistryValue Root="HKCU" Key="Software\TDR\Pathways" Name="installed" Type="integer" Value="1" KeyPath="yes"/>
        </Component>
    </DirectoryRef>


    <Feature Id="App" Title="Pathways Application" Level="1" Description="Pathways software" Display="expand" ConfigurableDirectory="INSTALLDIR" Absent="disallow" AllowAdvertise="no" InstallDefault="local">
        <ComponentRef Id="Application" />
        <ComponentRef Id="CommonAppDataPathwaysFolderComponent" />
        <ComponentRef Id="ProgramsMenuShortcutComponent" />
        <Feature Id="Shortcuts" Title="Desktop Shortcut" Level="1" Absent="allow" AllowAdvertise="no" InstallDefault="local">
            <ComponentRef Id="DesktopShortcutComponent" />
        </Feature>
    </Feature>


    <Feature Id="Data" Title="Database" Level="1" Absent="allow" AllowAdvertise="no" InstallDefault="local">
        <ComponentRef Id="Database" />
    </Feature>

    <!-- <UIRef Id="WixUI_Minimal" /> -->
    <UIRef Id ="WixUI_FeatureTree"/>
    <UIRef Id="WixUI_ErrorProgressText"/>

    <UI>
        <Error Id="2000">There is a later version of this program installed.</Error>
    </UI>

    <CustomAction Id="NewerVersionDetected" Error="2000" />

    <InstallExecuteSequence>
        <RemoveExistingProducts After="InstallFinalize"/>
    </InstallExecuteSequence>

</Product>

【问题讨论】:

  • 你排序了吗?您的组件不符合最佳实践。每个组件应该只使用一个二进制文件。为避免出现问题,对于小型项目,我建议每个文件使用一个组件。如果您知道自己在做什么和/或您的设置很大,请仅将多个文件放在一个组件中。由于 Windows 安装程序的性质,在您更改组件创建之前,您将无法自动正确保存 settings.xml 文件。您需要编写自定义操作以在安装序列的早期备份设置文件,然后在安装后将其放回原处。

标签: wix settings upgrade


【解决方案1】:

您可能需要做的第一件事是在您的 CommonAppDataPathwaysFolderComponent 组件中删除那个 RemoveFolder。那将删除您的目录及其包含的所有内容(包括 settings.xml)。重新添加 neveroverwrite,看看会发生什么。

您使用的是哪个版本的 wix? 3对吗?

【讨论】:

    【解决方案2】:

    Windows 安装程序仅在密钥路径尚不存在或指向较低版本的文件时安装组件。在单文件组件的典型情况下,wix 默认使用该文件作为 keypath。在这种情况下,CommonAppDataPathwaysFolderComponent 组件的键路径是一个注册表键;它已被明确标记为 keypath=yes 属性。

    您安排在安装新版本后卸载旧版本。因此,如果此组件的 keypath 与旧版本和新版本相同,那么一切都应该按照您的意愿进行。

    它不起作用的事实意味着您已经更改了组件的键路径。显然旧的安装程序没有将“Software\TDR\Pathways, Installed=1”值写入注册表。新的安装程序会查找此注册表项,但没有找到,并决定安装 CommonAppDataPathwaysFolderComponent - 在此过程中覆盖旧的 SETTINGS.XML 文件。

    【讨论】:

      【解决方案3】:

      在测试中运行您的代码时,我收到了这个警告

      警告 LGHT1076:ICE57:组件 'CommonAppDataPathwaysFolderComponent' 拥有每个用户和每台机器 带有 HKCU Registry KeyPath 的数据。

      和 运行代码时日志文件中的错误是这样的

      C:\文档和设置\所有 用户\应用程序 数据\路径\设置.xml;覆盖;惯于 修补;现有文件未版本化 并且未修改 - 哈希不匹配 源文件

      这表示 xml 文件组件具有每个机器数据(xml 文件)和每个用户的注册表键路径。

      使用 xml 文件作为组件的 keypath,如下所示:

      <Component Id="CommonAppDataPathwaysFolderComponent" Guid="087C6F14-E87E-4B57-A7FA-C03FC8488E0D">
          <CreateFolder>
              <Permission User="Everyone" GenericAll="yes" />
          </CreateFolder>
      
          <RemoveFolder Id="CommonAppDataPathways" On="uninstall" />
          <File Id="settingsXml" KeyPath="yes" ShortName="SETTINGS.XML" Name="Settings.xml" DiskId="1" Source="\\fileserver\Release\Pathways\Dependencies\Settings\settings.xml" Vital="yes" />
      </Component>
      

      这将使 Windows Installer 在决定是否替换此文件时使用未版本控制的文件比较。

      您在 InstallFiles 操作之后正确安排了 RemoveExistingProducts 操作,以确保在删除旧版本之前安装新版本。

      【讨论】:

      • 尝试这样做确实消除了轻微错误,但问题仍然存在,设置文件被替换。而且,我需要替换的 MDF 和 LDF 文件还在。
      • 我想知道是不是因为旧安装的版本组件与新安装的组件不同,它的密钥路径不同,因此需要重新安装。如果是这种情况,那么除了将文件复制到临时位置然后在安装完所有内容后返回的自定义操作之外,您无能为力。
      • 请参阅我的帖子作为此问题的答案。关闭了!将设置放入它自己的组件中有所帮助,现在的问题是数据库也被保留了,需要更换!谢谢!
      猜你喜欢
      • 2018-03-26
      • 1970-01-01
      • 1970-01-01
      • 2014-06-14
      • 2014-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-14
      相关资源
      最近更新 更多