杉宫竹苑工作室

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2752|回复: 0

Wix打包系列(七) 添加系统必备组件的安装程序

[复制链接]
发表于 2018-5-24 21:38:44 | 显示全部楼层 |阅读模式

正式会员享受无限制浏览网站功能和高速网盘下载,赶快加入本站吧!

您需要 登录 才可以下载或查看,没有账号?立即注册

x
    我们知道在vs的打包工程中添加系统必备组件是一件很容易的事情,那么在wix中如何检测系统必备组件并在安装过程中安装这些组件。这里以.Net Framework组件作为必备组件为例:

    7.1 检测.Net Framework 版本

    步骤1:为安装项目添加WiX .NET extensions库的引用

    如果是命令行方式使用wix,那么需要在candle和light的时候添加如下参数:

-ext WiXNetFxExtension
    如果在vs中使用wix,那么需要添加WixNetFxExtension.dll的引用,在wix安装目录下可以找到它。
   
    步骤2:为安装项目添加WiX .NET extensions命名空间
    添加了.NET extensions引用之后,还必须为源文件添加.NET extensions 命名空间,方式是为Sample.wxs源文件中Wix元素添加如下属性:
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
xmlns:netfx="http://schemas.microsoft.com/wix/NetFxExtension">
   
    步骤3:引用适当版本的Property
    在.NET Framework extensions 已经定义了所有现有版本的.NET Framework的Property,包括service pack版本。如果我们需要在安装项目中使用这些属性,就必须使用引用它们;比如我们需要检测.Net Framework 2.0,就必须添加相应的Property引用:
<PropertyRef Id="NETFRAMEWORK20"/>
        “NETFRAMEWORK20”就是.NET Framework extensions 中预定义的.Net Framework 2.0的属性;如果需要检测中文语言包,那么还必须添加”NETFRAMEWORK20_ZH_CN_LANGPACK” 属性;查看所有现有版本的.NET Framework的Properties,可以翻阅wix 帮助文档。
  
    步骤4:在Condition条件中使用预定义的Properties
    我们可以在安装程序的启动条件中使用预定义的属性,从而判断系统是否安装指定的.NET Framework组件,如:

<Condition Message="This application requires .NET Framework 2.0. Please install the .NET Framework then run this installer again.">
<![CDATA[Installed OR NETFRAMEWORK20]]>
</Condition>
  
  上面代码意思是:如果没有安装.Net Framework 2.0, 将会中断安装程序执行,Installed 表示如果在修复或卸载安装时将不会检测.Net Framework组件。
   
   步骤5:编译生成安装程序
    在一个没有.Net Framework 2.0的系统环境中运行生成的安装程序,弹出提示安装.Net Framework 2.0的错误,然后安装程序被终止。

   
    现在我们的安装程序已经可以检测.Net Framework 2.0是否安装了,但是一般情况下,我们希望将.Net Framework组件作为安装程序的一部分,当检测到系统没有安装.Net Framework组件的时候会自动安装.Net Framework组件。windows installer不能将这些组件打包到我们安装程序中,但是我们可以跟vs打包一样,使用引导程序(bootstrapper)来实现,引导程序会先执行.Net Framework组件的安装,然后再执行我们的安装程序。下面我们提供2种方法,一种是编写xml代码的方式在Visual Studio中生成带引导程序的安装文件,另一种是使用BMG工具。
   
    7.2 使用Visual Studio制作系统必备引导程序
   
    wix本身不提供引导程序,但是我们可以使用Visual Studio中ClickOnce deployment部件提供的bootstrapper引导程序;下面我们来看看如何为.Net Framework组件生成ClickOnce 引导程序bootstrapper。

    步骤1:在Visual Studio中创建并编译wix安装项目
    要生车ClickOnce bootstrapper引导程序,我们不能再使用命令行模式,必须使用VS编译环境;在vs2005或以上版本,新建wix项目:
1.gif
   移除Product.wxs,将Sample示例源文件拷贝到wix Project所在的目录,并添加到wix项目中;添加wix命名空间中的wix Extension组件的引用,如图:
2.gif
    使用candle命令编译时,我们使用了变量参数-dVersion=1.0.0,这里同样需要设置,右键项目名称——》属性——》Build选项卡——》设置Build参数:
3.gif
    最后编译生成Sample项目,生成的安装文件在../bin/Debug/zh-cn下,我们也可以在上面的Build参数中指定安装语言,也可以同时生成多种语言版本的安装程序。

   需要注意的是:在使用vs制作中文安装包时,如果引用了WixSqlExtension组件,那么就必须把SqlExtension的中文资源文件(点击下载)包括在项目中,否则会编译错误。而在命令行模式下制作中文安装包时,可以不使用SqlExtension中文资源文件,默认会使用自带的英文资源文件。

    步骤2: 用编辑器打开.wixproj文件

   首先,在vs中打开示例中的Sample项目,然后在解决方案管理器(Solution Explorer)中右键Sample项目,选择卸载项目(Unload Project),继续在解决方案管理器(Solution Explorer)中右键Sample项目,选择编辑Sample.wixproj。
    步骤3: 添加必备组件的条目
    在Sample.wixproj文件的下添加如下代码:

  1.    <ItemGroup>
  2. <BootstrapperFile Include="Microsoft.Net.Framework.2.0">
  3. <ProductName>.NET Framework 2.0</ProductName>
  4. </BootstrapperFile>
  5. </ItemGroup>
复制代码

    Include 特性用于表示应安装的必备组件的名称。ProductName 项元数据是可选的,它作为备用项供生成引擎在找不到包时用作用户友好名称。除非未指定 ApplicationFile,否则这些项不是必选 MSBuild 输入参数。对于必须为应用程序安装的每个必备组件,都应包含一个相应的项。

    如果 BootstrapperItems 和 ApplicationFile 参数均未指定,则会导致生成错误。

    步骤4:添加生成引导程序的任务
    在Sample.wixproj文件中添加如下代码:

  1. <Target Name="AfterBuild">
  2. <GenerateBootstrapper ApplicationFile="zh-cn/$(TargetFileName)"
  3. ApplicationName="Foobar 1.0"
  4. BootstrapperItems="@(BootstrapperFile)"
  5. ComponentsLocation="Relative"
  6. CopyComponents="True"
  7. OutputPath="$(OutputPath)"
  8. Path="E:/Program Files/Microsoft Visual Studio 8/SDK/v2.0/BootStrapper/" />
  9. </Target>
复制代码

       ApplicationFile指定引导程序在所有必备组件安装完以后开始安装应用程序时使用的文件的路径;$(TargetFileName)是安装程序的名称,如果是制作中文安装包,wix安装工程默认生成的安装文件在输出目录下的zh-cn目录下,这里根据实际生成目录的结构填写不同的路径
    ApplicationName是在bootstrapper引导程序执行时显示的应用程序的名称;
    BootstrapperItems指定要生成到引导程序中的产品;
    ComponentsLocation指定引导程序寻找要安装的安装必备组件的位置。此参数可具有下列值:
HomeSite:指示必备组件由组件供应商托管。

Relative:指示必备组件与应用程序在同一个位置。

Absolute:指示所有组件都将在一个集中的 URL 下找到。该值应当与 ComponentsUrl 输入参数结合使用,ComponentsUrl 指定包含安装必备组件的 URL。

    如果未指定 ComponentsLocation,将默认使用 HomeSite。

    CopyComponents如果为 true,则引导程序会将所有输出文件复制到 OutputPath 参数指定的路径。BootstrapperComponentFiles 参数的值都应当基于此路径。如果为 false,则不复制文件,而且 BootstrapperComponentFiles 值将基于 Path 参数的值。
    OutputPath指定 setup.exe 和所有包文件要复制到的位置,这里设置的目录是应用程序安装文件的输出目录。
    Path指定所有可用的必备组件包的位置,示例中的Path路径是对于安装了VS2005的用户而言的,如果是安装了VS2008的用户,则Path的值应该是:C:/Program Files/Microsoft SDKs/Windows/v6.0A/Bootstrapper
    更多属性,请参考http://msdn.microsoft.com/zh-cn/library/ms164294.aspx
   
    步骤5:生成安装程序
    保存修改后的Sample.wixproj文件,在解决方案管理器(Solution Explorer)中右键Sample项目,选择重新加载项目(Reload Project),在弹出窗口中选择“是”,然后生成项目。
   
    我们来看看效果,在没有.Net Framework 2.0的虚拟机中,运行setup.exe,会弹出安装.Net Framework 2.0的界面,如图:
4.gif
    点击接受会开始安装.Net Framework 2.0组件,安装完.Net Framework 2.0后会自动安装Sample.msi。

    7.3 使用BMG工具制作自定义系统必备引导程序
   
    在使用ClickOnce发布时,vs自带了一个系统必备的列表(包括.Net Framework 和c++运行库等),列表中的必备程序我们是可以用上面的方法制作引导程序;但是这种方法只适用于将系统必备列表中的组件打包,而且需要编写一些xml代码,更好的方法是使用BMG(Bootstrapper Manifest Generator)工具,用它可以不用写任何代码为系统必备列表添加新的第三方组件,而且还可以为组件和安装程序创建引导程序。
   
    Visual studio2008版本的BMG工具可以到这个地址下载:http://code.msdn.microsoft.com/b ... aspx?ReleaseId=1567
   
    这里我用一个usb key的驱动程序作为安装必备程序的示例:
   
    1、下载安装BMG
   
    2、打开BMG,版本信息如下:
5.gif
    3、点击菜单File—>New打开新建项目对话框,选择Package Manifest项目类型。在弹出的对话框中输入Project Name和Product Code;
6.gif
    4、点击左上的Add Install File按钮,选择自定义必备程序所在的路径:
7.gif
    5、点击OK,出现如下界面,输入Display Name,其他属性可以选填,然后点击Build生成
8.gif
    6、在vs2008中我们就可以看到我们定义的系统必备程序:
9.gif
    7、接着点击菜单—>New,项目类型选择MSBuild,点击OK后,出现如下界面:
10.gif
    在General选项卡中输入生成安装文件的名称Name,选择要安装的文件Installer。

    8、接着点击Package选项卡,选择.net Framework 2.0 和USBKey Driver
11.gif
    9、点击Build按钮,选择生成目录,确定后生成MSBuild项目,在输出目录下生成安装文件和引导程序如下:
12.gif
    10、运行setup.exe安装引导程序,会出现安装USBKey Driver组件的界面,如下:
13.gif
    这里制作的USBKey Driver必备程序并没有设置启动条件和检查,也就是说不管机器上有没装这个驱动,都会执行驱动安装程序,要设置启动条件和检查,可以在第5步中设置相关的属性,具体可参考bmg帮助文档
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SgzyStudio

GMT+8, 2024-5-3 17:20 , Processed in 0.125490 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表