Wix: บรรทัดคำสั่งที่ได้รับการจัดการ BA ไม่มีประสิทธิภาพ

ขณะเล่นกับ TestBA Bootstrapper จาก Bryan ก่อนอื่นฉัน ติดตั้งแล้ว 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 และ ไม่ แสดง UI และเพียงดำเนินการตามที่ร้องขอแทน

สิ่งนี้ถูกเปิดเผยผ่านคลาสพื้นฐาน Bootstrapper โดยใช้คุณสมบัติ DisplayMode ซึ่งใช้ค่า Display enum ตัวเลือกคือ

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

จากนั้น คุณสามารถกำหนดได้ว่าจะดำเนินการใดผ่านค่า Command.Action (อีกครั้งในคลาสพื้นฐาน Bootstrapper) ซึ่งใช้ LaunchAction enum ตัวเลือกคือ:

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

}

ดังนั้นฉันจึงใช้คุณสมบัติแบบกำหนดเองที่ฉันตั้งชื่อว่า RunningSilent เพื่อตรวจจับโหมดที่ฉันไม่ควรแสดง UI จากนั้นใช้คุณสมบัตินั้นดังที่แสดงด้านล่าง:

    /// <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 ไวท์พยายามทำตามคำแนะนำของคุณ ฉันประสบปัญหาเพิ่มเติม ฉันโพสต์ที่นี่: stackoverflow.com/questions/22011578/ โปรดดูสิ่งเหล่านี้ด้วยหากฉันทำผิดพลาด - person Farrukh Waheed; 25.02.2014

ขอบคุณสำหรับคำแนะนำ @John มันได้ผลด้วยความช่วยเหลือจากคำแนะนำของคุณ นี่คือสิ่งที่ฉันเพิ่มใน Run() ก่อนที่จะเปิดตัว Dialogs (มุมมองแบบฟอร์ม):

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

BTW ในกรณีของฉัน Command.Display คือ Display.Embeded ซึ่งเป็นพฤติกรรมที่คาดหวัง

ฉันชื่นชมเคล็ดลับของคุณจริงๆ ขอบคุณอีกครั้ง.

person Farrukh Waheed    schedule 26.02.2014