Как сделать MSI, который просто оборачивает EXE-файл - PullRequest
33 голосов
/ 13 мая 2009

После слишком большого количества экспериментов я пришел к выводу, что установщик Windows - просто плохая технология. Но клиенты хотят файлы MSI.

Итак, как мне создать MSI-файл, который извлекает EXE-файл во временный каталог и запускает его с такими же или похожими параметрами, которые были переданы в EXE-файл?

Параметры MSI описаны в Msiexec (параметры командной строки) (низкоуровневое "выполнение" MSI - опция msiexec package.msi).

РЕДАКТИРОВАТЬ: WiX-решение mjmarsh выглядит так, как будто оно работает. У меня просто еще не было возможности попробовать это (время кризиса). Если это сработает, я приму это.

РЕДАКТИРОВАТЬ: это не работает. Недостающая часть: посещенный / оставленный без внимания, кажется, не доступен.

В любом случае, единственное, что заставит эту работу работать, - пользовательское действие уничтожит родительский процесс!

РЕДАКТИРОВАТЬ: Итак, кто-то опубликовал в качестве дополнительного ответа, завершая все это как пост-установка пользовательского действия. Теоретически это возможно, но поскольку может потребоваться перезагрузка (спасибо MS за .NET 4, иногда требующую перезагрузку), мы должны сделать еще одну попытку. Итак из матрицы преимуществ:

Transparency: No. One big custom action.
Customizability: No.
Standardization: No. 
Management and reporting: No. Appears to work but will not.
Security: No benefit.
Validation: No. The hackery required to survive reboot makes this sure to not work.
Resiliency: Completely defeated.
Rollback: No. Rollback didn't work when we were using MSI anyway.
Patching & Updates: No. We have a local solution anyway.
Logging: No. Appears to work but will not.

Нет смысла.

Ответы [ 13 ]

15 голосов
/ 13 мая 2009

Ну, есть свободный путь и путь $$$. Я не могу документировать все здесь, но это должно помочь вам начать.

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

В любом случае, здесь идет:

Бесплатно: WiX ( здесь )

Это бесплатный инструмент для создания файлов MSI из набора файлов конфигурации XML. Я оставлю вас, чтобы найти учебники в Интернете, но вот суть:

Вы можете сжать ваш EXE в установщик, используя следующий тег в файле WXS:

<Binary Id="MYEXE" src="<path to my exe?"/>

Затем вы можете создать пользовательское действие, которое запускает ваш EXE-файл:

<CustomAction Id="EXECA_CALLMYEXE" Return="check" Execute="deferred" BinaryKey="MYEXE"
      ExeCommand="my command line"/>

Затем вы вставляете свое пользовательское действие в InstallExecuteSequence в соответствующем месте (я почти всегда запускаю мое где-то между InstallInitialize и InstallFinalize)

<InstallExecuteSequence>
   <Custom Action="EXECA_CALLMYEXE" After="InstallInitialize"><![CDATA[Not REMOVE]]></Custom>

$$$: Get InstallShield ( ЗДЕСЬ )

Сначала создайте проект "Basic MSI" и убедитесь, что вы хотите, чтобы вы не генерировали файл setup.exe . Вы устанавливаете это в настройках выпуска.

Тогда вы, по сути, делаете то же самое, что и с WiX, но у вас есть для этого пользовательский интерфейс.

  • Вы можете указать свой вспомогательный EXE-файл, используя Direct Editor и поместив свой EXE-файл в таблицу 'Binary'
  • Вы можете создать пользовательское действие для запуска этого EXE-файла с узла «Пользовательские действия» в дереве слева
  • Пользовательское действие можно вставить, выбрав «Установить последовательности» и поместив его в InstallExecuteSequence где-то между InstallInitialize и InstallFinalize, как я уже говорил.

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

6 голосов
/ 13 мая 2009

Я думаю, что самый простой способ создать файл .MSI - это использовать WiX .

Урок 1 из руководства по WiX - это все, что вам нужно для простой установки.

4 голосов
/ 30 июня 2009

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

Какие операции выполняет ваш установщик EXE? Это в основном копирование файлов, некоторая регистрация COM и некоторые записи в реестр, или это запускает сложную логику установки, настройку баз данных и т.д. ...? Причина, по которой я спрашиваю, состоит в том, что, вероятно, было бы очень быстро создать хорошо функционирующий WIX MSI для вас, чтобы вы могли отказаться от подхода EXE.

Действительно, можно запустить EXE изнутри MSI, но это требует правильной последовательности и гарантированно вызовет у вас больше блюза, чем простой MSI. Если приложение маленькое и не делает ничего сумасшедшего во время установки, я был бы рад предоставить вам базовое преобразование WIX.

2 голосов
/ 23 февраля 2016

Добавляя к weir's ответу, измените custom action attribute, как показано ниже:

<!--Run Action-->
    <CustomAction Id="RunWrappedExe"
                  Return="asyncNoWait"
                  FileKey="ApplicationFileId"
                  Execute="deferred"
                  ExeCommand=""
                  HideTarget="no"
                  Impersonate="yes"/>

Настройка Return=asyncNoWai не ожидает возврата exe. Установщик делает свою работу и закрывается нормально. Между тем, exe продолжает его выполнение.

-Madhuresh

2 голосов
/ 17 февраля 2013

Существует также бесплатная версия MSI Wrapper . Он также поддерживает удаление и обновление. Кроме того, он создает только одну запись в программе «Установка и удаление программ».

2 голосов
/ 03 ноября 2010

Нет решения. Мы перешли на NSIS, так как корпоративная установка MSI все равно будет нарушена из-за проблемы с вложенностью MSI (просто попытайтесь установить EXE-оболочку MSI из MSI когда-нибудь).

1 голос
/ 21 июля 2014

попробуйте это:

В пакете MSI есть вызов поведения «Запустить приложение после установки», это означает, что ваш исполняемый файл будет выполнен после установки MSI (MSI закрыт).

Попробуйте выполнить там свой exe-файл, поэтому, когда ваш exe-файл вызывает другие пакеты MSI, он не будет конфликтовать с первым.

1 голос
/ 21 июня 2012

Если вы не хотите управлять MSI, а только выполнять EXE, попробуйте Exe to MSI Converter Free . Вы просто указываете путь к EXE и получаете MSI.

1 голос
/ 04 ноября 2011

Wix может сделать это. Вот мой пример кода для wix 3.5:

<?xml version='1.0'?>
<Wix xmlns='http://schemas.microsoft.com/wix/2006/wi'>
   <Product Id='*' UpgradeCode="11111111-2222-3333-4444-555555555555" 
        Name='My Setup' Language='1033' Version='1.0.0.0' 
        Manufacturer='Your company'>

    <Package Description='pak' InstallerVersion='200' Compressed='yes' />

    <Media Id='1' Cabinet='setup.cab' EmbedCab='yes' />

    <Directory Id='TARGETDIR' Name='SourceDir'>
        <Directory Id="TempFolder">
            <Directory Id="INSTALLLOCATION" Name="~_tmpdir">
                <Component Id='MyComponent' DiskId='1' Guid=''>
                    <File Id="File0" Name="setup.exe" Source="setup.exe" />
                    <File Id="File1" Name="file1.txt" Source="file1.txt" />
                </Component>
            </Directory>
        </Directory>
    </Directory>

    <Feature Id='InstallFeature' Title='Install Feature' Level='1'>
        <ComponentRef Id='MyComponent' />
    </Feature>

    <!-- Run Action -->
    <CustomAction Id="RunWrapExe" Return="ignore" Execute="deferred" 
                  FileKey="File0" ExeCommand="setup.exe param here"  
                  HideTarget="no" Impersonate="no" />

    <InstallExecuteSequence>
        <Custom Action="RunWrapExe" 
                After="InstallFiles">NOT REMOVE~="ALL"</Custom>
    </InstallExecuteSequence>

   </Product>
</Wix>
0 голосов
/ 13 мая 2019

Я сделал простой и бесплатный инструмент .NET для создания MSI из exe или папки (он использует wixsharp и wix) http://legacy.averbouch.biz/free-msi-wrapper

screenshot

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...