Мы уже давно используем WiX, и, несмотря на обычные жалобы на простоту использования, все идет довольно хорошо. То, что я ищу, это полезный совет относительно:
- Настройка проекта WiX (макет, ссылки, шаблоны файлов)
- Интеграция WiX в решения и процессы сборки / выпуска
- Настройка установщиков для новых установок и обновлений
- Любые хорошие взломы WiX, которыми вы хотели бы поделиться
practical, answerable questions based on actual problems that you face
части FAQ.Ответы:
Храните переменные в отдельном
wxi
включаемом файле. Позволяет использовать повторно, переменные быстрее находят и (при необходимости) облегчают манипулирование внешним инструментом.Определите переменные платформы для сборок x86 и x64
Сохраните место установки в реестре, чтобы обновления могли найти правильное местоположение. Например, если пользователь устанавливает пользовательский каталог установки.
Заметка : гуру WiX Роб Меншинг опубликовал отличную запись в блоге, в которой более подробно рассматриваются и исправляются крайние случаи, когда свойства задаются из командной строки.
Примеры с использованием 1. 2. и 3.
и
Самый простой подход - это всегда делать крупные обновления , поскольку он позволяет как новые установки, так и обновления в одном MSI.Код UpgradeCode привязан к уникальному Guid и никогда не изменится, если мы не хотим обновить существующий продукт.
Примечание : в WiX 3.5 появился новый элемент MajorUpgrade, который оживляет еще проще !
Создание значка в «Установка и удаление программ»
В сборках выпуска мы устанавливаем версии для наших установщиков, копируя файл MSI в каталог развертывания. Пример этого с использованием цели wixproj, вызываемой из цели AfterBuild:
Используйте тепло для сбора файлов с помощью шаблона Guid. Полезно, если вы хотите повторно использовать файлы WXS в нескольких проектах (см. Мой ответ о нескольких версиях одного и того же продукта). Например, этот пакетный файл автоматически собирает выходные данные RoboHelp.
Там происходит немного,
robocopy
убирает метаданные рабочей копии Subversion перед сбором;-dr
ссылка корневую директорию установлена на нашем месте установки, а не на TARGETDIR по умолчанию;-var
используется для создания переменной, указывающей исходный каталог (выходные данные веб-развертывания).Простой способ включить версию продукта в заголовок приветствия с помощью Strings.wxl для локализации. ( Предоставлено : saschabeaumont . Добавлено, поскольку этот замечательный совет скрыт в комментарии)
Избавьте себя от боли и следуйте советам Вима Коэна по одному компоненту на файл. Это также позволяет вам пропустить (или подстановочный знак
*
) GUID компонента .Роб Меншинг (Rob Mensching) имеет удобный способ быстро отследить проблемы в файлах журналов MSI путем поиска
value 3
. Обратите внимание на комментарии, касающиеся интернационализации.При добавлении условных функций более интуитивно понятно установить уровень функции по умолчанию на 0 (отключен), а затем установить уровень условия на желаемое значение. Если вы установите уровень функции по умолчанию> = 1, уровень условия должен быть 0, чтобы отключить его, а это означает, что логика условия должна быть противоположна ожидаемой, что может сбивать с толку :)
источник
Проверка, установлен ли IIS:
Проверка, установлена ли совместимость с метабазой IIS 6 в Vista +:
источник
Храните все идентификаторы в отдельных пространствах имен
F.
примеров: F.Documentation, F.Binaries, F.SampleCode.C.
примера: C.ChmFile, C.ReleaseNotes, C.LicenseFile, C.IniFile, C.RegistryCA.
например: CA.LaunchHelp, CA.UpdateReadyDlg, CA.SetPropertyXFi.
Di.
Я считаю, что это очень помогает отслеживать все идентификаторы во всех категориях.
источник
Фантастический вопрос. Я хотел бы увидеть некоторые лучшие практики.
У меня есть много файлов, которые я распространяю, поэтому я настроил свой проект на несколько исходных файлов wxs.
У меня есть исходный файл верхнего уровня, который я называю Product.wxs, который в основном содержит структуру для установки, но не фактические компоненты. Этот файл имеет несколько разделов:
Остальные файлы .wix состоят из фрагментов, содержащих ComponentGroups, на которые есть ссылки в теге Feature в Product.wxs. Мой проект содержит хорошую логическую группу файлов, которые я распространяю
Это не идеально, мое чувство паука ОО немного покалывает, потому что фрагменты должны ссылаться на имена в файле Product.wxs (например, DirectoryRef), но мне легче поддерживать этот один большой исходный файл.
Я хотел бы услышать комментарии по этому поводу, или если у кого-то тоже есть хорошие советы!
источник
Установите флажок в диалоговом окне выхода, чтобы запустить приложение или файл справки.
...
Если вы делаете это таким образом, «стандартный» внешний вид не совсем подходит. Флажок всегда серый фон, а диалог белый:
альтернативный текст http://www.dizzymonkeydesign.com/blog/misc/adding-and-customizing-dlgs-in-wix-3/images/exit_dlg_1.gif
Одним из способов решения этой проблемы является указание собственного настраиваемого ExitDialog с другим флажком . Это работает, но, кажется, много работы, чтобы изменить цвет одного элемента управления. Другой способ решения этой проблемы - постобработка сгенерированного MSI для изменения полей X, Y в таблице Control для этого конкретного элемента управления CheckBox. Код JavaScript выглядит следующим образом:
Запуск этого кода в виде сценария командной строки (с использованием cscript.exe) после создания MSI (из light.exe) приведет к созданию ExitDialog, который выглядит более профессионально:
альтернативный текст http://www.dizzymonkeydesign.com/blog/misc/adding-and-customizing-dlgs-in-wix-3/images/exit_dlg_2.gif
источник
WIXUI_EXITDIALOGOPTIONALCHECKBOX
наWIXUI_EXITDIALOGOPTIONALCHECKBOX = 1 and NOT Installed
внутреннюю<Publish>
Создание версий Live, Test, Training, ... с использованием одних и тех же исходных файлов.
В двух словах: создайте уникальный код UpgradeCode для каждого установщика и автоматически определите первый символ каждого идентификатора Guid для каждого установщика, оставив оставшиеся 31 уникальными.
Предпосылки
Предположения
Структура каталогов
Обработать
Пример Config.wxi
Пример Config.Common.wxi
Пример Components.wxs
Примечание. Теперь я бы предложил оставить атрибут Guid вне компонента (эквивалент
*
), используя один файл для каждого компонента и указав его в качестве ключевого пути. Это устраняет необходимость вызоваModifyComponentsGuids
иRevertComponentsGuids
целей, показанных ниже. Это может быть возможно не для всех ваших компонентов.Пример Setup.Live.wixproj
Последние мысли
ОБНОВЛЕНИЕ 1: Автоматически генерируемый компонент Guids устраняет необходимость вызова задачи FileUpdate, если вы создаете компонент с Guid = "*" для каждого файла, устанавливая файл в качестве ключевого пути.
ОБНОВЛЕНИЕ 2: Одна из проблем, с которой мы столкнулись, это то, что если вы не генерируете Guid вашего компонента автоматически, а сборка завершается неудачно, то временные файлы необходимо удалить вручную.ОБНОВЛЕНИЕ 3: Найден способ убрать зависимость от svn: externals и создания временных файлов. Это делает процесс сборки более гибким (и это лучший вариант, если вы не можете использовать символы подстановки для ваших гидов) и менее хрупким, если в свете или свече происходит сбой сборки.
ОБНОВЛЕНИЕ 4: Поддержка нескольких экземпляров, использующих преобразования экземпляров, в WiX 3.0+, безусловно, также стоит посмотреть.
источник
Использование журнала Msi Diagnostic для получения подробной информации об ошибках
msiexec /i Package.msi /l*v c:\Package.log
куда
это название вашей посылки и где вы хотите вывод журналаMsi коды ошибок
Вводное видео Wix
Да и Рандом Вводное видео Wix с участием «Мистера WiX» Роба Меншинга полезно для «концептуальной общей картины».
источник
Используйте Javascript CustomActions, потому что они очень просты
Люди говорят, что Javascript не подходит для пользовательских действий MSI . Причины: трудно отлаживать, сложно сделать надежным. Я не согласна Это не сложно отладить, конечно, не сложнее, чем C ++. Это просто по-другому. Я обнаружил, что писать CustomActions в Javascript очень просто, гораздо проще, чем с помощью C ++. Намного быстрее. И так же надежно.
Есть только один недостаток: Javascript CustomActions можно извлечь через Orca, тогда как C / C ++ CA потребует обратного инжиниринга. Если вы считаете, что ваше установочное волшебство защищено интеллектуальной собственностью, вам следует избегать сценариев.
Если вы используете скрипт, вам просто нужно начать с какой-то структуры. Вот некоторые, чтобы вы начали.
Javascript «шаблонный» код для CustomAction:
Затем зарегистрируйте настраиваемое действие примерно так:
Вы можете, конечно, вставить столько функций Javascript, сколько захотите, для нескольких пользовательских действий. Один пример: я использовал Javascript для выполнения запроса WMI на IIS, чтобы получить список существующих веб-сайтов, на которые можно установить фильтр ISAPI. Этот список затем использовался для заполнения списка, показанного позже в последовательности пользовательского интерфейса. Все очень просто.
На IIS7 нет поставщика WMI для IIS, поэтому я использовал
shell.Run()
подход для вызова appcmd.exe для выполнения работы. Легко.Похожий вопрос: О Javascript CustomActions
источник
Питер Тейт уже показал, как вы можете определить определения многократного использования ComponentGroup в отдельных фрагментах wix. Некоторые дополнительные трюки, связанные с этим:
Псевдоним каталога
Фрагментам группы компонентов не нужно знать о каталогах, определенных основным продуктом wxs. В вашем фрагменте группы компонентов вы можете говорить о такой папке:
Тогда основной продукт может создать псевдоним одного из своих каталогов (например, «productInstallFolder»), например:
График зависимостей
Элементы ComponentGroup могут содержать дочерние элементы ComponentGroupRef. Это хорошо, если у вас большой пул повторно используемых компонентов со сложным графом зависимостей между ними. Вы просто настраиваете ComponentGroup в своем собственном фрагменте для каждого компонента и объявляете зависимости следующим образом:
Если вы теперь ссылаетесь на группу компонентов «B» в своей настройке, поскольку она является прямой зависимостью вашего приложения, она автоматически вытянет группу компонентов «A», даже если автор приложения никогда не осознавал, что это была зависимость «B». Это «просто работает», пока у вас нет циклических зависимостей.
Многоразовый wixlib
Вышеупомянутая идея графа зависимостей работает лучше всего, если вы скомпилируете компоненты big-pool-o-reusable-компоненты в повторно используемый пакет wixlib с lit.exe. При создании настройки приложения вы можете ссылаться на этот wixlib во многом как файл wixobj. Компоновщик Candle.exe автоматически удалит все фрагменты, которые не «извлекаются» основным файлом (файлами) wxs.
источник
Я удивлен, что никто не упомянул использование T4 для генерации файла WXS во время сборки. Я узнал об этом с помощью Henry Lee @ New Age Solutions .
По сути, вы создаете пользовательскую задачу MSBuild для выполнения шаблона T4, и этот шаблон выводит WXS непосредственно перед компиляцией проекта Wix. Это позволяет (в зависимости от того, как вы его реализуете) автоматически включать все выходные сборки, полученные при компиляции другого решения (это означает, что вам больше не нужно редактировать wxs при каждом добавлении новой сборки).
источник
Используя Heat.exe, чтобы разбить лицо и нанести «Epic Pwnage» на мучительно больших инсталляциях
Расширяя ответы Си и Роберта-П о жаре.
Перевод: (Использование Heat, чтобы не вводить отдельные файлы в проект вручную и для автоматизации сборок для упрощения процесса.)
Синтаксис WiX 2.0 Heat подробно
Для более новых версий (не все, что отличается от более старых версий, но есть потенциально раздражающие изменения синтаксиса ....) перейдите в каталог Heat is from cmd.exe и просто введите команду heat, но у меня есть пример прямо здесь для справки с более новыми версиями, если это необходимо.
Добавление следующего к событию Build Event в Visual Studio 2010.
(Щелкните правой кнопкой мыши Project-> Properties -> Build Events-> Pre-Build Events)
$(WIX)bin\heat.exe" dir "$(EnviromentVariable)" -cg GroupVariable -gg -scom -sreg -sfrag - srd -dr INSTALLLOCATION -var env.LogicPath -out "$(FragmentDir)\FileName.wxs
Генерирует направляющие при нагреве (как при выполнении команды выше)
Не берите "COM-файлы"
Не берите "Файлы реестра"
Не хватайте "Фрагменты"
Не берите "Корень Dir"
dir указывает, что вы хотите, чтобы Heat просматривал папку
Имя переменной, которую вы добавили бы к переменным препроцессора в свойствах проекта (щелкните правой кнопкой мыши, перейдите в свойства) -> раздел Построение, где указано определение переменных препроцессора (предполагается, что Visual Studio 2010)
Нет двойных кавычек, но заканчивается точкой с запятойComponentGroup, на которую будут ссылаться из созданного фрагмента в основной файл wxs
Каталог фрагментов, в котором будет храниться выходной фрагмент wxs
Имя файла
Полный учебник здесь, так чертовски полезно
Часть 1 Часть 2
источник
Включая COM-объекты:
heat
генерирует все большинство (если не все) записи реестра и другую необходимую для них конфигурацию. Радуйтесь!Включение управляемых COM-объектов (иначе, .NET или C # COM-объектов)
Использование
heat
управляемого COM-объекта даст вам почти полный документ wix.Если вам не нужна библиотека, доступная в GAC (т. Е. Глобально доступная: в большинстве случаев это вам не нужно с вашими сборками .NET в любом случае - вы, вероятно, сделали что-то не так в этот момент, если она не предназначена для этого). общей библиотекой) вам нужно будет обязательно обновить
CodeBase
раздел реестра, который будет установлен[#ComponentName]
. Если вы планируете установить его в GAC (например, вы создали новую классную библиотеку, которую все захотят использовать), вы должны удалить эту запись и добавить два новых атрибута вFile
элемент:Assembly
иKeyPath
. Сборка должна быть установлена на ".net" иKeyPath
должна быть установлена на "да".Тем не менее, некоторым средам (особенно всем, что связано с управляемой памятью, например языками сценариев) также потребуется доступ к Typelib. Убедитесь, что вы запустили
heat
свою библиотеку типов и включили ее.heat
сгенерирует все необходимые ключи реестра. Как это круто?источник
Установка в
C:\ProductName
Некоторые приложения должны быть установлены
C:\ProductName
или что-то подобное, но 99,9% (если не 100%) примеров в сетевой установкеC:\Program Files\CompanyName\ProductName
.Следующий код может быть использован для установки
TARGETDIR
свойства в корневой каталогC:
диска (взят из списка пользователей WiX ):ПРИМЕЧАНИЕ: по умолчанию
TARGETDIR
не указывает наC:\
! Это скорее указывает на то,ROOTDRIVE
что в свою очередь указывает на корень диска с наибольшим количеством свободного места ( см. Здесь ) - и это не обязательноC:
диск. Там может быть другой жесткий диск, раздел или USB-накопитель!Затем, где-то под вашим
<Product ...>
тегом, вам понадобятся следующие теги каталога, как обычно:источник
WindowsVolume
?WindowsVolume
свойство не может использоваться какDirectory
(компилятор выдает ошибку / предупреждение), как указано здесь и здесь . Лично я нахожу этот обходной путь запутанным.Переменные среды
При компиляции документов Wxs в код wixobj вы можете использовать переменные среды для определения различной информации. Например, допустим, вы хотите изменить, какие файлы будут включены в проект. Допустим, у вас есть переменная окружения RELEASE_MODE, которую вы установили непосредственно перед сборкой MSI (с помощью скрипта или вручную, это не имеет значения). В исходном коде wix вы можете сделать что-то вроде:
а затем позже в своем коде, используйте его на месте, чтобы на лету изменить ваш документ wxs, например:
источник
Использование RobM специального «Помните Property» шаблон
http://robmensching.com/blog/posts/2010/5/2/The-WiX-toolsets-Remember-Property-pattern
источник
Создание пользовательских действий для WIX, написанных в управляемом коде (C #) без Votive
http://www.codeproject.com/KB/install/wixcustomaction.aspx
источник
Редактирование диалогов
Хорошей способностью редактировать диалоги является использование SharpDevelop в версии 4.0.1.7090 (или выше). С помощью этого инструмента можно открывать, просматривать и редактировать автономный диалог (файлы wxs из источников WiX, например, InstallDirDlg.wxs) в режиме конструктора.
источник
Установка флага IIS enable32BitAppOnWin64 http://trycatchfail.com/blog/post/WiX-Snippet-change-enable32BitAppOnWin64.aspx
источник
Изменить "Готов к установке?" диалог (он же VerifyReadyDlg), чтобы предоставить сводку сделанных выборов.
Это выглядит так:
альтернативный текст http://i46.tinypic.com/s4th7t.jpg
Сделайте это с помощью Javascript CustomAction:
Javascript код:
Объявите Javascript CA:
Присоедините ЦС к кнопке. В этом примере CA запускается при нажатии Next из CustomizeDlg:
Связанный вопрос SO: Как я могу установить, во время выполнения, текст, который будет отображаться в VerifyReadyDlg?
источник
Поместите компоненты, которые могут быть исправлены по отдельности внутри своих фрагментов
Это относится как к созданию установщиков продукта, так и к исправлениям: если вы включаете какой-либо компонент в фрагмент, вы должны включить все компоненты в этот фрагмент. В случае сборки установщика, если вы пропустите какие-либо ссылки на компоненты, вы получите ошибку компоновки из light.exe. Однако, когда вы делаете исправление, если вы включаете ссылку на один компонент во фрагмент, то все измененные компоненты из этого фрагмента будут отображаться в вашем исправлении.
как это:
вместо этого:
Кроме того, при исправлении с использованием темы «Использование Purely WiX» из файла справки WiX.chm используйте следующую процедуру для создания исправления:
недостаточно просто иметь версию 1.1 product.wixpdb, собранную с использованием компонентов в отдельных фрагментах. Поэтому перед отправкой обязательно правильно фрагментируйте свой продукт.
источник
Печать лицензионного соглашения от Wix3.0 и выше
1) Когда вы компилируете исходный код wix, light.exe должен ссылаться на WixUIExtension.dll в командной строке. Для этого используйте ключ командной строки -ext.
2) Если при добавлении ссылки на WixUIExtension.dll ваш проект не скомпилируется, это, скорее всего, из-за столкновений идентификаторов диалогов, т.е. ваш проект использовал те же идентификаторы диалогов, что и некоторые стандартные диалоги в WixUIExtension.dll, дать разные идентификаторы для ваших диалогов. Это довольно распространенная проблема.
3) В вашем диалоговом окне лицензии должен быть элемент управления ScrollableText с идентификатором «LicenseText». Wix ищет именно это имя элемента управления при печати.
и кнопка, которая ссылается на пользовательское действие
4) Определите CustomAction с помощью Id = "PrintEula" следующим образом:
Примечание: BinaryKey отличается в Wix3.0 по сравнению с Wix2.0 и должен быть точно "WixUIWixca" (с учетом регистра).
Когда пользователь нажимает кнопку, ему / ей будет представлен стандартный диалог выбора принтера, и он сможет печатать оттуда.
источник
Мы показываем версию продукта где-то (крошечную) на первом экране графического интерфейса. Потому что люди склонны делать ошибки при выборе правильной версии каждый раз. (И держать нас, разработчиков, ищущих целую вечность ..)
Мы настроили TFSBuild, чтобы также генерировать преобразования (файлы MST) с конфигурацией для наших различных сред. (Мы знаем обо всех средах, в которых нам нужно развернуться).
Поскольку оригинальное сообщение в блоге Гранта Холлидея не работает, я скопировал его содержимое здесь:
Задача MSBuild для создания файлов MSI Transform из XMLMarch 11 2008
В моем предыдущем посте я описал, как вы можете использовать файлы MSI Transform (* .mst), чтобы отделить параметры конфигурации, относящиеся к среде, от стандартного пакета MSI.
Хотя это обеспечивает уровень гибкости в вашей конфигурации, есть два недостатка файлов Transform:
К счастью, мы можем использовать библиотеку объектов установщика Microsoft Windows (c: windowssystem32msi.dll), чтобы открывать «базы данных» MSI и создавать файлы преобразования.
Кредиты снова идут к Алексу Шевчуку - От MSI к WiX - Часть 7 Настройка установки с использованием Transforms, чтобы показать нам, как этого добиться с помощью VbScript. По сути, все, что я сделал, это взял пример Алекса и, используя Interop.WindowsInstaller.dll, я реализовал задачу MSBuild. Задача MSBuild
Загрузите исходный код и пример transforms.xml здесь (~ 7Kb Zipped VS2008 Solution)
источник
Перед развертыванием установочного пакета я всегда контролирую его содержимое.
Это всего лишь простой вызов в командной строке (в соответствии с постом Terferences), откройте командную строку и введите
Это извлечет содержимое пакета в подкаталог «Извлечь» с текущим путем.
источник
Вместо ORCA используйте InstEd, который является хорошим инструментом для просмотра таблиц MSI. Также он имеет возможность различать два пакета с помощью Transform -> Compare To ...
Дополнительно доступна версия Plus с дополнительными функциями. Но также бесплатная версия предлагает хорошую альтернативу для Orca.
источник
Регистрация сборок .NET для COM Interop с совместимостью с x86 / x64
NB Этот фрагмент по сути такой же, как REGASM Assembly.dll / codebase
В этом примере происходит несколько вещей, так что вот код, и я объясню это позже ...
Если вам интересно, это на самом деле для драйвера телескопа ASCOM .
Во-первых, я воспользовался советом сверху и создал несколько платформенных переменных в отдельном файле, вы можете увидеть их, разбросанные по XML.
Часть if-then-else рядом с топом имеет дело с совместимостью между x86 и x64. Моя сборка нацелена на «Любой процессор», поэтому в системе x64 мне нужно зарегистрировать его дважды, один раз в 64-битном реестре и один раз в 32-битных
Wow6432Node
областях. If-then-else настраивает меня на это, значения используются вforeach
цикле позже. Таким образом, мне нужно только один раз создать ключи реестра (принцип СУХОГО).Элемент file указывает фактическую сборку dll, устанавливаемую и зарегистрированную:
Ничего революционного, но обратите внимание на
Assembly=".net"
- этот один атрибут мог бы привести сборку в GAC, а это НЕ то, что я хотел. ИспользованиеAssemblyApplication
атрибута для указания на себя - это просто способ остановить Wix, помещающий файл в GAC. Теперь, когда Wix знает, что это сборка .net, он позволяет мне использовать определенные переменные связующего в моем XML, такие как,!(bind.assemblyFullname.filDriverAssembly)
чтобы получить полное имя сборки.источник
Установите
DISABLEADVTSHORTCUTS
свойство, чтобы все объявленные ярлыки в вашем установщике становились обычными, и вам не нужно включать фиктивный ключ reg, который будет использоваться в качестве пути к ключу.Я думаю, что Windows Installer 4.0 или выше является обязательным требованием .
источник
Это хорошая структура, но, исходя из моего опыта, мне интересно, как вы решаете эти условия:
О. Все ваши установки появляются в одном и том же месте назначения. Если пользователю необходимо установить все 3 версии одновременно, ваш процесс разрешит это. Могут ли они однозначно сказать, какую версию каждого исполняемого файла они запускают?
B. Как вы обрабатываете новые файлы, которые существуют в TEST и / или TRAINING, но еще не в LIVE?
источник
Вот способ помочь крупным веб-проектам проверить, что количество развернутых файлов соответствует количеству файлов, встроенных в MSI (или модуль слияния). Я только что запустил пользовательскую задачу MSBuild для нашего основного приложения (все еще находящегося в разработке), и оно обнаружило довольно много отсутствующих файлов, в основном, изображений, но несколько файлов javascript уже проскользнули!
Этот подход (просмотр таблицы файлов MSI путем подключения к цели AfterBuild проекта WiX) может работать для других типов приложений, где у вас есть доступ к полному списку ожидаемых файлов.
источник
Выполнение принудительной переустановки, когда установка не позволяет удалить или переустановить и не выполняет откат.
Скрипт VBscript, используемый для переопределения установки, которая не удаляется по какой-либо причине.
источник
Создайте пользовательский интерфейс с пользовательским действием, которое будет устанавливать переменную, и пользовательский интерфейс будет отключать / включать следующую кнопку (или аналогичную) на основе переменной, установленной в пользовательском действии.
Не так просто, как вы думаете, не слишком сложно, просто нигде не задокументировано!
Взаимодействие Wix с условиями, свойствами и пользовательскими действиями
источник