Wix: командная строка управляемого BA неэффективна

Играя с TestBA Bootstrapper от Брайана, сначала я установлен 1.0.0.0. Затем я увеличил версию до 1.0.0.1 и зарегистрировал процесс. Вот часть, где во время обновления была передана командная строка -uninstall -quite:

[2870:21C0][2014-02-24T17:46:38]i300: Apply begin 
[1A44:1E54][2014-02-24T17:46:41]i360: Creating a system restore point. 
[1A44:1E54][2014-02-24T17:47:15]i361: Created a system restore point. 
[1A44:1E54][2014-02-24T17:47:15]i000: Caching bundle from: 'C:\Users\fwaheed\AppData\Local\Temp\{57a07296-0310-4628-971c-2da38aa09f25}\.be\BootstrapperSetup.exe' to: 'C:\ProgramData\Package Cache\{57a07296-0310-4628-971c-2da38aa09f25}\BootstrapperSetup.exe' 
[1A44:1E54][2014-02-24T17:47:15]i320: Registering bundle dependency provider: {57a07296-0310-4628-971c-2da38aa09f25}, version: 1.0.0.1 
[1A44:2B40][2014-02-24T17:47:16]i305: Verified acquired payload: DummyInstallationPackageId at path: C:\ProgramData\Package Cache\.unverified\DummyInstallationPackageId, moving to: C:\ProgramData\Package Cache\{F1D62AA5-E68C-4B99-A6DD-D7EAE5A1D238}v1.0.0.1\DummyInstaller.msi. 
[1A44:1E54][2014-02-24T17:47:16]i323: Registering package dependency provider: {F1D62AA5-E68C-4B99-A6DD-D7EAE5A1D238}, version: 1.0.0.1, package: DummyInstallationPackageId 
[1A44:1E54][2014-02-24T17:47:16]i301: Applying execute package: DummyInstallationPackageId, action: Install, path: C:\ProgramData\Package Cache\{F1D62AA5-E68C-4B99-A6DD-D7EAE5A1D238}v1.0.0.1\DummyInstaller.msi, arguments: ' ARPSYSTEMCOMPONENT="1" MSIFASTINSTALL="7"' 
[2870:21C0][2014-02-24T17:47:22]i319: Applied execute package: DummyInstallationPackageId, result: 0x0, restart: None 
[1A44:1E54][2014-02-24T17:47:22]i325: Registering dependency: {57a07296-0310-4628-971c-2da38aa09f25} on package provider: {F1D62AA5-E68C-4B99-A6DD-D7EAE5A1D238}, package: DummyInstallationPackageId 
[1A44:1E54][2014-02-24T17:47:22]i301: Applying execute package: {f1d57671-5e3d-4be7-908f-5a47e72737d9}, action: Uninstall, path: C:\ProgramData\Package Cache\{f1d57671-5e3d-4be7-908f-5a47e72737d9}\BootstrapperSetup.exe, arguments: '"C:\ProgramData\Package Cache\{f1d57671-5e3d-4be7-908f-5a47e72737d9}\BootstrapperSetup.exe" -uninstall -quiet -burn.related.upgrade' 
[2870:21C0][2014-02-24T17:48:54]i319: Applied execute package: {f1d57671-5e3d-4be7-908f-5a47e72737d9}, result: 0x0, restart: None 
[2870:21C0][2014-02-24T17:48:54]i399: Apply complete, result: 0x0, restart: None, ba requested restart:  No 
[2870:21C0][2014-02-24T17:48:55]i500: Shutting down, exit code: 0x0 

Проблема: вместо тихого удаления отображалось диалоговое окно удаления. И если я нажму «Удалить», он удалит 1.0.0.0, а затем приложение будет обновлено до 1.0.0.1.

Вопрос: как заставить его понимать аргументы командной строки и выполнять процесс без отображения диалогового окна удаления?

Я также консультировался в проекте WixBA из исходного кода Wix 3.7, но его обработка командной строки обрабатывает только аргумент InstallFolder.

Я был бы очень признателен за любую помощь, так как этот сценарий обновления блокирует мой проект Bootstrapper.

Огромное спасибо.


person Farrukh Waheed    schedule 24.02.2014    source источник


Ответы (2)


Суть в том, чтобы поднять флаг -quiet и не отображать пользовательский интерфейс, а вместо этого просто выполнить запрошенное действие.

Это доступно через базовый класс Bootstrapper с использованием свойства DisplayMode, которое использует значение перечисления Display. Варианты

public enum Display
{
  Unknown,
  Embedded,
  None,
  Passive,
  Full,
}

Затем вы можете определить, какое действие выполнять с помощью значения Command.Action (опять же, в базовом классе Bootstrapper), которое использует перечисление LaunchAction. Варианты:

public enum LaunchAction
{
 Unknown,
 Help,
 Layout,
 Uninstall,
 Install,
 Modify,
 Repair,

}

Итак, я использовал пользовательское свойство, которое я назвал RunningSilent, чтобы определить режимы, в которых я не должен отображать пользовательский интерфейс, а затем использовать его, как показано ниже:

    /// <summary>
    /// True if running in silent display mode (ie: no UI).
    /// </summary>
    public virtual bool RunningSilent
    {
        get
        {
            return (DisplayMode != Display.Full && DisplayMode != Display.Passive);
        }
    }

    protected override void Run()
    {
        if (RunningSilent)
        {
             Log("Running without UI");
             LaunchAction requestedAction = Command.Action;
             //... this is an async call, so handle it accordingly.
             Engine.Plan(requestedAction);
             //... followed by Engine.Apply();

        }
        else
        {
            Log("Showing UI window");
            //.. Run your Managed UI
        }
    }
person John M. Wright    schedule 25.02.2014
comment
Большое спасибо @John-m-wright. Уайт, пытаясь реализовать ваши предложения, столкнулся с еще некоторыми проблемами, которые я разместил здесь: line" title="это ошибка в командной строке wix bootstrapper">stackoverflow.com/questions/22011578/. Пожалуйста, также смотрите их, если я делаю какую-то ошибку. - person Farrukh Waheed; 25.02.2014

Спасибо за подсказки @John. С помощью ваших подсказок получилось. Вот что я добавил в Run() перед запуском диалогов (представление форм):

if (Command.Display != Display.Full && Command.Action == LaunchAction.Uninstall)
{
   //MessageBox.Show("Let's do Uninstall silentley ");
   MyViewModel.PlanAction(LaunchAction.Uninstall);
}

Кстати, в моем случае Command.Display был Display.Embeded, что является ожидаемым поведением.

Я очень ценю ваш совет. Спасибо еще раз.

person Farrukh Waheed    schedule 26.02.2014