转自博客园吉桂昕的博客 http://www.cnblogs.com/jiguixin/archive/2011/09/27/2192986.html
感谢原作者分享
先直接上个最终效果图:
为了能让VS的部署环境知道你的自定义子程序,你需要在C:\Program Files\Microsoft SDKs\Windows\v7.0A\Bootstrapper\Packages 添加相应的文件夹与文件。
要实现以上效果需要按如下步骤:
1,先在Packages目录下创建一个子文件夹如:Oracle11gClient
因为VS2010的系统必备项是用特定文件路径和xml描述文件一起构成的
然后在Oracle11gClient目录下创建如下文件:
如果你文件夹名不改为zh-Hans,VS2010就会认不到。
如果你想把你的自定义子程序放到如:Oracle11gClient目录下,那么你就需要在Product.xml文件中配置相应的文件信息与校验信息如:Office2007PIARedist下的Product.xml文件
其实原理都一样,而我做的方式是把安装子程序放到zh-Hans文件夹下,那么在Product.xml文件中就不用做他们的定义:
<?xml version="1.0" encoding="utf-8"?> <Product ProductCode="Oracle11gClient_Jim" xmlns="http://schemas.microsoft.com/developer/2004/01/bootstrapper"> </Product>
至于这个ProductCode 主要作用如果你仔细看过Office2007PIARedist下的Product.xml下定义你就知道他的作用了。如:
..................................... <RelatedProducts> <DependsOnProduct Code="Microsoft.Net.Client.3.5" /> </RelatedProducts> .....................................
那现在最关心的也就是zh-Hans文件夹下有什么东西了,打开看看就知道了。
eula.txt:其实就是这个安装程序的版权这些杂七杂八的内容。
InstallOracle文件夹其实就是Oracle 客户端的安装程序。
最重要的也就是package.xml文件了:
我们先不看PackageFiles 下面的内容,只看一下整体效果他长什么样,先不忙看红色标记的节点,因为内容比较多。
是不是很简单啊。
<InstallChecks> < Commands >这两个元素是要配对的,它们的主要作用就是利用注册表项或文件来判断组件是否需要安装。我是用注册表来判断oracle是否已经在客户端上安装,就需要用<RegistryCheck>元素来检查,用“HKLM\SOFTWARE\ORACLE” 作为KEY,ORACLE下面的子节点"inst_loc" 作为Value ,并给这个检查项目起个名字叫“ORACLE_INST”。
<Command>元素则是在<InstallConditions>元素指定的条件满足时,执行相应的组件安装程序,这里我的安装程序是“InstallOracle\setup.exe”,是一个普通的安装程序,没有参数。
<InstallConditions>元素我的理解就是指定安装条件<BypassIf Property="ORACLE_INST" Compare="ValueEqualTo" Value="C:\Program Files\Oracle\Inventory"/> ; 如果注册表的值“HKLM\SOFTWARE\ORACLE\inst_loc” 的值与 "C:\Program Files\Oracle\Inventory" 相等就说明Oracle客户端已经安装了,否则视为没有安装,就要执行安装程序.
而<PackageFiles CopyAllPackageFiles="true"> 主要是指该安装程序包括了那些安装文件。因为我PackageFile 文件比较多就不全部展示出来了。
其实就是InstallOracle文件夹下的所有文件。把他全部加成PackageFile 形式他就会自己去复制相应的文件了。
至于CopyAllPackageFiles属性,如果你把它设置为false,那么在安装的时候他会把只会把你他会用到的文件拷贝到临时目录: 可想而知在安装的时候肯定会失败。
如果设置为Ture,VS就会把PackageFiles下面有的文件全部拷贝到临时目录这就样就能成功的进行安装相应的组件了。
最后一名题外话有些时候,别人写的博文中用到的地址,如:注册表中的地址或者文件路径可能和你本地的路径不一样,这就可能造成人家测试的成功你的失败,所以很多时候一定要细心。