What we've got on WiX?

截止到现在,我们已经建立起一个基本的Installer框架了:有了要安装的文件,决定了安装到哪儿(路径),可以和用户简单的交互(UI),安装完毕后可以让用户快速启动(快捷方式,注册表),当然我们还做了一切异常处理(在Pre-checking里)~嗯,一个简单的可以work的Setup出来了,至少程序可以被比较正确的安装,修复和卸载,程序也能正常运行,一切看起来都不错~也时时候停下来好好做个Review了,结合Code梳理一下WiX的相关知识点.

 

我们从命名空间开始

< Wix  xmlns ="http://schemas.microsoft.com/wix/2006/wi"  xmlns:netfx ="http://schemas.microsoft.com/wix/NetFxExtension" >
WixWiX默认的是 http://schemas.microsoft.com/wix/2006/wi,当需要添加新的功能时,比如这里的Net或者其他Utility,得需要声明其各自的NS~,这样你就可以直接添加<NetFx:NativeImage>这样的标签了~


下来是最重要的产品信息

< Product  Id ="e6ecf2a7-b03c-4b3f-ace8-6179ab62e4c7"  Name ="WixProject"  Language ="1033"  Version ="1.0.0.0"  Manufacturer ="WixProject"  UpgradeCode ="b3d503b8-4f21-4116-8562-6ff1e0e16a28" >
Product1) 这里的Id将会成为ProductCode,会存储在系统中,将来可以调用API并传递这个ID值就可以唯一确定产品是否被安装过!一个产品对应一个ProductCode.
2) Name对应属性(Property)ProductName,同样Language对应ProdcutLanguage,Verision对应ProductVersion,Manufacturer对应 Manufacturer,这些信息将显示在Add/Remove里供用户查询.当然对应的属性可以用方括号("[]")括起来当全局变量使用!
3) UpgradeCode和ProductCode一样,也是很重要的一个ID值,hotfix(Service Pack)是根据此ID值来做Patching的~
4) 对于GUID值,Windows Installer要求全部大写,当然你在Wix中如果小写了,编译的时候会自动给你转换成大写的~
What we've got on WiX?_第1张图片


< Package  InstallerVersion ="200"  Compressed ="yes"   />
< Media  Id ="1"  Cabinet ="media1.cab"  EmbedCab ="yes"   />
Package/Media1) 一个MSI/MSM被认为是一个Package(包), InstallerVersion指定的是运行此MSI的Windows Installer最低版本,200表示Windows Installer 2.0版, Compressed用来指明被安装的文件是打包在MSI中,还是和其分开,按照定义的目录结构将所有文件组织在起来~这里还有个属性"Platform",可以指定此MSI允许运行的平台(x86或者x64),做支持不同平台的安装包.
2) Media指定的是安装包的光盘信息,如果文件比较多,可以分在多个光盘里,当需要时Windows Installer可以自动提示用户插入其他光盘.Id标示的是光盘号,Cabinet定义cab文件包的名字, EmbedCab如果设置为"no",这个cab文件就不会被打包在MSI里~

 再看文件目录的组织方式

代码
     < Directory  Id ="TARGETDIR"  Name ="SourceDir" >
            
< Directory  Id ="ProgramFilesFolder" >
                
< Directory  Id ="INSTALLLOCATION"  Name ="WixProject" >
                     
< Component  ... >
             ......
                     
</ Component >  
                
</ Directory >
            
</ Directory >
      
< Directory  Id ="ProgramMenuFolder"  Name ="Programs" >
        
< Directory  Id ="ProgramMenuDir"  Name ="Windows Forms Application" >
          
< Component  ... >
            ......
          
</ Component >
        
</ Directory >
      
</ Directory >
......

      
< Directory  Id ="DesktopFolder"  Name ="Desktop"   />
</ Directory >
Directory1) 第一行必须是<Directory Id="TARGETDIR" Name="SourceDir">,这是所有目录的根目录~不能作任何修改~<Directory Id="DesktopFolder" Name="Desktop" />也不要改,虽然改了没有编译错误!
2) ProgramFilesFolder和ProgramMenuFolder都是Windows Installer预定义的属性,可以不需要Name
3) 剩下的Id和Name都可以自定义了,包括INSTALLLOCATION,Id可以在其他位置被引用,Name定义文件夹的名称.
Component1) 一个Component最好只包含一个文件及其相关的其他信息,也就说你一个产品如果有1000个文件,那就最好就写1000个Component,虽然把1000个文件都写在1一个Component里也没有什么不错,但最好不要这样,主要是为了避免文件之间的"耦合",便于以后的组织和管理.

 

基本上就这么多需要强调的~下个阶段,我们将继续讨论添加自定义UI,Custom Action等,请继续关注!

你可能感兴趣的:(Go)