有时我们除了需要安装系统必备组件之外,还需要做自定义的子安装程序,如我的需要安装2007 Office System Driver: Data Connectivity Components!现将操作步骤整理如下,希望能对如我一般陷此困惑的朋友有所帮助,或能抛砖引玉!
(1)将自定义的安装程序COPY至Bootstrapper文件夹中
VS2015(不同vs版本有不同的Bootstrapper目录)的系统必备项是用特定文件路径和xml描述文件一起构成的,这点倒是和JAVA应用服务器很像。这个Bootstrapper是具体路径在我的机器中是:
“C:\Program Files (x86)\Microsoft Visual Studio 14.0\SDK\Bootstrapper\Packages”。在这个目录中,
您可很清楚地看到在VS2015部署程序中可选的所有的组件,呵呵。我们要依葫芦画瓢同样建一个文件夹“Data Connectivity Components”这样的系统必备组件。
名称就起“Access Database Engine”好了。如下:
在“Data Connectivity Components”文件夹中,断续建一个“en”安装本地化文件夹(中国的建zh-CHS),将安装程序COPY进这个文件夹中,如:
(2)创建产品清单和程序包清单
产品清单其实就是“Data Connectivity Components”文件夹下的那个product.xml文件;程序包清单其实就是“en”文件夹下的package.xml文件。
Product.xml文件的清单如下:
<?xml version="1.0" encoding="utf-8" ?>
<Product
xmlns="http://schemas.microsoft.com/developer/2004/01/bootstrapper"
ProductCode="AccessDatabaseEngine" >
<!-- Defines list of files to be copied on build -->
</Product>
这倒没什么可说的,
Package.xml文件的清单如下:
<?xml version="1.0" encoding="utf-8"?>
<Package Name="DisplayName" Culture="Culture" xmlns="http://schemas.microsoft.com/developer/2004/01/bootstrapper">
<InstallChecks>
<RegistryFileCheck Property="ACEVERSION" Key="HKLM\SOFTWARE\Microsoft\Office\12.0\Access Connectivity Engine\InstallRoot" Value="Path" FileName="1033\ACEODBCI.DLL" />
</InstallChecks>
<PackageFiles CopyAllPackageFiles="false">
<PackageFile
Name="AccessDatabaseEngine.exe"
HomeSite="HomeSiteName_32"
/>
</PackageFiles>
<Commands Reboot="Defer">
<Command PackageFile="AccessDatabaseEngine.exe">
<InstallConditions>
<BypassIf Property="ACEVERSION" Compare="ValueExists"/>
</InstallConditions>
<ExitCodes>
<ExitCode Value="0" Result="Success" />
<DefaultExitCode Result="Fail" String="Anunexpected" FormatMessageFromSystem="true" />
</ExitCodes>
</Command>
</Commands>
<Strings>
<String Name="Culture">EN</String>
<String Name="DisplayName">Access Database Engine</String>
<String Name="HomeSiteName_32">http://downloads.hotdocs.com/downloads/hd11/player/HotDocs_Player_11_32bit.exe</String>
<String Name="AdminRequired">You do not have the permissions required to install this application. Please contact your administrator.</String>
<String Name="Anunexpected">An unexpected exit code was returned from the installer. The installation failed.</String>
</Strings>
</Package>
Package 元素的 Name 属性的值 其实就是 在VS2015部署程序的系统必备选择框中显示的组件名称。
<PackageFiles>元素用来指定组件包括的文件,要将每个安装文件要用子元素<PackageFile>指定出来哦,VS2015部署程序在编译生成安装文件时,
就是按这个清单将组件的文件COPY过去的。
<InstallChecks> < Commands >这两个元素是要配对的,和struts框架的控制文件一样,它们的主要作用就是利用注册表项或文件来判断组件是否需要安装。
我是用注册表来判断驱动是否已经在客户端上安装,就需要用<RegistryCheck>元素来检查,用“HKLM\SOFTWARE\Microsoft\Office\12.0\Access Connectivity Engine\InstallRoot”这个注册表键来判断检查,
并给这个检查项目起个名字叫“ACEVERSION”。
<Command>元素则是在<InstallConditions>元素指定的条件满足时,执行相应的组件安装程序
,这里我的安装程序是“AccessDatabaseEngine.exe”,是一个普通的安装程序,没有参数。
<InstallConditions>元素我的理解就是指定安装条件啦,<BypassIf Property="ACEVERSION" Compare="ValueExists"/>一句我的想法是:
如果注册表存在这个键就认为已经安装了客户端,就不用执行精简客户端安装,否则视为没有安装,就要执行。
(3)配置完毕!
我们到VS2015部署程序的系统必备选择项中找找,果真发现了“Data Connectivity Components”这个组件了。如下图: