Wix RemoveFile和RemoveFolder用于删除剩余物

时间:2015-02-12 05:45:52

标签: wix windows-installer installer

我有以下wix文件,它应该在安装过程中调用自定义操作。自定义操作将创建程序所需的一些文件。由于Wix只会删除安装程序安装的那些文件,因此自定义操作创建的文件将是剩余的。所以我使用Wix提供的 RemoveFile

我关注了Wix文件。

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="*" Name="WixCustomAction" Language="1033" Version="1.0.0.0" Manufacturer="Sarvagya" UpgradeCode="1d77ebdc-2ba2-4b34-b013-7c8a8adcef5b">
    <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />

    <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
    <MediaTemplate EmbedCab="yes"/>

    <Feature Id="ProductFeature" Title="WixCustomAction" Level="1">
        <ComponentGroupRef Id="ProductComponents" />
  <!--<ComponentGroupRef Id="RemoveLeftOvers" />-->
</Feature>
</Product>

<Fragment>
    <Directory Id="TARGETDIR" Name="SourceDir">
        <Directory Id="WindowsVolume">
            <Directory Id="INSTALLFOLDER" Name="LearningWix" />
        </Directory>
    </Directory>
</Fragment>

<Fragment>
    <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
  <Component Id="SomeDLL">
    <File Source="C:\boost_1_55_0_dyn\stage\lib\boost_atomic-vc100-mt-1_55.dll" />
  </Component>
  <Component Id="RemovingFiles">
    <RemoveFile Id="ConfigRemove" Name="lpa.config" On="uninstall"/>
    <RemoveFile Id="LogsRemove" Name="*.log" On="uninstall"/>
    <RemoveFile Id="ProductCodeRemove" Name="productcode.txt" On="uninstall"/>
  </Component>
    </ComponentGroup>    
<Binary Id="SetupCA"  SourceFile="..\LearnCustomAction\bin\Release\LearnCustomAction.CA.dll"/>
<CustomAction Id="FileWrite" Execute="immediate" BinaryKey="SetupCA" DllEntry="WriteFileToDisk" />
<InstallExecuteSequence>
  <Custom Action="FileWrite" Before="InstallFinalize"></Custom>
</InstallExecuteSequence>
</Fragment>

自定义操作会创建文件 lpa.config productcode.txt 。应用将创建 output.log,output.1.log,... 。但在编译期间,我收到以下错误

The Component/@Guid attribute's value '*' is not valid for this component because it does not meet the criteria for having an automatically generated guid. Components using a Directory as a KeyPath or containing ODBCDataSource child elements cannot use an automatically generated guid. Make sure your component doesn't have a Directory as the KeyPath and move any ODBCDataSource child elements to components with explicit component guids.

我应该如何正确使用 RemoveFile 删除残羹剩饭?我提到this但没有帮助。

更新

我通过在Component标记中添加GUID来解决此问题。现在在上面的代码中添加RemoveFolder时,例如:

    <RemoveFolder Id="LeftOverAppsRemove" On="uninstall" Directory="apps"/>
    <RemoveFolder Id="LeftOverTempRemove" On="uninstall" Directory="temp"/>

我遇到问题Unresolved reference to symbol 'Directory:apps' in section 'Fragment:'。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

您只能使用RemoveFolder元素删除空文件夹,以免获得太多帮助。 如果您有一个在应用程序目录中创建文件的CustomAction,我建议您不要为这些创建RemoveFile元素。通常情况下,您将在应用程序目录中创建包含可处理数据的子文件夹,并且您必须为添加到目录的每个文件创建删除元素。懒惰的方法是使用RemoveFolderEx Element。如该页面所述,您必须使用Remember property pattern来完成此工作。 以下是如何实现这两种技术的示例:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
  <Fragment>
    <ComponentGroup Id="CommonFiles" Directory="INSTALLFOLDER">
        <Component Id="SomeDLL" Guid="PUT-GUID-HERE">
          <File Source="C:\boost_1_55_0_dyn\stage\lib\boost_atomic-vc100-mt-1_55.dll" />
          <util:RemoveFolderEx Id="RemoveAdditionalFiles" On="uninstall" Property="REMOVAL"/>
        </Component>
        <Component>
          <RegistryValue Root="HKCU" Key="SOFTWARE\YOURCOMPANY\YOURPRODUCT" Name="CompleteRemoval" Value="[INSTALLFOLDER]" Type="string"/>
          <RemoveFolder Id="Cleanup" On="uninstall"/>
        </Component>
    </ComponentGroup>
    <Property Id="REMOVAL">
      <RegistrySearch Id="RemovalProperty" Root="HKCU" Key="SOFTWARE\YOURCOMPANY\YOURPRODUCT" Name="CompleteRemoval" Type="raw" />
    </Property>
    <CustomAction Id='SaveCmdLineValue' Property='REMOVAL_CMD'
      Value='[REMOVAL]' Execute='firstSequence' />
    <CustomAction Id='SetFromCmdLineValue' Property='REMOVAL'
      Value='[REMOVAL_CMD]' Execute='firstSequence' />
    <InstallUISequence>
      <Custom Action='SaveCmdLineValue' Before='AppSearch' />
      <Custom Action='SetFromCmdLineValue' After='AppSearch'>REMOVAL_CMD</Custom>
    </InstallUISequence>
    <InstallExecuteSequence>
      <Custom Action='SaveCmdLineValue' Before='AppSearch' />
      <Custom Action='SetFromCmdLineValue' After='AppSearch'>REMOVAL_CMD</Custom>
    </InstallExecuteSequence>
  </Fragment>
</Wix>