定制TortoiseSVN安装包
TortoiseSVN的MSI安装包是使用Windows Installer XML (WIX)生成的。关于WIX的语法在这里不做解释,有兴趣的可以在网上搜搜,资料很多。今天我们将通过修改TortoiseSVN源代码中WIX的配置文件,来实现TortoiseSVN英文安装包和简体中文安装包的合并,并指定TortoiseSVN的默认语言为简体中文。
整体思路
分析TortoiseSVN中文包的安装过程,我们可以知道,安装TortoiseSVN中文包就是在TortoiseSVN安装目录的Languages文件夹下添加如下文件及文件夹,
(图一)
并在注册表“HKEY_CURRENT_USER——Software——TortoiseSVN”键下添加“DWORD 值”,名称:LanguageID,值:2052,基数:十进制。
根据这些分析我们将使用以下步骤来完成这个工作:
1. 在TortoiseSVN英文版安装完毕后,将图一所示文件拷贝至安装目录的相应位置;
2. 在注册表中添加“LanguageID”键;
准备文件
1. 生成TortoiseSVN安装包所需要的文件,可以通过编译TortoiseSVN源代码(具体方法见“编译TortoiseSVN源代码”)或在已安装TortoiseSVN的计算机上拷贝获得。
编译TortoiseSVN后生成的文件位于TortoiseSVN源代码根目录的“bin\release\bin”文件夹下。
可以在TortoiseSVN源代码根目录下运行“Nant msi”来测试生成MSI安装包所需文件都是否全部生成完毕,若有缺失,请重新编译TortoiseSVN,或者从已安装TortoiseSVN的计算机上拷贝相应文件至相应目录(Nant有提示那些路径缺少那些文件)。
若安装文件没有缺失,则可以在源代码的根目录的“bin”下,找到我们生成的MSI安装包,当然这只是最原始的英文安装包。
2. 为了能够将中文安装包和英文安装包合并,需要将图一所示文件(可在已安装TortoiseSVN中文包的计算机上拷贝)拷贝至源代码根目录的“bin\release\bin\LanguagePack_zh_CH”目录下。
经过以上步骤,生成中文安装包所需文件都已准备就绪,下面我们通过修改WIX的配置文件来完成这个中文安装包的制作。
修改WIX配置文件
本次我们要修改的WIX配置文件主要有以下三个:
1. FeaturesFragment.wxs:控制安装包中包含的可选及必选内容,在安装时供用户选择,如图二所示:
图二
2. Includes.wxi:为文件夹等生成一个GUID,在WIX中必须有一个唯一的GUID来确定一个内容;
3. StructureFragment.wxs:控制安装时在用户计算机上进行的操作。
它们都位于源代码根目录的\src\TortoiseSVNSetup目录下。
知道了它们的作用,我们大概分析下思路。在FeaturesFragment中添加中文安装包的Features,然后在StructureFragment中声明该Features需要完成的工作(拷贝文件及修改注册表)。
修改配置文件步骤如下:
1. 在FeaturesFragment的Fragment配置节下添加:
<Feature Id="LanguagePack_zh_CN" Level="1" Title="LanguagePack_zh_CN" Description="Add LanguagePack_zh_CN" TypicalDefault="install" Absent="allow">
<ComponentRef Id="C__LanguagePack_zh_CN" />
<ComponentRef Id="C__zh_CN" />
<ComponentRef Id="C__RegistryLanguage" />
</Feature>
以上代码就声明了一个名为LanguagePack_zh_CN的Feature,并声明其包含了三个内容,若用户在安装时选择安装此Feature,则安装程序会到StructureFragment文件中找到相应的内容及操作。
2. 在StructureFragment文件中找到
<Directory Id="D__Languages" Name="Languages">
</Directory>
配置节,然后在其中添加如下代码:
<Component Id="C__LanguagePack_zh_CN" Guid="$(var.GuidLanguagePack_zh_CN)" Win64="$(var.Win64YesNo)">
<File Id="F__TortoiseBlame2052" Name="TortoiseBlame2052.dll" Source="..\..\bin\release\bin\LanguagePack_zh_CH\TortoiseBlame2052.dll" DiskId="1" />
<File Id="F__TortoiseIDiff2052" Name="TortoiseIDiff2052.dll" Source="..\..\bin\release\bin\LanguagePack_zh_CH\TortoiseIDiff2052.dll" DiskId="1" />
<File Id="F__TortoiseMerge2052" Name="TortoiseMerge2052.dll" Source="..\..\bin\release\bin\LanguagePack_zh_CH\TortoiseMerge2052.dll" DiskId="1" />
<File Id="F__TortoiseMerge_zh_CN" Name="TortoiseMerge_zh_CN.chm" Source="..\..\bin\release\bin\LanguagePack_zh_CH\TortoiseMerge_zh_CN.chm" DiskId="1" />
<File Id="F__TortoiseProc2052" Name="TortoiseProc2052.dll" Source="..\..\bin\release\bin\LanguagePack_zh_CH\TortoiseProc2052.dll" DiskId="1" />
<File Id="F__TortoiseSVN_zh_CN" Name="TortoiseSVN_zh_CN.chm" Source="..\..\bin\release\bin\LanguagePack_zh_CH\TortoiseSVN_zh_CN.chm" DiskId="1" />
</Component>
<Directory Id="D__zh_CN" Name="zh_CN">
<Directory Id="D__LC_MESSAGES" Name="LC_MESSAGES">
<Component Id="C__zh_CN" Guid="$(var.GuidSubversionMo)" Win64="$(var.Win64YesNo)">
<File Id="F__Subversion" Name="Subversion.mo" Source="..\..\bin\release\bin\LanguagePack_zh_CH\zh_CN\LC_MESSAGES\Subversion.mo" DiskId="1" />
</Component>
</Directory>
</Directory>
注:以上部分是设置在安装TortoiseSVN时,创建中文包文件夹,并将中文包所需DLL等拷贝至相应的目录。
其中:Source只的是我们准备文件时,将这些DLL存放的路径。编译生成MSI安装包时,将会到这个Source找到相应的文件,将他们压缩进MSI安装包。
?
<Component Id="C__RegistryLanguage" Guid="$(var.GuidRegistryLanguage)" Win64="$(var.Win64YesNo)">
<RegistryValue Root="HKCU" Key="Software\TortoiseSVN" KeyPath="yes" Name="LanguageID" Value="2052" Type="integer" />
</Component>
注:以上部分是在用户的注册表HKCU下,添加设置TortoiseSVN语言的键值。
?
3. 由于WIX添加内容时,必须有一个GUID,上面的代码中我们用到了“GuidLanguagePack_zh_CN、GuidSubversionMo、GuidRegistryLanguage” 所以必须在Includes.wxi中添加相应的GUID声明,代码如下:
<?define GuidLanguagePack_zh_CN="C9D757EE-F449-4c57-9351-14C95BD34708"?>
<?define GuidSubversionMo="CA29F083-DC3E-4524-944A-AAE68DEAF3D7"?>
<?define GuidRegistryLanguage="48916997-33F9-4b13-BF9E-87025C23744F"?>
上面加粗的文字,即为随机生成的GUID。
至此,WIX配置文件修改完毕,我们可以运行“Nant MSI”来生成这个中文安装包。然后会在源代码根目录“bin”文件夹下,找到我们生成的MSI安装包。
双击安装程序进行安装,可以在安装向导中,看到我们刚才自定义的“Language_zh_CN”的Feature,如下图所示:
一路“Next”安装下去,并重启计算机后,我们就可以使用中文版的TortoiseSVN了。
注:我们可以通过这个方法很方便地修改TortoiseSVN的安装包,达到我们需要的定制效果。
下面这段代码就是定制config文件的方法,有兴趣的可以看看。
<Directory Id="AppDataFolder" Name="AppDataFolder">
<Directory Id="Subversion" Name="Subversion">
<Component Id="C__CustomConfig" Guid="$(var.GuidCustomConfig)" Win64="$(var.Win64YesNo)">
<RegistryValue Root="HKCU" Key="Software\TortoiseSVN" KeyPath="yes" Name="ConfigCustomState" Value="1" Type="binary" />
<File Id="F__config" Name="config" Source="..\..\bin\release\bin\Config\config" DiskId="1"/>
<RemoveFolder Directory="Subversion" On="uninstall" Id="RemoveFolder_Subversion" />
</Component>
</Directory>
</Directory>