msitools学习

msitools使用

wixl-heat使用

概述

打包程序就是把程序依赖的所有库文件和可执行文件以及其他一些资源文件按照源目录结构进行压缩,知道自己的程序依赖哪些库是简单的,但是要知道依赖的库依赖哪些库就非常复杂了,所以我们需要使用msitools,它为我们预置了很多常用库的模板,即这些库包含哪些文件,并依赖了哪些文件,我们使用这些模板就能非常方便的找出我们程序所需要的所有文件了,预置的模板可以通过命令rpm -ql msitools | grep wxi查询

wxi文件介绍

使用spice-gtk3.wxi作为样例来简单的介绍下wxi文件基本格式,wxi类似C++中的头文件,可以使用?require来包含wxi文件

$ cat /usr/share/wixl-0.95/include/spice-gtk3.wxi
<?xml version="1.0" encoding="utf-8"?>
<?require gtk3.wxi?>
<?require spice-glib.wxi?>
<Include xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
<DirectoryRef Id="INSTALLDIR">
<Directory Id="dirF3B61B20E2250498456FBB66DD63E154" Name="bin">
<Component Win64="$(var.Win64)" Id="cmpA1DABC2491D8FFEDE1B305115701456D" Guid="*">
<File Id="filF15A4CFCF3F047C36D3A6592CDAC3D33" KeyPath="yes" Source="$(var.SourceDir)/bin/libspice-client-gtk-3.0-5.dll"/>
</Component>
</Directory>
</DirectoryRef>
</Fragment>
<Fragment>
<ComponentGroup Id="CG.spice-gtk3">
<ComponentGroupRef Id="CG.gtk3"/>
<ComponentGroupRef Id="CG.spice-glib"/>
<ComponentRef Id="cmpA1DABC2491D8FFEDE1B305115701456D"/>
</ComponentGroup>
</Fragment>
</Include>
  • xml节点 : xml的标准开头
  • require节点 : spice-gtk3所依赖的库的wxi文件
  • Include节点 : 描述spice-gtk3的库文件信息的顶层容器元素
  • Fragment节点 : 构建安装模块信息的原子单元
  • DirectoryRef节点 : 在另一个片段中创建一个目录元素的引用
  • Directory节点 : 产品的目录布局,同样还能指定源目录和目标目录之间的映射
  • Component节点 : 父目录的组件
  • File节点 : 文件列表的文件规范,必须是Component的子节点
  • ComponentGroup节点 : 组织多个在其他地方使用的组件
  • ComponentRef节点 : Component节点的引用
  • ComponentGroupRef节点 : ComponentGroup节点的引用

现在对spice-gtk3.wxi文件进行详细说明:

  • 3、4 : 引用gtk3和spice-glib库
  • 7、8 : 指明安装目录为bin
  • 9、10 : 添加spice-gtk3自身文件
  • 16、17、18、19 : 打包spice-gtk3组,可在其他地方通过require+ComponentGroupRef的方式使用

使用wixl-heat生成wxi文件

wixl-heat接收文件列表作为输入(文件列表可以通过ls、find以及rpm -ql获取),产生项目的文件列表以及依赖文件

echo /usr/i686-w64-mingw32/sys-root/mingw/bin/zlib1.dll | wixl-heat -p /usr/i686-w64-mingw32/sys-root/mingw/ --component-group CG.zlib --var var.SourceDir
<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
<DirectoryRef Id="TARGETDIR">
<Directory Id="dir9A5D56716D566997FA290054D161AF96" Name="bin">
<Component Id="cmp9FA4766702C1F85ABA6E04DE3B061A12" Guid="*">
<File Id="filE110AAB4803C5CC567BBCF8AD3BB7C08" KeyPath="yes" Source="$(var.SourceDir)/bin/zlib1.dll"/>
</Component>
</Directory>
</DirectoryRef>
</Fragment>
<Fragment>
<ComponentGroup Id="CG.zlib">
<ComponentRef Id="cmp9FA4766702C1F85ABA6E04DE3B061A12"/>
</ComponentGroup>
</Fragment>
</Wix>
<!-- generated with msitools 0.93.40-6aec -->
<!-- wixl-heat -p /usr/i686-w64-mingw32/sys-root/mingw/ -component-group CG.zlib -var var.SourceDir -->

个人对于-p参数的理解,因为要保持linux下和windows下目录结构的一致,例如linux下的"/usr/i686-w64-mingw32/sys-root/mingw/bin",在windows下就是"C:\Program Files (x86)\ProjectName\bin",其中不同的部分就是bin之前的部分,所以-p就是用变量来替换这些不同的部分

virt-viewer的msi制作研究

virt-viewer的msi制作模拟

下面的片段截取virt-viewer的data目录的Makefile.am文件

virt-viewer-$(WIXL_ARCH)-$(VERSION).msi: virt-viewer.wxs deps.txt
$(AM_V_GEN)DESTDIR=`mktemp -d` && \
make -C $(top_builddir) install DESTDIR=$$DESTDIR >/dev/null && \
find $$DESTDIR | wixl-heat -p $$DESTDIR$(prefix)/ \
--component-group CG.virt-viewer --var var.DESTDIR \
--directory-ref=INSTALLDIR > virt-viewer-files.wxs && \
MANUFACTURER="$(MANUFACTURER)" wixl -D SourceDir=$(prefix) \
-D DESTDIR=$$DESTDIR$(prefix) \
-D HaveSpiceGtk=$(HaveSpiceGtk) \
-D HaveGtkVnc=$(HaveGtkVnc) \
-D HaveLibvirt=$(HaveLibvirt) \
-D HaveOVirt=$(HaveOVirt) \
--arch $(WIXL_ARCH) \
-o $@ \
$< virt-viewer-files.wxs && \
rm -rf $$DESTDIR virt-viewer-files.wxs

我们手动创建tmp目录来模拟 mktemp -d 命令

$ pwd
/home/fedora/x86/virt-viewer/data/tmp

执行install命令,生成如下目录结构

$ make -C /home/fedora/x86/virt-viewer install DESTDIR=/home/fedora/x86/virt-viewer/data/tmp
$ ls usr/i686-w64-mingw32/sys-root/mingw/
bin/ share/

执行find命令

$ find /home/fedora/x86/virt-viewer/data/tmp/ | wixl-heat -p /home/fedora/x86/virt-viewer/data/tmp/usr/i686-w64-mingw32/sys-root/mingw/ --component-group CG.virt-viewer --var var.DESTDIR --directory-ref=INSTALLDIR > virt-viewer-files.wxs
$ ls
usr virt-viewer-files.wxs
$ cp *.wxi ./tmp/
$ cd tmp/
$ rpm -qa | grep mingw32 | sort | unix2dos > deps.txt
$ ls
adwaita-icons-needed.wxi deps.txt usr virt-viewer-files.wxs virt-viewer.wxs

执行wixl命令(因为我们没有使用makefile所以有些变量需要修改成固定值)

$ vim ./virt-viewer.wxs
//修改如下四处
:1,$ s/$(env.MANUFACTURER)/0/
:1,$ s/$(var.Version)/0/
:1,$ s/$(var.UpgradeCode)/0/
<Icon Id="virt-viewer.ico" SourceFile="../../icons/virt-viewer.ico"/> $ wixl -D SourceDir=/usr/i686-w64-mingw32/sys-root/mingw -D DESTDIR=/home/fedora/x86/virt-viewer/data/tmp/usr/i686-w64-mingw32/sys-root/mingw -D HaveSpiceGtk=True -D HaveGtkVnc=False -D HaveLibvirt=False -D HaveOVirt=False --arch x86 -o virt-viewer-x86-3.0.msi virt-viewer.wxs virt-viewer-files.wxs
$ msiextract -l virt-viewer-x86-3.0.msi

virt-viewer的msi制作解析

virt-viewer.wxs描述一些图标等资源文件以及安装信息,动态生成的virt-viewer-files.wxs就是我们make install产生的工程文件,通过这两个文件就生成了msi文件。fedora下的msitools毕竟没有windows下的wixtoolset那么强大,所以很多功能都还是不支持的

总结

开源项目有很多值得借鉴和参考的部分,我们能够读懂并能够根据实际需求进行修改是最实用的技能

Fedora下Msitools使用的更多相关文章

  1. ###Fedora下安装Retext

    使用Markdown. #@date: 2012-05-07 #@author: gr #@email: forgerui@gmail.com 因为习惯了Markdown的简单,所以需要在自己的Fed ...

  2. Linux(Fedora)下NodeJs升级最新版本(制定版本)

    Linux(Fedora)下NodeJs升级最新版本(制定版本) 首先安装n模块: npm install -g n 升级node.js到最新稳定版 n stable 升级node.js到制定版本 n ...

  3. Fedora下用Iptux,中文乱码解决

    Ubuntu/Fedora下用Iptux与Windows下大飞鸽传书,中文乱码解决 问题描述: 在Ubuntu/Fedora下安装了Iptux后,再往Windows机器上发送文件或消息时,如果有中文, ...

  4. linux(fedora) 下dvwa 建筑环境

    linux(fedora)下dvwa组态 1.下载httpd,dvwa,mysql,mysqlserver, php-mysql,php 除了dvwa 这是外界进入下一官方网站.该服务通过休息inst ...

  5. fedora下一些问题的解决方案汇总

    解决fedora下一些使用问题 一 解决fedora下无法使用Fn+功能键来调整亮度的问题 在fedora下,背光的配置参数在/sys/class/backlight文件夹下,根据不同的显卡,有不同的 ...

  6. Fedora下phpMyAdmin的安装和配置

    phpMyAdmin主要用于以web界面形式管理mysql.其在Fedora下的安装方法如下: 1. yum install phpMyAdmin 利用yum安装的phpMyAdmin,其路径如下: ...

  7. OpenCV在Linux(Fedora)下搭建开发环境简述

    盼望了好久的Fedora21终于发行了.先来晒一张图: 默认桌面还是那么简洁: 好了,废话少说.来看看在Fedora下搭建opencv开发环境,因为我已经搭建好了(过程比较艰辛) 先注明参考文章,感谢 ...

  8. fedora下编译运行java傻瓜入门级教程

    操作步骤: 编译运行环境的搭建 fedora下默认安装为GNU公司的JDK,如下所示 $java -version java version "1.7.0_25" OpenJDK ...

  9. fedora下手动编译安装vim

    据说手动编译安装可以更适合自己的电脑哦- 1.首先,我门要下载源文件,下载地址:ftp://ftp.vim.org/pub/vim/unix/ 选择一个最新版本,我这里选择的是 vim-7.4.tar ...

随机推荐

  1. 韩国版微信Kakao推出公链,能否用区块链实现全球扩张?

    2018年是属于区块链的一年,国内外巨头们纷纷布局区块链产业,前不久韩国最大的移动社交平台Kakao集团正式启动了旗下的第一个公链Klaytn的测试网. 此次宣布只是一次试探性举措,旨在对外公布Kla ...

  2. ABAP HTTP POST

    1.HTTP DATA: lo_http_client TYPE REF TO if_http_client, lv_service TYPE string, lv_result TYPE strin ...

  3. IOS 关于 NSUserDefault

    转载 并不是所有的东西都能往里放的.NSUserDefaults只支持: NSString, NSNumber, NSDate, NSArray, NSDictionary.   NSUserDefa ...

  4. POJ2278 DNA Sequence —— AC自动机 + 矩阵优化

    题目链接:https://vjudge.net/problem/POJ-2778 DNA Sequence Time Limit: 1000MS   Memory Limit: 65536K Tota ...

  5. myeclipse内存不足的处理

    Myeclipse内存溢出解决方案 1.tomcat内存扩展 修改tomcat中bin目录下catalina.bat文件在echo Using CATALINA_BASE:  "%CATAL ...

  6. matlab之boundary()函数

    j = boundary(x,y,0.1); %这个函数是求一堆(平面)点的边界,它不是凸包,这里的边界可以凹陷,第三个参数0.1代表以松散的形式画出边界,1是以最紧凑的形式画出边界. 下面这个是官网 ...

  7. static语句块的执行时间

    package utfTest; public class Test01 { public static void main(String[] args) { //Person.show(); Sys ...

  8. 解决 ssh 链接慢问题

    sed -i 's/GSSAPIAuthentication yes/GSSAPIAuthentication no/' /etc/ssh/sshd_configsed -i '/#UseDNS ye ...

  9. Seal Report结合MySQL数据库 报表展现_20161011

    昨天留了草稿 未来得及发 今日补发一篇 seal report 操作类似excel数据透视表也包含行标签和列标签及值标签,行列代表的是数据指标的维度,值标签代表的是度量. seal report连接M ...

  10. javacpp-FFmpeg系列补充:FFmpeg解决avformat_find_stream_info检索时间过长问题

    javacpp-ffmpeg系列: javacpp-FFmpeg系列之1:视频拉流解码成YUVJ420P,并保存为jpg图片 javacpp-FFmpeg系列之2:通用拉流解码器,支持视频拉流解码并转 ...