WiX: Как автоматически включить локализованные спутниковые сборки?

Можно ли настроить WiX на автоматическое включение всех сгенерированных спутниковых сборок?

Цель состоит в том, чтобы иметь один MSI на английском языке, который установит приложение с локализованными строками, доступными для ~10 языков.

Я нашел этот существующий вопрос:

Как включить спутниковые сборки (локализованные ресурсы) в MSI, созданный с помощью WiX?

Однако это решение предполагает, что новые определения компонентов и каталогов необходимо добавлять вручную для каждого варианта культуры.

Это единственный способ, или WiX может каким-то образом автоматически изучать каждый язык из определений проекта Visual Studio?

(Работает VS2010 и WiX 3.8)

1 ответ

Вы можете использовать задачу 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) Создайте свой установщик в первый раз. После этого вы найдете файл SatelliteAsm_Files.wxs внутри вашего проекта WIX. Это будет иметь структуру, подобную этой:

<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) Добавьте его как ссылку (важно, чтобы управление исходным кодом не устанавливало этот файл только для чтения, coz WIX при сборке не удастся) в ваш проект.

4) Ссылка на эту ComponentGroup в любой из ваших функций

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

Наконец-то все готово! Теперь файлы, собранные из папки, указанной вами в задаче сбора урожая, будут включены в ваш установщик. Но не ожидайте, что это сработает "из коробки", потому что это очень сложно, и вам, возможно, придется попробовать разные комбинации клавиш задач или даже XSD-преобразований, чтобы оставить только необходимые файлы (да, WIX может выполнять XSD-преобразования, и нет нет простого и гибкого способа фильтрации файлов или папок, собранных WIX)

Примечание: вы можете использовать его не только для сателлитных сборок - это нормально для сбора всей корзины, сторонних библиотек или чего угодно, поэтому вам не нужно обновлять проект установщика вручную каждый раз, когда вы добавляете новую сборку в свое решение.