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中如果小写了,编译的时候会自动给你转换成大写的~


<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等,请继续关注!

posted @ 2009-12-24 23:34  shalahu  阅读(713)  评论(1编辑  收藏  举报