Bootstrapper: как скомпилировать приложение и необходимые компоненты в одном пакете .msi? - PullRequest
3 голосов
/ 20 февраля 2009

Я создаю MSI-пакет для приложения, в котором есть предпосылки для установки. Я использую загрузчик Visual Studio 2005 для этой задачи. Для этого я сделал следующее: Расположил папку C: \ Program Files \ Microsoft Visual Studio 8 \ SDK \ v2.0 \ BootStrapper \ Packages \ и создал папку для моей предпосылки (сделал ее такой же структурой, как 'dotnetfx'); создал «product.xml» и «package.xml» и разместил их соответствующим образом. До сих пор я держал файлы xml очень простыми, чтобы проверить установку:

product.xml

<?xml version="1.0" encoding="utf-8"?>
<Product ProductCode="MyPrereq" xmlns="http://schemas.microsoft.com/developer/2004/01/bootstrapper">
  <PackageFiles CopyAllPackageFiles="false">
    <PackageFile Name="MyPrereq.exe" />
  </PackageFiles>
  <InstallChecks>
  </InstallChecks>
  <Commands Reboot="None">
    <Command PackageFile="MyPrereq.exe" EstimatedInstallSeconds="90">
      <InstallConditions>
      </InstallConditions>
      <ExitCodes>
    <ExitCode Value="0" Result="Success"/>
        <DefaultExitCode Result="Fail" String="GeneralFailure" FormatMessageFromSystem="true" />
      </ExitCodes>
    </Command>
  </Commands>
</Product>

package.xml

<?xml version="1.0" encoding="utf-8"?>
<Package Name="MyPrereq" Culture="Culture" xmlns="http://schemas.microsoft.com/developer/2004/01/bootstrapper">
  <Strings>
    <String Name="Culture">en</String>
    <String Name="DisplayName">MyPrereq</String>
    <String Name="GeneralFailure">A fatal error occurred. The installation failed.</String>
  </Strings>
</Package>

Теперь я могу добавить необходимое условие из списка и построить свой проект установки.

Проблема:

Выводом для сборки является «setup.exe», пакет «MyApp.msi», плюс подпапка «MyPrereq», которая содержит «MyPrereq.exe».

Я бы хотел, чтобы сборка создала 'setup.exe' и один 'MyApp.msi', который содержал бы внутри 'MyPrereq', без дополнительных файлов / каталогов.

Я знаю, что .NET Framework является еще одной предпосылкой для моего приложения, и он включен в тот же .msi, так что это должно быть как-то возможно.

Как мне этого добиться?

Ответы [ 2 ]

4 голосов
/ 20 февраля 2009

Вы можете создать самораспаковывающийся установщик с помощью таких инструментов, как IExpress (поставляется с Windows), содержащий все файлы в одном исполняемом файле (см. эту публикацию SO ).

У вас не может быть файла MSI, устанавливающего собственные предварительные требования. Во-первых, потому что сам установщик Windows является предварительным условием (и должен быть установлен не MSI exe), а во-вторых, потому что установки установщика Windows являются транзакционными и не поддерживают цепное выполнение файлов MSI. Это в основном означает, что одна установка MSI не может запустить другую установку MSI. Как следствие, все предварительные требования должны быть установлены отдельным загрузчиком (кстати, установка больше не является транзакционной - предварительные условия не будут удалены, если ваша установка MSI завершится неудачно).

Похоже, есть базовое неправильное понимание механизма загрузчика. В настоящее время загрузчик может быть сгенерирован только Visual Studio или MSBuild. Афайк не возможно с WiX. Найдите задачу GenerateBootstrapper в MSBuild (см. эту публикацию SO ).

3 голосов
/ 20 февраля 2009

Мне удалось сделать это с помощью IExpress.

Пришлось использовать небольшой трюк, который описан здесь Создание загрузчика для приложения VS Shell

К сожалению, задача MSBuild не дает возможность иметь использование ресурса конфигурации Необходимые установщики найдены в целевой каталог, поэтому вы должны вручную обновить соответствующий файл ресурса удалить жестко закодированный путь, который ищет предпосылки в подкаталог с тем же именем.

Откройте программу Setup.exe в Visual Редактор ресурсов студии
Двойной щелчок ресурс с именем SETUPCFG в 41 папка
Поиск "Vs Shell \" строка и удалите два вхождения которые появляются
Сохранить файл ресурса и исполняемый файл Setup.exe будет обновляется автоматически
Запустить iexpress Создайте новый пакет, следуя Мастер IExpress и убедитесь, что включить следующие файлы: MyVSShellApplication.msi file Файл загрузчика Setup.exe Файл vs_shell_isolated.enu.exe

Проблема заключалась в том, что начальный загрузчик помещает предпосылки в подпапку, а IExpress не распознает подпапки. При редактировании файла «setup.exe» также следует соблюдать осторожность, он не был правильно настроен с первой попытки.

...