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