WiX Bundle自定义配置文件

时间:2013-07-04 06:12:05

标签: wix bundle wix3.6

我有一个用MSI创建的WiX文件,该文件包含我的可执行文件并复制放置在MSI文件附近的配置文件。我可以在安装之前更改配置文件,并将更改的版本复制到安装文件夹。

<Component Id="ProductComponent" 
           Guid="714DCBE1-F792-401E-9DDC-67BC1853BE14">
    ....
    <File Source="Chiffa.exe.config" 
          Compressed='no'/>
</Component>

这就是我想要的,我很高兴,但不满意,因为我需要安装一些其他软件包以及这个MSI文件。所以我用WiX创建了一个捆绑项目,并将所有可爱的MSI包放到了它的链中:

<Chain>
    .....
    <MsiPackage Compressed="yes"
                SourceFile="$(var.ChiffaSetup.TargetPath)"
                Vital="yes"
                Visible="no">
        <Payload SourceFile="Chiffa.exe.config"
                 Compressed="no"/>
    </MsiPackage>
</Chain>

除了一件小事以外,一切都很好。我无法更改配置文件,因为bundle会检查MSI包的一致性,并且会因“哈希码”而失败。

2 个答案:

答案 0 :(得分:0)

“哈希码事物”是一个非常重要的功能,因为它检测到不完整或损坏的下载。如果您需要对配置文件进行任意更改,那么您只需为每次更改重建捆绑包。

但是,如果您可以为更改定义算法,则可以更改配置文件,因为它在安装项目中使用XmlConfig元素安装,或者使用您自己的自定义操作。更改的数据可以在算法中完全定义,也可以通过各种机制传递:通过UI或命令行参数设置的Windows Installer属性。如果通过命令行参数设置,则可以从bundle传递它们,这可以从自定义BootstrapperApplication UI或其命令行获取它们。

答案 1 :(得分:0)

我认为解决方案是从MSI包中排除配置文件并使用自定义操作来复制文件(如果不存在,则创建默认值)。当然,如果文件是必要的,该操作可以对文件进行任何检查。

但是您必须在卸载过程中添加代码来管理配置文件,等等。这是另一个自定义动作。

类似的东西:

[CustomAction]
public static ActionResult CopyBootstraperConfig(Session session)
{
    try
    {
        const string configFile = "Chiffa.exe.config";

        var customConfig = Path.Combine(Path.GetDirectoryName(session["OriginalDatabase"]), configFile);
        var targetConfig = Path.Combine(session.GetTargetPath("INSTALLLOCATION"), configFile);
        if (File.Exists(customConfig))
            File.Copy(customConfig, targetConfig);
        try
        {
           //do file checks
        }
        catch (Exception e)
        {
            File.Delete(targetConfig);
            throw;
        }
    }
    catch (Exception e)
    {
        return ActionResult.Failure;
    }
    return ActionResult.Success;
}