VS2015 打包添加系统必备组件

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

VS2015 打包添加系统必备组件