Tuesday, December 21, 2004

 

Open source install projects

1.
首先,是从flier那里最先看到的这则消息,下面是他的blog

作者:flier_lu
出处:http://www.blogcn.com/user8/flier_lu/main.asp?id=1547635

MS刚刚在开源项目大本营SourceForge发布了一个开源的安装程序开发项目Windows Installer XML (WiX) toolset http://sourceforge.net/projects/wix/ ,支持使用XML格式编写MSI格式的安装程序项目。

例如一个简单的XML工程product.wxs文件

[code]
?xml version='1.0'?>
Wix xmlns='http://schemas.microsoft.com/wix/2003/01/wi'>
Product Id='000C1109-0000-0000-C000-000000000046' Name='TestAssemblyProduct' Language='1033' Version='0.0.0.0' Manufacturer='Microsoft Corporation'>
Package Id='000C1109-0000-0000-C000-000000000046' Description='Test Assembly in a Product' Comments='Test from: wix\examples\test\assembly\product.wxs' InstallerVersion='200' Compressed='yes' />

Media Id='1' Cabinet='product.cab' EmbedCab='yes' />

Directory Id='TARGETDIR' Name='SourceDir'>
Directory Id='ProgramFilesFolder' Name='PFiles'>
Directory Id='TestAssemblyProductDirectory' Name='testassm' LongName='Test Assembly'>
Component Id='TestAssemblyProductComponent' Guid='00030829-0000-0000-C000-000000000046'>
File Id='TestAssemblyProductFile' Name='assembly.dll' essembly='.net' KeyPath='yes' DiskId='1' src='http://blogs.msdn.com/$(env.WIX)/examples/data/assembly.dll'/>
/Component>
/Directory>
/Directory>
/Directory>

Feature Id='TestAssemblyProductFeature' Title='Test "ssembly Product Feature' Level='1'>
ComponentRef Id='TestAssemblyProductComponent' />
/Feature>
/Product>
/Wix>
[/code]

可以被编译、链接成一个MSI安装文件。

[code]
:\wix\examples\test\assembly> candle.exe product.wxs
Microsoft (R) Windows Installer Xml Compiler version 2.0.1510.0
Copyright (C) Microsoft Corporation 2003. All rights reserved.

product.wxs

E:\wix\examples\test\assembly> light.exe product.wixobj
Microsoft (R) Windows Installer Xml Linker version 2.0.1510.0
Copyright (C) Microsoft Corporation 2003. All rights reserved.

E:\wix\examples\test\assembly> dir

Volume in drive E is New Volume
Volume Serial Number is 8AC4-6AD2
Directory of E:\wix\examples\test\assembly

04/05/2004 05:04 DIR> .
04/05/2004 05:04 DIR> ..
02/23/2004 09:55 891 module.wxs
04/05/2004 05:04 52,736 product.msi
04/05/2004 05:04 4,976 product.wixobj
02/23/2004 09:55 1,281 product.wxs
4 File(s) 59,884 bytes
2 Dir(s) 90,014,191,616 bytes free
[/code]

此项目在MS内部的很多开发组被实际使用,如Yukon数据库, Office 12, Exchange "Kodiak," Update Services 和 Xbox divisions 等产品。

几天前我们刚说了dotNetInstaller,现在就有了这个。呵呵,最近微软公开的源代码还真多呀。那个游戏我最喜欢,可惜没时间看。接着我们来看看代码。

首先一眼看到wixcab,呵呵,cab包的用法,印象中这个应该是以前不知道而大家都想知道的。导出头如下

[code]
EXPORTS
CreateCabBegin
CreateCabAddFile
CreateCabAddFiles
CreateCabFinish
ExtractCabBegin
ExtractCab
ExtractCabFinish
[/code]

一目了然,代码也很中规中矩。

接下来是dutil目录的程序。老习惯,都是轻微封装的SDK函数加precom.h,而不象前面我们看得dotNetInstaller用MFC类。微软内部看来用MFC的人也不多,当然这也是为了开源之后,能够用GCC也能编译该代码,或者更进一步port到其它平台。不过dotNetInstaller对于VC程序员相对直接了当些。

再看个简单的,dark目录,就是后台程序。程序属性设置的相当复杂,有些命令参数我还得查看文档才能明白。然后,就是插入了wix的自定义错误处理,准备招架各种错误。其具体实现都在wix目录下面。安装程序的错误当然是千奇百怪,这里不可能一网打尽,不过常见的都列了。相对于目前的一些Installer开发软件而言,这也是很有价值的资料。

然后是wix目录。首先是Interop一些系统操作,如Cab,File,Msi等等。呵呵,这里的Msi调用方式和dotNetInstaller比较还是很有趣的。因为不知道入口点,dotNetInstaller只好shell完成各种操作,而这里好,直接找EntryPoint,Interop。到底是MS内部操作,爽。绝对是内部小秘密曝光。而且是这么的详尽细致。

Action,ActionTable是控制安装流程的。Library,Row,Column,Table是知识储存。Compiler,Linker,Decompiler是安装文件的组装和分解。其它相关的类不一而足。其实这些代码才是wix中最有价值的东西。经过修改,我们完全可以再其它地方用到类似的技术编写、储存、重放我们录制的操作。而其中的代码编写模式什么的,都值得我们学习。

Xsd表详细描述了内部机构。不错,我还没怎么涉猎这方面的东西呢。

最后是candle,lit,light三大门面的调用,这里就不赘述了。估计高人们马上就会总结的。

对了,本开源项目的文档化估计也会尽快完成的。当然,我们已经看到易用性还是很高的,自己扩展也很方便。

现在剩下的问题是如下的打包技术是如何实现的,参见
http://thinstall.com/

2.
dotNetInstaller是DevAge SOFTWARE公司 http://www.devage.com/ 推出的一个开源Install Builder软件,因为要用到其中的某些知识,所以下载下来看了看,觉得还是很不错的。

dotNetInstaller的基本结构是用MFC实现的。由于Install Builder类软件功能琐碎,所以作者Davide Icardi并没有使用类来封装那么多功能函数,而是定义了一个namespace DVLib将他们都装了进去。相应代码都在Tools目录下。这些代码都写的相当干净,调用起来很方便,我已经借用了好几个函数。

不过DownloadComponent部分进行封装了类,其基本方法就是使用URLDownloadToFile API 进行下载。相应的用法可以参见
http://msdn.microsoft.com/workshop/networking/moniker/reference/functions/urldownloadtofile.asp

http://www.codeproject.com/internet/urldownload.asp
这个函数是IE功能的一部分,有封装好的错误提示,而且可以自动进行多线程下载。我指得是多个文件一起下载的多线程,而不是一个文件多个部分一起下载的多线程。使用时用Process可以很清楚的看到这一点。对了,以前上课写Search Engine Project的时候我曾经偷懒使用这种方法来抓取网上的图片文件,结果不知为什么,下载的文件过多后机器会变得奇慢无比,也不知是不是IE的内部Cache机制的影响。所以各位请小心。
dotNetInstaller下载的都是些安装文件需要的Component,所以不用担心这一点。由于只是序贯操作,所以也无须为了多线程而编写复杂的线程排序管理代码。

其实我主要关心的还是如何安装msi文件部分。结果一看才知道原来简单之极。比如Davide Icardi给出的示例伪代码如下

[code]
/*virtual bool ExecWait(DWORD * pExitCodes)
{
CString l_command = "msiexec /I ";
l_command += "\"";
l_command += package;
l_command += "\"";
l_command += " ";
l_command += cmdparameters;
//if (silent)
// l_command += " /qn";
//if (suppressreboot)
// l_command += " REBOOT=ReallySuppress";

return DVLib::ExecCmdAndWait(l_command, pExitCodes);
};*/
[/code]

关键还是msiexec命令的用法。下面的几个地方都可以看看
http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/msiexec.mspx
http://www.microsoft.com/resources/documentation/WindowsServ/2003/standard/proddocs/en-us/msiexec.asp
http://support.microsoft.com/default.aspx?scid=kb;EN-US;q230781
http://helpnet.installshield.com/robo/projects/helplibdevstudio9/IHelpCmdLineMSI.htm
至于ExecCmd就是直白的CreateProcess封装,这个见得太多,不赘述。

InstallerEditorSetup则是用C#写的,不为别的,就图PropertyGrid和XML的方便呀。微软不写个MFC的PropertyGrid正是不好。其它开源的都不太稳定。XTreme的则还有些地方画的不好看。而微软的XML多少让人生出懒惰的放心。这部分不难,不过还是有很多小地方要小心才不会出错。估计作者Davide Icardi拼装那些字符串时还是很辛苦的。

3.
Nullsoft Scriptable Install System
http://nsis.sourceforge.net/home/
相对于Nullsoft的而言,dotNetInstaller的功能还不够强大,不过用的方便,而且着重考虑了dotNet用户,还是不错的。其实我这种懒人的正实想法是Nullsoft Scriptable Install System实在太过复杂,令人望而生畏。

4.
http://www.installsite.org/
很Cool的站点,好东西还是不少的。



<< Home

This page is powered by Blogger. Isn't yours?