公司换软件打包平台,弄了一个月,Wix toolset的中文资料真的不多,逼着自己看了不少英文资料,终于弄懂了WiX打包的过程,做出了满足要求的安装包
一点基本概念:(From WiX 技巧)
“WiX 使用声明性语言,而不是过程性语言,这意味着您要描述您的安装将是什么样子的,而不用描述为了实现它需要执行哪些步骤。这可能与您的习惯不同,但它非常容易掌握。通常,要安装在目标计算机上的描述文件将填充 WiX 源文件。在 WiX 源文件中,有三个与您希望安装的文件有关的主要元素:文件、组件和功能。文件元素是对单个文件的引用。文件必须包含在组件元素中,组件元素是最小的安装单 位。就是说,如果您有一个包含 100 个文件的组件,并且您要安装该组件,则会安装它包含的所有文件。相反,如果不安装该组件,则不安装任何文件。建议不要创建包含大量文件的组件。组件始终包含在功能元素中,并且可以包含在多个功能中。功能是一组组件,也可能是一组子功能。如果安装程序具有允许用户选择要安装哪些项的图形界面,则用户实际是在选择功能。”
前期也做过不少调研:Inno、Nsis、WiX,(很感谢QQ群里的热心人O(∩_∩)O~)
说实话,我是比较倾向于前两种打包方式的,客观的说,Inno的下载量少的惊人(http://sourceforge.net),后期的维护也比较困难,Nsis比较成熟,是主流的解决方案。但是作为WiX,它和C#的兼容性比较好,后面写custom(自定义动作)就可以用C#写,使用的语言比较新,维护起来还ok。
使用软件:VS2010 + WiX Toolset
寻求帮助方式:StackOverflow tagged wix
OR
Volunteer Mailing list
OR Paid support
Step By Step:下载安装 WiX (URL:http://wixtoolset.org/releases/)
1、安装后打开VS2010会看到如下界面:
2、点击新建Setup Project,就可以建立一个WiX的工程。Setup Project建立一个安装程序(可以生成msi安装包);有多个msi的时候,就需要建立Bootstrapper工程;Custom Action 用于做自定义动作。
3、看到product.wxs文件(刚学时,苦于没有最简代码,网上找了一个例子),修改如下:
<?xml version="1.0"?> <?define ProductVersion = "0.0.1"?> <?define ProductUpgradeCode = "12345678-1234-1234-1234-111111111111"?> <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> <Product Id="*" UpgradeCode="$(var.ProductUpgradeCode)" Name="Example Product Name" Version="$(var.ProductVersion)" Manufacturer="Example Company Name" Language="1033"> <Package InstallerVersion="200" Compressed="yes" Comments="Windows Installer Package"/> <Media Id="1" Cabinet="product.cab" EmbedCab="yes"/> <Icon Id="ProductIcon" SourceFile="example.ico"/> <Property Id="ARPPRODUCTICON" Value="ProductIcon"/> <Property Id="ARPHELPLINK" Value="http://www.exampleproduct.com"/> <Property Id="ARPURLINFOABOUT" Value="http://www.examplecompany.com"/> <Property Id="ARPNOREPAIR" Value="1"/> <Property Id="ARPNOMODIFY" Value="1"/> <Upgrade Id="$(var.ProductUpgradeCode)"> <UpgradeVersion Minimum="$(var.ProductVersion)" OnlyDetect="yes" Property="NEWERVERSIONDETECTED"/> <UpgradeVersion Minimum="0.0.0" Maximum="$(var.ProductVersion)" IncludeMinimum="yes" IncludeMaximum="no" Property="OLDERVERSIONBEINGUPGRADED"/> </Upgrade> <Condition Message="A newer version of this software is already installed.">NOT NEWERVERSIONDETECTED</Condition> <Directory Id="TARGETDIR" Name="SourceDir"> <Directory Id="ProgramFilesFolder"> <Directory Id="INSTALLDIR" Name="Example"> <Component Id="ApplicationFiles" Guid="12345678-1234-1234-1234-222222222222"> <File Id="ApplicationFile1" Source="example.exe"/> </Component> </Directory> </Directory> <Directory Id="ProgramMenuFolder"> <Directory Id="ProgramMenuSubfolder" Name="Example"> <Component Id="ApplicationShortcuts" Guid="12345678-1234-1234-1234-333333333333"> <Shortcut Id="ApplicationShortcut1" Name="Example Shortcut Name" Description="Example Product Name" Target="[INSTALLDIR]example.exe" WorkingDirectory="INSTALLDIR"/> <RegistryValue Root="HKCU" Key="Software\Example Company Name\Example Product Name" Name="installed" Type="integer" Value="1" KeyPath="yes"/> <RemoveFolder Id="ProgramMenuSubfolder" On="uninstall"/> </Component> </Directory> </Directory> </Directory> <InstallExecuteSequence> <RemoveExistingProducts After="InstallValidate"/> </InstallExecuteSequence> <Feature Id="DefaultFeature" Level="1"> <ComponentRef Id="ApplicationFiles"/> <ComponentRef Id="ApplicationShortcuts"/> </Feature> </Product> </Wix>