有时我们除了需要安装系统必备组件之外,还需要做自定义的子安装程序,如我的需要安装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”这个组件了。如下图: