WiX:如何自动包含本地化的卫星组件?

时间:2014-08-25 15:32:45

标签: visual-studio-2010 internationalization wix windows-installer satellite-assembly

WiX可以设置为自动包含所有生成的附属程序集吗?

目标是使用一种英语语言MSI来安装一个应用程序,其中包含可用于~10种语言的本地化字符串。

我发现了现有的SO quetsion:

How do I include Satellite Assemblies(Localized Resources) in an MSI built with WiX?

但是,该解决方案建议需要为每个文化变体手动添加新的组件和目录定义。

这是唯一的方法,还是WiX能以某种方式从Visual Studio项目定义中自动了解每种语言?

(运行VS2010和WiX 3.8)

1 个答案:

答案 0 :(得分:0)

您可以使用HarvestDirectory任务自动收集要包含在安装程序中的文件。您只需将其指向带有附属程序集的文件夹,并在每个安装程序版本上 - 将重新扫描目标文件夹并重新生成文件列表。

例如:

1)将.wixproj收获任务置于beforedBuild目标内(默认情况下会被注释)

<Target Name="BeforeBuild">
<HeatDirectory OutputFile="SatelliteAsm_Files.wxs" Directory="$(SolutionDir)PathToYourAssemblies" DirectoryRefId="MODULELOCATION" ComponentGroupName="Modules" SuppressCom="true" SuppressFragments="true" SuppressRegistry="true" SuppressRootDirectory="true" AutoGenerateGuids="false" GenerateGuidsNow="true" ToolPath="$(WixToolPath)" PreprocessorVariable="var.ApplicationModuleDir" SuppressUniqueIds="True" />

2)首次构建安装程序。之后,您将在WIX项目中找到SatelliteAsm_Files.wxs文件。它将具有与此类似的结构:

<Fragment>
    <DirectoryRef Id="DIRVARIABLE">
        <Directory Id="dir8B97956DEA791D69AB336941C9163652" Name="x64">
            <Component Id="cmpE72E1056FC8A2AE97260E772A6386763" Guid="{481FF1F3-7AFF-4C17-9AE0-5347BEEB3726}">
                <File Id="filACCD137532BB3AE1F4B3BC207018585B" KeyPath="yes" Source="$(var.ApplicationLibDir)\x64\name.txt" />
            </Component>
            ...
<Fragment>
    <ComponentGroup Id="GroupName">
        <ComponentRef Id="cmpE72E1056FC8A2AE97260E772A6386763" />
        ...

3)添加作为链接(重要的是你不希望源代码控制将此文件设置为只读,因此构建时会失败,因此构建失败)。

4)在任何功能中引用此ComponentGroup

 <Feature Id="MyFeauture">
    <ComponentGroupRef Id="GroupName" />

最后它准备好了!现在,从您在收获任务中指定的文件夹中收集的文件将包含在安装程序中。但是不要指望这个开箱即用,因为设置这个很费劲,你可能需要尝试不同的任务键组合甚至是XSD转换才能只留下所需的文件(是的,WIX可以进行XSD转换,没有没有简单灵活的方法来过滤WIX收集的文件或文件夹

注意:您不仅可以将它用于附属程序集 - 可以收集整个bin,第三方库或任何您想要的内容,因此每次向您的程序集添加新程序集时都不需要手动更新安装程序项目溶液