我有一个用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包的一致性,并且会因“哈希码”而失败。
答案 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;
}