如何创建一个仅包含下载链接的Wix Exepackage

10

我正在尝试使用DownloadUrl属性创建ExePackage,将Sql Express 2014下载并使用以下代码进行安装

<ExePackage Id="Sql2014Express"
    DisplayName="SQL Server 2014 Express"
    Cache="no"
    Compressed="no"
    PerMachine="yes"
    Permanent="no"
    Vital="yes"
    Name="SQLEXPRWT_x64_ENU.exe"
    DownloadUrl="http://download.microsoft.com/download/E/A/E/EAE6F7FC-767A-4038-A954-49B8B05D04EB/ExpressAndTools%2064BIT/SQLEXPRWT_x64_ENU.exe"
    InstallCommand="/ACTION=Install /INSTANCENAME=$(var.InstanceName) /FEATURES=SQL /SECURITYMODE=SQL [SqlVariable] /TCPENABLED=1 /SQLSVCACCOUNT=&quot;NT AUTHORITY\NETWORK SERVICE&quot; /SQLSVCSTARTUPTYPE=Auto /SQLSYSADMINACCOUNTS=BUILTIN\Administrators /ADDCURRENTUSERASSQLADMIN=FALSE /Q /HIDECONSOLE /SkipRules=RebootRequiredCheck /IAcceptSQLServerLicenseTerms"
    UninstallCommand="/Action=Uninstall /INSTANCENAME=$(var.InstanceName) /FEATURES=SQL /Q /HIDECONSOLE"
    DetectCondition="SqlInstanceFound"
    InstallCondition="$(var.ServerInstall)">
    <ExitCode Value ="3010" Behavior="forceReboot" />
  </ExePackage>

当我尝试构建安装程序包时,我收到了以下错误信息...

Error   2   The system cannot find the file 'SourceDir\SQLEXPRWT_x64_ENU.exe'.  

我可以将SourceFile属性设置为本地文件并将其包含在我的安装程序中,但我宁愿不必移动超过800MB的文件与我的安装程序。


@Unsigned,不确定您为什么要提取我的编辑中的文本部分。这个交流包含了非常有用的信息,因为“DownloadUrl”一词在正文或标题中并未出现,我浪费了很多时间才找到它。我将其添加到问题的第一行,以便于a)帮助搜索和b)让点击问题的人立即看到该术语。 - Anne Gunn
2个回答

18
如果您将捆绑包设置为Compressed=no,它将不会在最终的捆绑包中包含源文件。您收到“文件未找到”的原因是当构建安装程序时,它需要一个本地版本的软件包EXE文件以从中获取信息。 如果要构建仅具有下载URL的项目,则需要指定 RemotePayload 元素,并提供有关远程软件包的更多定义信息。
这将允许您构建安装包,而无需在计算机上拥有源文件,但您需要确保准确描述负载或安装将失败。
请确保在您的ExePackage元素上包括Name属性,它是与SourceFile并列的必需属性之一,但在RemotePayload中不允许使用SourceFile。 您的示例包含它,所以您应该没有问题。
<RemotePayload>元素作为ExePackage的子项包含,如下所示:
<RemotePayload Description="MyRemoteApp" ProductName="MyProductName" Size="size-in-bytes" Version="1.1.1.1" Hash="SHA-1-checksum-here"/>

如果所有所需信息都是您特定软件包的属性,则可以选择此选项。 如果不行,您需要确保源文件在构建时本地可用,但请确保未压缩,以便用户可以安装并从您的 URL 下载有效负载。

有关更多信息,请参阅RemotePayload 参考文档。


你知道在哪里可以轻松找到各种Microsoft安装程序的字节大小和MD哈希值吗? - PlTaylor
文件大小可以在下载页面上看到,但最简单的方法可能是直接下载并使用资源管理器告诉你。对于SHA-1/MD5,如果下载页面没有列出它,则可以使用系统上支持的任何计算器实用程序来计算它。这个应该能够为您完成此操作。 - Ryan J
对于哈希,您也可以使用Get-FileHash PowerShell命令(在较旧的系统上可能不可用)。 - LOST
@LOST 别忘了加上 -Algorithm SHA1 开关,否则默认会得到 SHA256 哈希值,这样是行不通的。 - Ian Goldby

4

RyanJ的回答很好,它让我从自己试错无果的困境中走出来。但是,我仍然需要进行一些试错才能创建一个实际可用的捆绑包wxs文件。因此,为了记录,如果你在Visual Studio中创建一个新的捆绑包项目,然后替换bundle.wxs内容为:

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Bundle 
Name="BundleExperiment" 
Version="1.0.0.0" 
Manufacturer="Windows User" 
UpgradeCode="UNIQUE-GUID-GOES-HERE-YADADADA"
Compressed="no">

    <BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense" />

<Chain>
  <ExePackage Id="DymoLabelSoftware"
       SourceFile="DLS8Setup.8.5.1.exe"
       DownloadUrl="http://download.dymo.com/dymo/Software/Win/DLS8Setup.8.5.1.exe" />
</Chain>
</Bundle>

您可以看到它是如何工作的,然后修改它以适应您要打包的任何exe软件包。

对我来说,真的很反直觉,您需要为SourceFile和DownloadUrl指定值,并仍然在项目目录中拥有已下载文件的副本。实际上,这不止是反直觉。我确信不将已下载的文件放在我的项目目录中是如何告诉Burn省略包中的文件的。但是现在我理解它的方式如下:

  • 'Compressed="no"' -- 告诉Burn不要嵌入exe在正在构建的捆绑安装程序中
  • 'SourceFile="DLS8Setup.8.5.1.exe"' -- 告诉Burn去项目目录并使用已下载的本地副本目标包生成您否则必须找出并放入RemotePayload记录中的所有信息
  • 'DownloadUrl=...' -- 是我从一开始就很明显的部分

*“与您要打包的任何exe一起”免责声明:我最初尝试了一个Git Windows安装程序包的例子。而且,使用完全相同的语法(和正确的名称和路径!),捆绑安装始终会在日志文件中失败并显示访问错误和类似“无法获取有效载荷”的消息。我注意到关于Git下载的唯一奇怪之处是它实际上并不来自我使用的URL,而是将下载重定向到亚马逊S3云中的某个地方。我的猜测是Burn / WIX / Windows Installer可能会反对这种手法 - 这也是相当合理的。因此,根据您想要捆绑的安装程序,您可能必须为其提供一个在您自己控制下的固定URL,以使其与此功能配合使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接