转到WiX 3.6,我正在尝试使用刻录功能来简化可能的下载/安装所需的部分,例如特定的VC ++运行时。
我从一些“test.wxs”开始很小,见下文,这对candle.exe来说没问题:
$ candle test.wxs
Windows Installer Xml Compiler version 3.6.3303.0
Copyright (C) Outercurve Foundation. All rights reserved.
test.wxs
但是light.exe扼杀了它:
$ light test.wixobj -ext WixBalExtension
Windows Installer Xml Linker version 3.6.3303.0
Copyright (C) Outercurve Foundation. All rights reserved.
light.exe : error LGHT0103 : The system cannot find the file '' with type ''.
有人可以帮忙解决这个(相当神秘的)错误消息吗?
它似乎与RemotePayload有关,因为带有本地文件的修改版本可以正常工作。但是,如果需要,我想节省包装尺寸并将下载保留在目标机器上。
“test.wxs”的全部内容是:
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Bundle Version="1.0.0.0"
UpgradeCode="e349236d-6638-48c5-8d8b-db47682b9aeb">
<BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense" />
<Chain>
<!-- C++ Runtime -->
<ExePackage Name="vcredist_x64.exe"
DownloadUrl="http://www.microsoft.com/en-us/download/confirmation.aspx?id=2092" >
<RemotePayload CertificatePublicKey="F321408E7C51F8544B98E517D76A8334052E26E8"
CertificateThumbprint="D57FAC60F1A8D34877AEB350E83F46F6EFC9E5F1"
Description="Microsoft Visual C++ 2008 Redistributable Setup"
Hash="13674C43652B941DAFD2049989AFCE63CB7C517B"
ProductName="Microsoft Visual C++ 2008 Redistributable"
Size="4961800"
Version="9.0.30729.17" />
</ExePackage>
</Chain>
</Bundle>
</Wix>
答案 0 :(得分:4)
对我自己的问题的部分回答: 如果我将属性Compressed =“no”添加到ExePackage元素,则错误消息将消失。
有关“压缩”属性的文档说明:“包有效负载是应嵌入容器还是作为外部有效负载保留”,其值可以是“是”,“否”,或者“默认”。
使用“是”或“默认”会触发错误消息。使用“否”不会。
答案 1 :(得分:2)
我在使用另一个软件包(.NET框架)和Wix 3.7时遇到了同样的问题。我使用Wix源代码找到要测试的相应软件包名称和注册表项,然后将相关位粘贴到我的安装程序中。然后,我故意设置'Compressed =“yes”'因为我想将文件嵌入我的安装程序而不是下载。
在this mailing list thread中发布了类似于您的报告:
Benjamin Mayrargue:如果ExePackage的DownloadUrl和Compressed设置为yes,则指示灯失败并显示错误LGHT0103:系统找不到“带类型”的文件。
Markus Wehrle:好的,我明白了。如果要将ExePackage压缩到bootstrapper.exe(compressed =“yes”),则需要使用“Source”属性指定它。因为它会在编译期间压缩到你的boostrapper中,你不能声明DownloadUrl。如果你指定了compressed =“no”,你的exePackage会在你的boostrapper安装过程中从DownloadUrl下载。
Rob Mensching:更具体地说,你不能在ExePackage元素上一起使用RemotePayload元素和Compressed ='yes'。这没有意义,这里的错误是编译器在这里没有给出错误信息。
所以是的,你已经正确地找到了解决问题的方法。
顺便说一下,Compressed
属性指定“包有效负载是嵌入容器还是留作外部有效负载”。该外部有效负载可以是磁盘上的RemotePayload
或另一个文件,但典型的设置是单个引导加载程序,其中嵌入了所有资源。
使用yes
作为Compression属性将允许安装应用程序和VC ++运行时,即使用户的Internet连接速度很慢或不存在也是如此。从安装程序中删除DownloadUrl
和RemotePayload
,并将其替换为Compressed="yes"
,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Bundle Version="1.0.0.0"
UpgradeCode="e349236d-6638-48c5-8d8b-db47682b9aeb">
<BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense" />
<Chain>
<!-- C++ Runtime -->
<ExePackage Name="vcredist_x64.exe"
Compressed="yes">
</ExePackage>
</Chain>
</Bundle>
</Wix>
然后下载vcredist_x64.exe文件(您自己,一次)并将其放在test.wxs文件旁边。如果您想要在不同的位置调整“名称”。请注意,这会将生成的引导程序的大小增加大约vcredist_x64.exe的大小,因此,如果您的用户将下载安装程序,则不是一个好主意。
答案 2 :(得分:0)
在我的情况下,错误被抛出,因为文件名/目录路径超过255个字符。该文件存在但编译器声明该文件不存在。