Wix property evaluation

2019-03-04 14:58发布

问题:

How to use FileSearch result as condition in Component section. I want to get something like this:

    <Property Id=\"CONFIG_XML_EXISTS\">
        <DirectorySearch Id="CheckForConfigXml" Path="[INSTALLDIR]\">'
           <FileSearch Id="ConfigXmlSearch" Name="config.xml" />
        </DirectorySearch>
    </Property>
    ...
    <Component Id="c_DefaultConfig.xml" Guid="{1AAB0AFD-B763-4A55-8585-B0AD4D8CE23C}">
        <File Id="f_default_config.xml"
              Name="default-config.xml"
              Source="$(var.SourceRoot)\config.xml"/>
        <Condition>CONFIG_XML_EXISTS</Condition>
    </Component>

I don't know why but property wix doesn't want to evaluate CONFIG_XML_EXISTS.

回答1:

Because that search happens very early in the install, the most likely reason is that INSTALLDIR has no value. You haven't said whether you're doing a fresh install or an upgrade, so it's not clear where you think it might be getting its value from.

I'd also point out that the purpose of that source code is apparently to prevent the install of a file if there is one there already, so:

  1. If INSTALLDIR turns out to be the application folder (typically program files) where your files are installed then users can usually change this location, so it's not clear the file is going to be where you expect it to be.

  2. The file overwrite rules prevent incoming files from overwriting modified data files (modify date > creation date) so if that config file has been changed it won't be overwritten and you don't need to do the check.

In your comment you say "My installer must create file config.xml only if there is no such file in target(install) directory. If such file exists, my installer must create file with name template.xml". I think that perhaps the easiest way to do this is in the application after the install has finished, or possibly in a custom action after all the files have been installed. There seems to be no good way to do this before the install because INSTALLDIR is unpredictable. I've seen this kind of problem solved by installing the XML files to (say) User's Application Data, and after the files are installed then the application or a custom action can see what files are there (or not) and get them from User's Application Data.