UltraDynamo(第五部分)- 构建、代码签名和打包
在本节中,我们将探讨构建、签名和打包应用程序所需的内容。
目录
注意:本文是多部分文章。下载内容可在第一部分中找到。
引言
在本节中,我们将回顾我为构建、代码签名和打包应用程序所采用的各种步骤。
这里涵盖了一些可能在本项目中不会再次使用的内容,但所有这些都是为了学习经验而提供的,因此已包含在内供参考。
代码签名证书
所有提交到 Intel AppUp 商店的应用程序都必须进行代码签名。这意味着必须从认可的证书提供商处获取合适的代码签名证书。据称,可以通过 Comodo 通过 Intel AppUp 程序免费获得证书。在 http://software.intel.com/[^] 注册 Intel AppUp 程序后,他们会在您的仪表板上提供一个链接供您点击。
放弃 Comodo
我完成了所需流程,提交了相关表格,发送了适当的法律文件,但尽管他们发了无数封邮件,他们仍然未能通过电话联系我进行身份验证。
他们发送的邮件内容都一样,我以同样的方式一一回复。他们一直要求我将我的详细信息注册到 192 和 BT 等目录服务中,尽管我并没有选择不公开我的信息,因此这些信息本就存在。如果他们只在每次回复后稍微留意一下,而不是一再询问。即使将网站截图发送给他们,也未能让他们相信我已完成他们要求的事情。总的来说,这是一次糟糕的服务。
与 GlobalSign 的美好时光
在 Comodo 的纠葛中,时间紧迫,而且我们对比赛的提交有时间限制,我决定去 GlobalSign[^] 获取我自己的代码签名证书。与他们打交道的流程顺畅多了。我提供了所需表格、法律文件(如护照和驾驶执照)的扫描件,在收到安排联系时间的邮件后,我接到了电话,流程就完成了。他们颁发了一个证书供我从他们的网站上下载。将证书下载到我的电脑的一个文件夹后,并备好在订购过程中生成的证书的相关密码,我就可以对应用程序进行代码签名了。
手动代码签名
以通常的方式构建应用程序后,我知道在哪里可以找到要签名的 EXE 文件。要签名 EXE 文件,只需在命令提示符下发出以下命令:
"C:\Program Files (x86)\Windows Kits\8.0\bin\x86\signtool.exe"
sign /f "C:\Users\Dave\Desktop\Code Signing Certificate\OS201210309376.pfx"
/p <certificate_keyphrase> /t http://timestamp.verisign.com/scripts/timstamp.dll
"C:\Users\Dave\Documents\Visual Studio 2012\Projects\UltraDynamo\UltraDynamo\bin\Release\UltraDynamo.exe"
正如您所见,有几点需要注意:
sign
= 告诉命令对文件进行签名/f
= 告诉命令使用以下证书文件进行签名/p
= 此后的值是证书的密码。请替换为您自己的。/t
= 告诉代码签名工具从何处获取时间戳数据。没有这个,应用程序将无法在证书过期日期之后运行。
要了解有关所有各种选项(超出此处使用的范围)的更多信息,请访问 此链接[^]。
现在,如果您每次都要运行此命令,事情就会变得繁琐。幸运的是,我们有生成事件!
使用生成事件进行签名
生成事件允许您为各种生成配置指定要运行的命令。例如,我不想在运行调试生成时进行代码签名,只在为发布生成时进行。
打开项目属性,您将看到“生成事件”选项卡,在此您可以指定要运行的命令。您会注意到这里使用了几个宏。“If
”指令检查 $(ConfigurationName)
是否等于“Release
”,然后要签名的是 $(TargetPath)
文件。
生成事件中的完整命令如下所示:
if $(ConfigurationName) == Release (
"C:\Program Files (x86)\Windows Kits\8.0\bin\x86\signtool.exe"
sign /f "C:\Users\Dave\Desktop\Code Signing Certificate\OS201210309376.pfx"
/p <certificate_keyphrase> /t http://timestamp.verisign.com/scripts/timstamp.dll "$(TargetPath)"
)
我相信可以在生成事件中添加一个进一步的命令来处理打包,但还没有做到。是的,这是另一天的工作!
在代码签名之后,如果您在资源管理器中导航到 EXE 文件,右键单击并选择“属性”,您现在会看到一个“数字签名”选项卡。它现在将包含您的证书的详细信息。您可以选择该项,单击“详细信息”按钮,然后查看更详细的证书。
打包
打包应用程序打开了一个全新的问题领域。
InstallShield Limited Edition
Visual Studio 2012 附带一个限制版的 InstallShield。您首先必须下载该产品并注册以获取您的许可证密钥。这部分很简单。之后,事情变得更加令人困惑。
您首先必须向解决方案添加一个新的安装和部署项目。
在此之后,您可以使用项目助手逐步输入构建部署项目所需的各种详细信息。
然而,我仍然认为有必要手动逐一调整解决方案资源管理器中各编号窗格的各种设置,并实际构建项目并测试安装,以确保一切正常,并且能够干净地安装和卸载而没有任何错误。
在 #6 准备发布 | 发布页面上,输入代码签名证书的路径并设置密码非常重要。这可以确保安装程序可执行文件和内部安装程序包都使用您的证书进行代码签名。
经过多次设置更改、构建和执行测试以获得无错误的可用部署包后,我遇到了第一个真正的障碍。Intel AppUp 商店要求应用程序提交包是**.msi*(Microsoft Installer)命名文件。无论我到哪里查找,在 InstallShield 的设置和部署选项中都找不到任何可以仅创建 msi 文件而不将其打包成安装程序可执行文件的选项。
这时我求助于一个称为“双重安装”的小技巧。首先,在电脑上像往常一样安装应用程序。然后,清空安装程序使用的Temp文件夹的内容。您不必这样做,但这使得更容易找到由安装程序创建的文件夹。然后再次运行安装程序。您会收到一个警报错误,通知您应用程序已安装。此时,您可以导航到temp文件夹并复制从生成的具有随机 GUID 的文件夹中提取的 msi 文件(例如,*C:\Users\Dave\AppData\Local\Temp\{A62723F8-A894-43E5-8BDD-29306F4DBDC5}*)。
拿到 MSI 文件后,我就可以将其上传到 AppUp 网站以开始验证过程。
这时,下一个问题就开始了。我的应用程序已通过验证,包括元数据和二进制验证,并已发布。然而,Intel 与我联系,说快捷方式不是“已声明的快捷方式”,直到今天,我仍然不知道这到底意味着什么,以及如何在 InstallShield 中修复它。
Intel 幸运地给了我一些关于使用 WIX 打包应用程序的提示。所以,是时候学习新东西了!
再见 InstallShield,你好 WIX!
Intel 为我提供了一个名为 MSICreatorAlpha
的内部工具,它使用 Wix(Windows Installer XML Toolset)来打包应用程序。该工具的要求是从 Wix 主页获取最新版本:http://wixtoolset.org/[^]。
下载并安装最新版本后,我启动了 Intel 工具,让它自行工作。然而,该工具并没有真正生成我想要的正确安装路径,并且添加了额外的目录结构层。不过,该工具确实生成了一个所需 Wix 文件的模板,我对其进行了编辑以满足我的需求。我为自己定制的 XML 文件如下(UltraDynamo.wxs)
<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Name="UltraDynamo" Id="35428e84-c66f-4fd9-9a1c-b37b7cc4b47b"
UpgradeCode="b8ab586c-46c8-4d87-af78-a4391c39d6f9" Language="1033" Codepage="1252"
Version="1.1.0.0" Manufacturer="David Auld">
<Package Id="*" Keywords="Installer" Description="UltraDynamo Installation"
Comments="This Package Installs UltraDynamo" InstallerVersion="100" Languages="1033"
Compressed="yes" SummaryCodepage="1252" />
<Media Id="1" Cabinet="Sample.cab" EmbedCab="yes" DiskPrompt="CD-ROM #1" />
<Property Id="DiskPrompt" Value="AppUp_WIXTest disk prompt 0.0.0.1 [1]" />
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder" Name="PFiles">
<Directory Id="INSTALLDIR" Name="UltraDynamo">
<Component Id="Component1" Guid="*">
<File Id="File_id1" KeyPath="yes"
Source="C:\Users\Dave\Documents\Visual Studio 2012\Projects\UltraDynamo\
UltraDynamo\bin\Release\ChangeLog.txt" />
</Component>
<Component Id="Component2" Guid="*">
<File Id="File_id2" KeyPath="yes" Source="C:\Users\Dave\Documents\
Visual Studio 2012\Projects\UltraDynamo\UltraDynamo\bin\Release\ReadMe.txt" />
</Component>
<Component Id="MainExecutable" Guid="*">
<File Id="File_id3" KeyPath="yes"
Source="C:\Users\Dave\Documents\Visual Studio 2012\Projects\
UltraDynamo\UltraDynamo\bin\Release\UltraDynamo.exe">
<Shortcut Id="desktopApp10" Directory="DesktopFolder"
Name="UltraDynamo" WorkingDirectory="INSTALLDIR" Icon="Appicon.ico"
IconIndex="0" Advertise="yes" />
</File>
</Component>
<Component Id="Component4" Guid="*">
<File Id="File_id4" KeyPath="yes" Source="C:\Users\Dave\Documents\
Visual Studio 2012\Projects\UltraDynamo\UltraDynamo\bin\
Release\UltraDynamo.exe.config" />
</Component>
</Directory>
</Directory>
<Directory Id="DesktopFolder" Name="Desktop" />
</Directory>
<Feature Id="Complete" Title="UltraDynamo" Description="UltraDynamo" Display="expand" Level="1">
<ComponentRef Id="Component1" />
<ComponentRef Id="Component2" />
<ComponentRef Id="MainExecutable" />
<ComponentRef Id="Component4" />
</Feature>
<Icon Id="Appicon.ico" SourceFile="C:\Users\Dave\Desktop\1352829907_line_graph.ico" />
</Product>
</Wix>
有了 XML 文件后,我就可以打开命令提示符并使用 Wix 工具手动构建 msi 文件。我们需要使用两个工具。
首先,我们使用 **CANDLE**,它预处理并将 WiX 源文件编译成对象文件(*.wixobj*)。接下来,我们使用 **LIGHT**,它链接并绑定一个或多个 *.wixobj* 文件并创建一个 Windows Installer 数据库(*.msi*)。整个过程将是:
CANDLE UltraDynamo.wxs
LIGHT UltraDynamo.wixobj
这将生成一个文件 *UltraDynamo.msi* 安装程序。但是等等,还没结束!在此阶段,我们已经有一个经过代码签名并打包成所需 MSI 文件的应用程序,但现在我们需要对 MSI 文件进行代码签名!
这只是一个简单地采用我们在生成事件中使用的代码签名命令,并对其进行修改以对 Wix 工具生成的 MSI 文件进行代码签名。
正如您所见,打包所需文件并进行代码签名需要相当多的手动步骤,才能达到 Intel AppUp 流程可接受的程度。我认为我可以在这里进一步修改我的生成事件命令来完全自动化这个过程,但我还没有做到。
总结
可以说,整个打包和部署的工作确实让人头疼。
证书颁发机构提供的服务质量参差不齐,各种工具,无论是 InstallShield、Intel 的 MSI Creator 还是 Wix,其差异之大,就好像作者故意为之一样。
对于本项目来说,可以肯定地说 InstallShield 对 AppUp 商店毫无用处,而 Wix 是最佳方法,尽管我敢肯定市场上还有其他工具,但它们可能需要你花一大笔钱!
目前,我将手动使用 Wix,直到我调整生成事件。
接下来做什么?
我希望继续开发和改进这个应用程序,添加更多功能,修复任何错误等等。时间宝贵,所以无法保证何时会发生。我还有一百万件其他事情需要处理!(我们不都是这样吗!)
最终想法
这次比赛对我来说真是一次开眼界的机会。这是我第一次真正必须全力以赴,而这一切的整合过程简直是一场噩梦。毕竟,我不是一个整天做这件事的专业开发人员。我学到了很多,非常多,这是一个挑战,很有趣,而这正是我们追求的。
当我收到一台超极本时,我非常感激。当我成功将我的 App 发布到 AppUp 商店并获得奖项时,我更加惊喜。当我最终赢得一个类别奖项时,我更是震惊得目瞪口呆。事实上,我完全被它震撼了!
感谢 CodeProject 的 Chris 和团队举办这次比赛,也感谢 Intel 作为赞助商。