จะติดตั้ง WiX installer ได้อย่างไร?


233

ที่ทำงานเราใช้WiXสำหรับสร้างแพ็คเกจการติดตั้ง เราต้องการให้การติดตั้งผลิตภัณฑ์ X ส่งผลให้ถอนการติดตั้งผลิตภัณฑ์รุ่นก่อนหน้าบนเครื่องนั้น

ฉันเคยอ่านหลายแห่งบนอินเทอร์เน็ตเกี่ยวกับการอัปเกรดครั้งใหญ่ แต่ไม่สามารถใช้งานได้ ทุกคนสามารถระบุขั้นตอนที่แน่นอนที่ฉันต้องใช้เพื่อเพิ่มคุณสมบัติถอนการติดตั้งรุ่นก่อนหน้าไปยัง WiX ได้หรือไม่

คำตอบ:


189

ในเวอร์ชันใหม่ล่าสุด (จาก 3.5.1315.0 เบต้า) คุณสามารถใช้องค์ประกอบ MajorUpgradeแทนการใช้ของคุณเอง

ตัวอย่างเช่นเราใช้รหัสนี้เพื่อทำการอัปเกรดอัตโนมัติ มันป้องกันการลดระดับให้ข้อความแสดงข้อผิดพลาดที่แปลเป็นภาษาท้องถิ่นและยังป้องกันการอัพเกรดรุ่นที่เหมือนกันที่มีอยู่แล้ว (เช่นเฉพาะรุ่นที่ต่ำกว่าได้รับการอัพเกรด):

<MajorUpgrade
    AllowDowngrades="no" DowngradeErrorMessage="!(loc.NewerVersionInstalled)"
    AllowSameVersionUpgrades="no"
    />

8
โพสต์บล็อกของ Bob Arnson เกี่ยวกับเรื่องนี้ให้ข้อมูลที่ดีมากมาย
Dave Andersen

17
หมายเหตุ: ไม่ได้รับการบันทึกไว้ที่ใดก็ได้ แต่ " <MajorUpgrade>" องค์ประกอบที่จะต้องวางอยู่หลัง <Package>มิฉะนั้นcandleให้ข้อผิดพลาดต่อไปนี้: "ข้อผิดพลาด CNDL0107: การตรวจสอบ Schema ล้มเหลวด้วยข้อผิดพลาดต่อไปนี้ที่บรรทัด 1 คอลัมน์ 473: องค์ประกอบ 'ผลิตภัณฑ์' ในเนมสเปซ ' schemas.microsoft.com/wix/2006/wi ' มีองค์ประกอบลูกที่ไม่ถูกต้อง ' MajorUpgrade 'ในเนมสเปซ' schemas.microsoft.com/wix/2006/wi 'คาดหวังรายการองค์ประกอบที่เป็นไปได้:' แพ็คเกจ '
Rob W

21
+1 คำตอบนี้ต้องได้รับ upvotes มากที่สุด มันเป็นเรื่องน่าดึงดูดใจมากที่จะได้คำตอบที่มี upvotes 5 เท่า แต่ใช้วิธีที่เก่ากว่า
Lynn Crumbling

1
จุดดี. ฉันได้เพิ่มตัวอย่างเพื่อที่คนจะไม่เพิกเฉยเพียงเพราะไม่มี!
Ant

6
เพียงแค่ต้องการที่จะชี้ให้คุณไม่จำเป็นต้องระบุหรือAllowDowngrades AllowSameVersionUpgradesพวกเขาเริ่มต้นที่ไม่แล้ว
ส่องสว่าง

221

ในที่สุดฉันก็พบวิธี - ฉันโพสต์ไว้ที่นี่สำหรับคนอื่นที่อาจมีปัญหาเดียวกัน (คุณทั้ง 5 คน):

  • เปลี่ยน ID ผลิตภัณฑ์เป็น *
  • ภายใต้ผลิตภัณฑ์เพิ่มต่อไปนี้:

    <Property Id="PREVIOUSVERSIONSINSTALLED" Secure="yes" />
    <Upgrade Id="YOUR_GUID">  
       <UpgradeVersion
          Minimum="1.0.0.0" Maximum="99.0.0.0"
          Property="PREVIOUSVERSIONSINSTALLED"
          IncludeMinimum="yes" IncludeMaximum="no" />
    </Upgrade> 
  • ภายใต้ InstallExecuteSequence เพิ่ม:

    <RemoveExistingProducts Before="InstallInitialize" /> 

จากนี้ไปเมื่อใดก็ตามที่ฉันติดตั้งผลิตภัณฑ์จะลบรุ่นที่ติดตั้งไว้ก่อนหน้านี้

หมายเหตุ:แทนที่ Id อัพเกรดด้วย GUID ของคุณเอง


153
ใช่การเรียนรู้ WiX นั้นเหมือนกับการพยายามหาคาถาที่คลุมเครือซึ่งมีคนตัดสินใจว่า 'สมเหตุสมผล' เพื่อดำเนินการอย่างง่าย ชอบ UNIX
mmr

6
นอกจากนี้ "เปลี่ยนรหัสผลิตภัณฑ์เป็น *" จะทำอย่างไร มันสร้างรหัสผลิตภัณฑ์ใหม่ทุกครั้งหรือไม่ ผลิตภัณฑ์ของคุณไม่มีรหัสคงที่อีกต่อไปหรือไม่? - ดูเหมือน overkill
Anthony

10
@Antony, @Dror Helper: ฉันค่อนข้างแน่ใจว่าคุณไม่ควรใช้ "*" เพื่อสร้าง GUID ใหม่ที่นี่ GUID ภายใน (อัพเกรด Id = "") ควรมีการกำหนดรหัสถาวรและคงที่และควรตรงกับ GUID ในแอตทริบิวต์ (Product UpgradeCode = "") ของคุณ
Jonathan Hartley

37
ฉันคิดว่าคุณควรแก้ไขตัวอย่างของคุณที่นั่นเพื่อไม่มี GUID จริง ฉันแน่ใจว่าผู้คนจะคัดลอกและวางและใช้คำต่อคำ อาจจะใช้ "YOUR-PRODUCT'S-UPGRADECODE-GUID-HERE"
บราวน์

12
มีข้อบกพร่องในตัวอย่างของคุณ MSI ProductVersionสนับสนุนเฉพาะรุ่นสามฟิลด์เท่านั้น ดังนั้นฟิลด์ที่สี่จะไม่ถูกเปรียบเทียบเลย ดูบันทึกย่อภายใต้ VersionMin และ VersionMax ในmsdn.microsoft.com/en-us/library/aa372379(VS.85).aspx
Sridhar Ratnakumar

89

ต่อไปนี้เป็นประเภทของไวยากรณ์ที่ฉันใช้สำหรับการอัพเกรดที่สำคัญ:

<Product Id="*" UpgradeCode="PUT-GUID-HERE" Version="$(var.ProductVersion)">
 <Upgrade Id="PUT-GUID-HERE">
    <UpgradeVersion OnlyDetect="yes" Minimum="$(var.ProductVersion)" Property="NEWERVERSIONDETECTED" IncludeMinimum="no" />
    <UpgradeVersion OnlyDetect="no" Maximum="$(var.ProductVersion)" Property="OLDERVERSIONBEINGUPGRADED" IncludeMaximum="no" />
</Upgrade>

<InstallExecuteSequence>
    <RemoveExistingProducts After="InstallInitialize" />
</InstallExecuteSequence>

ดังที่ @Brian Gillespie ตั้งข้อสังเกตว่ามีสถานที่อื่น ๆ เพื่อกำหนดเวลา RemoveExistingProducts ขึ้นอยู่กับการปรับแต่งที่ต้องการ หมายเหตุ PUT-GUID-HERE จะต้องเหมือนกัน


2
ฉันกำลังอ่านส่วน "การอัพเกรดและการแพทช์" ในหนังสือของ Nick Ramirez ใน Wix ที่นี่และเขากล่าวว่าหากคุณกำหนดเวลา RemoveExistingProducts หลังจาก InstallInitialize คุณต้องกำหนดเวลา<InstallExecute After="RemoveExistingProducts" />ด้วย ตัวอย่างของคุณไม่มีสิ่งนี้ - หมายความว่าหนังสือผิดหรือเปล่า?
Wim Coenen

3
ฉันไม่เคยกำหนดเวลา InstallExecute อย่างชัดเจน
Rob Mensching

1
ฉันไม่. ใน WiX v3.6 การเบิร์นจะทำให้การอัปเกรดเล็กน้อยง่ายต่อการดำเนินการ แต่โดยไม่ต้องเบิร์มนั้นจำเป็นต้องมีการโต้ตอบด้วยตนเองจากผู้ใช้ (ต้องมีตัวเลือกบรรทัดคำสั่ง) ซึ่งทำให้การอัปเกรดเล็กน้อยไม่มีประโยชน์ :)
Rob Mensching

1
@RobMensching: คุณจะหลีกเลี่ยงการติดตั้งรุ่นเก่ากว่ารุ่นใหม่ได้อย่างไร คำตอบของคุณใช้ได้สำหรับฉัน (ตัวอย่าง "การอัปเกรดหลัก" เท่านั้นที่ฉันสามารถรวบรวมได้ด้วย WiX v3.5.2519.0) แต่เป็นไปได้ที่จะติดตั้งรุ่นที่เก่ากว่า (หลังจากนั้นฉันเห็นทั้งสองเวอร์ชันใน "เพิ่ม / ลบโปรแกรม ")
Christian Specht

4
ตกลงฉันเพิ่งพบองค์ประกอบ MajorUpgradeในคำตอบนี้ซึ่งทำสิ่งที่ฉันต้องการรวมถึงการป้องกันการลดระดับ
Christian Specht

40

องค์ประกอบอัปเกรดภายในองค์ประกอบผลิตภัณฑ์รวมกับกำหนดการที่เหมาะสมของการดำเนินการจะทำการถอนการติดตั้งหลังจากคุณ อย่าลืมระบุรหัสอัพเกรดของผลิตภัณฑ์ทั้งหมดที่คุณต้องการลบ

<Property Id="PREVIOUSVERSIONSINSTALLED" Secure="yes" />
<Upgrade Id="00000000-0000-0000-0000-000000000000">
  <UpgradeVersion Minimum="1.0.0.0" Maximum="1.0.5.0" Property="PREVIOUSVERSIONSINSTALLED" IncludeMinimum="yes" IncludeMaximum="no" />
</Upgrade>

โปรดทราบว่าหากคุณระมัดระวังงานสร้างของคุณคุณสามารถป้องกันไม่ให้ผู้อื่นติดตั้งผลิตภัณฑ์รุ่นเก่ากว่าโดยบังเอิญผ่านเครื่องรุ่นใหม่ นั่นคือสิ่งที่ฟิลด์สูงสุดมีไว้สำหรับ เมื่อเราสร้างตัวติดตั้งเราตั้งค่า UpgradeVersion Maximum เป็นรุ่นที่สร้างขึ้น แต่ IncludeMaximum = "no" เพื่อป้องกันสถานการณ์นี้

คุณมีตัวเลือกเกี่ยวกับการกำหนดตารางเวลาของ RemoveExistingProducts ฉันชอบการจัดตารางเวลาหลังจาก InstallFinalize (แทนที่จะเป็น InstallInitialize ตามที่คนอื่น ๆ แนะนำ):

<InstallExecuteSequence>
  <RemoveExistingProducts After="InstallFinalize"></RemoveExistingProducts>
</InstallExecuteSequence>

สิ่งนี้จะทำให้ผลิตภัณฑ์รุ่นก่อนหน้าติดตั้งไว้จนกว่าจะคัดลอกไฟล์และรีจิสตรีคีย์ใหม่ สิ่งนี้ช่วยให้ฉันย้ายข้อมูลจากเวอร์ชันเก่าไปเป็นใหม่ (ตัวอย่างเช่นคุณเปลี่ยนที่เก็บข้อมูลค่ากำหนดผู้ใช้จากรีจิสทรีเป็นไฟล์ XML แต่คุณต้องการสุภาพและโอนย้ายการตั้งค่า) การโอนย้ายนี้กระทำในการกระทำที่กำหนดเองรอการตัดบัญชีก่อน InstallFinalize

ข้อดีอีกอย่างคือประสิทธิภาพ: หากมีไฟล์ไม่เปลี่ยนแปลง Windows Installer จะไม่คัดลอกไฟล์อีกต่อไปเมื่อคุณกำหนดเวลาหลังจาก InstallFinalize หากคุณกำหนดเวลาหลังจาก InstallInitialize เวอร์ชันก่อนหน้านี้จะถูกลบออกก่อนจากนั้นจึงติดตั้งเวอร์ชันใหม่ ส่งผลให้มีการลบและการจัดเรียงไฟล์ใหม่โดยไม่จำเป็น

สำหรับตัวเลือกการตั้งเวลาอื่น ๆ โปรดดูหัวข้อวิธีใช้ RemoveExistingProducts ใน MSDN สัปดาห์นี้การเชื่อมโยงคือ: http://msdn.microsoft.com/en-us/library/aa371197.aspx


2
@Brian Gillespie: "... หากมีไฟล์ไม่เปลี่ยนแปลง ... " หมายความว่าอะไร เกณฑ์สำหรับ Windows Installer ที่ต้องตัดสินใจเมื่อจะแทนที่ไฟล์ AssemblyVersion, AssemblyFileVersion ขนาดไฟล์คืออะไร ...
donttellya

2
@donttellya +1 เรียนรู้วิธีนี้อย่างหนัก RemoveExistingProductsถูกกำหนดให้หลังจากInstallFinalizeและกำลังไม่ได้รับการปรับปรุงเนื่องจาก assemblyVersion ไม่เปลี่ยนแปลง แต่สาขาอื่น ๆ เช่น AssemblyProduct เป็น ฉันไม่ต้องการที่จะอยู่ในความเมตตาของรูทีนการเปรียบเทียบไฟล์ - ฉันแค่ต้องการแอพก่อนหน้านี้ GONE
wal

16

คุณอาจจะดีกว่านี้ขอให้ในWiX ผู้ใช้รายชื่อผู้รับจดหมาย

WiX ใช้งานได้ดีที่สุดด้วยความเข้าใจอย่างถ่องแท้ว่า Windows Installer กำลังทำอะไรอยู่ คุณอาจพิจารณารับ " The Definitive Guide to Windows Installer "

การดำเนินการที่เอาผลิตภัณฑ์ที่มีอยู่คือการกระทำ RemoveExistingProducts เนื่องจากผลกระทบของสิ่งที่มันขึ้นอยู่กับว่ามันถูกกำหนดไว้ - ไม่ว่าจะเป็นความล้มเหลวทำให้ผลิตภัณฑ์เก่าที่จะติดตั้งใหม่และไม่ว่าจะคัดลอกไฟล์ไม่เปลี่ยนแปลงอีกครั้ง - คุณต้องกำหนดเวลาด้วยตัวคุณเอง

RemoveExistingProductsประมวลผล<Upgrade>องค์ประกอบในการติดตั้งปัจจุบันจับคู่@Idแอตทริบิวต์กับUpgradeCode(ระบุไว้ใน<Product>องค์ประกอบ) ของผลิตภัณฑ์ที่ติดตั้งทั้งหมดบนระบบ การUpgradeCodeกำหนดตระกูลของผลิตภัณฑ์ที่เกี่ยวข้อง ผลิตภัณฑ์ใด ๆ ที่มี UpgradeCode นี้ซึ่งมีเวอร์ชันอยู่ในช่วงที่ระบุไว้และที่ซึ่งUpgradeVersion/@OnlyDetectแอตทริบิวต์no(หรือละเว้น) จะถูกลบออก

เอกสารสำหรับการRemoveExistingProductsกล่าวถึงการตั้งค่าUPGRADINGPRODUCTCODEคุณสมบัติ หมายความว่ากระบวนการถอนการติดตั้งสำหรับผลิตภัณฑ์ที่ถูกลบจะได้รับคุณสมบัตินั้นซึ่งมีค่าเป็นProduct/@Idผลิตภัณฑ์สำหรับการติดตั้ง

หากการติดตั้งดั้งเดิมของคุณไม่รวมถึงUpgradeCodeคุณจะไม่สามารถใช้คุณสมบัตินี้ได้


21
ไม่ต้องสงสัยเลยว่าไมค์รู้ดีว่าเขากำลังพูดถึงอะไรด้วยความเคารพ แต่มันทำให้ฉันถอนหายใจด้วยความสิ้นหวังที่จะไตร่ตรองความคิดของฉันด้วยความเข้าใจอย่างถ่องแท้ในสิ่งที่ Windows Installer กำลังทำอยู่ ก่อนที่ฉันจะรู้ฉันจะทำ Java และ. NET ให้คำปรึกษางานกับลูกค้าองค์กรในเมืองศูนย์กลางเทคโนโลยีที่หนักหน่วงเกินกว่าถนนวงแหวนเติมรายงาน TPS ของฉันและสงสัยว่าทำไมชีวิตจึงว่างเปล่า ฉันคิดว่าโครงการต่อไปของฉันอาจติดตั้งด้วย NSIS ซึ่งสำหรับความผิดพลาดทั้งหมดเช่นภาษาแอสเซมบลีที่น่ากลัวมันไม่ได้ทำให้ฉันเข้าใจว่า Windows Installer กำลังทำอะไรอยู่
Jonathan Hartley

2
@Tartley - ไปกับ InnoSetup ที่จะช่วยให้คุณประหยัดภาษาที่เหมือนการชุมนุม :) ให้แน่ใจว่าคุณคว้า IStool ด้วยเช่นกันมันช่วยได้มาก นอกจากนี้ - ตกลงว่าสำหรับการติดตั้งง่ายทั้งหมดนี้เป็นวิธีที่ซับซ้อนเกินไป แต่ฉันคิดว่าพวกเขาต้องการความซับซ้อนนี้จริง ๆ สำหรับการติดตั้งบางอย่างเช่น SQL Server 2008 ...
Roman Starkov

11

ฉันใช้ไซต์นี้เพื่อช่วยให้เข้าใจพื้นฐานเกี่ยวกับ WiX Upgrade:

http://wix.tramontana.co.hu/tutorial/upgrades-and-modularization

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

และอย่างที่ Mike พูดในหนังสือจาก Apress "The Definitive Guide to Windows Installer" มันจะช่วยให้คุณเข้าใจ แต่มันไม่ได้เขียนโดยใช้ WiX

เว็บไซต์อื่นที่มีประโยชน์ก็คือเว็บไซต์นี้:

http://www.wixwiki.com/index.php?title=Main_Page


ตัวอย่างบนหน้าเว็บไม่ได้ทำงานตามที่คาดwix.tramontana.co.hu/tutorial/upgrades-and-modularization/... ฉันเล่นกับมัน มันเป็นไปได้ที่จะปรับลดรุ่นเมื่อหน้าระบุว่าจะถูกห้าม
30911 sergtk

10

ฉันอ่านเอกสารWiXตัวอย่างที่ดาวน์โหลดมาแล้ว แต่ฉันยังมีปัญหามากมายเกี่ยวกับการอัปเกรด การอัปเกรดย่อยไม่ได้ดำเนินการถอนการติดตั้งผลิตภัณฑ์ก่อนหน้านี้แม้จะมีความเป็นไปได้ที่จะระบุการถอนการติดตั้ง ฉันใช้เวลามากกว่าหนึ่งวันในการตรวจสอบและพบว่า WiX 3.5 ใช้แท็กใหม่สำหรับการอัพเกรด นี่คือการใช้งาน:

<MajorUpgrade Schedule="afterInstallInitialize"
        DowngradeErrorMessage="A later version of [ProductName] is already installed. Setup will now exit." 
        AllowDowngrades="no" />

แต่สาเหตุหลักของปัญหาคือเอกสารระบุว่าใช้พารามิเตอร์" ติดตั้งใหม่ = ALL REINSTALLMODE = vomus " สำหรับการอัปเกรดเล็กน้อยและขนาดเล็ก แต่ไม่ได้บอกว่าพารามิเตอร์เหล่านั้นเป็นสิ่งต้องห้ามสำหรับการอัปเกรดที่สำคัญ - พวกเขาเพียงหยุดทำงาน ดังนั้นคุณไม่ควรใช้มันกับการอัพเกรดครั้งใหญ่


7

ฉันขอแนะนำให้ดูการกวดวิชาของ Alex Shevchuk เขาอธิบายว่า "การอัปเกรดที่สำคัญ" ผ่าน WiX พร้อมตัวอย่างที่ดีจาก MSI ไปจนถึง WiX ตอนที่ 8 - การอัปเกรดที่สำคัญ


ขอบคุณสำหรับลิงค์ไปยังบทความนั้น ... มันยอดเยี่ยมมาก!
Robert P

7

สิ่งสำคัญสิ่งหนึ่งที่ฉันพลาดจากบทช่วยสอนไประยะหนึ่ง (ถูกขโมยมาจากhttp://www.tramontana.co.hu/wix/lesson4.php ) ซึ่งส่งผลให้เกิดข้อผิดพลาด "รุ่นอื่นของผลิตภัณฑ์นี้ติดตั้งแล้ว"

* การอัปเดต ขนาดเล็กหมายถึงการเปลี่ยนแปลงเล็กน้อยในไฟล์หนึ่งหรือสองสามไฟล์ซึ่งการเปลี่ยนแปลงนั้นไม่รับประกันว่าจะเปลี่ยนเวอร์ชั่นของผลิตภัณฑ์ (major.minor.build) คุณไม่จำเป็นต้องเปลี่ยน GUID ของผลิตภัณฑ์เช่นกัน โปรดทราบว่าคุณต้องเปลี่ยน Package GUID เสมอเมื่อคุณสร้างไฟล์. msi ใหม่ที่แตกต่างจากไฟล์ก่อนหน้าไม่ว่าด้วยเหตุผลใดก็ตาม โปรแกรมติดตั้งจะติดตามโปรแกรมที่ติดตั้งของคุณและค้นหาเมื่อผู้ใช้ต้องการเปลี่ยนหรือลบการติดตั้งโดยใช้ GUID เหล่านี้ การใช้ GUID เดียวกันสำหรับแพ็คเกจอื่นจะทำให้โปรแกรมติดตั้งสับสน

การอัพเกรดเล็กน้อย แสดงถึงการเปลี่ยนแปลงที่รุ่นผลิตภัณฑ์จะเปลี่ยนแปลงไปแล้ว ปรับเปลี่ยนแอตทริบิวต์ของแท็กสินค้า ผลิตภัณฑ์จะยังคงเหมือนเดิมดังนั้นคุณไม่จำเป็นต้องเปลี่ยน GUID ของผลิตภัณฑ์ แต่แน่นอนได้รับ GUID ของแพ็คเกจใหม่

การอัปเกรดที่ สำคัญหมายถึงการเปลี่ยนแปลงที่สำคัญเช่นการเปลี่ยนจากเวอร์ชันเต็มเป็นเวอร์ชันอื่น เปลี่ยนทุกอย่าง: แอตทริบิวต์เวอร์ชั่นผลิตภัณฑ์และแพ็คเกจ GUID


3
แพคเกจ: รหัสประเภท: คำอธิบาย AutogenGuid: รหัสแพคเกจ GUID สำหรับผลิตภัณฑ์หรือโมดูลการผสาน เมื่อรวบรวมผลิตภัณฑ์แอ็ตทริบิวต์นี้ไม่ควรตั้งค่าเพื่ออนุญาตให้สร้างโค้ดแพ็กเกจสำหรับแต่ละบิลด์ เมื่อทำการรวบรวมโมดูลผสานคุณลักษณะนี้ต้องถูกตั้งค่าเป็น guidization ที่เป็นโมดูล ---- ดังนั้นเราไม่จำเป็นต้องให้ความสนใจกับรหัสแพ็คเกจใช่มั้ย
Cooper.Wu

ลิงก์ของคุณเสียชีวิต
bam500

5

ฉันใช้ WiX รุ่นล่าสุด (3.0) และไม่สามารถทำงานได้ แต่นี่ใช้งานได้:

<Product Id="*" UpgradeCode="PUT-GUID-HERE" ... >

<Upgrade Id="PUT-GUID-HERE">
  <UpgradeVersion OnlyDetect="no" Property="PREVIOUSFOUND"
     Minimum="1.0.0.0"  IncludeMinimum="yes"
     Maximum="99.0.0.0" IncludeMaximum="no" />
</Upgrade>

โปรดทราบว่า PUT-GUID-HERE ควรเหมือนกับ GUID ที่คุณได้กำหนดไว้ในคุณสมบัติ UpgradeCode ของผลิตภัณฑ์


2

ทำงานด้านล่างสำหรับฉัน

<Product Id="*" Name="XXXInstaller" Language="1033" Version="1.0.0.0" 
    Manufacturer="XXXX" UpgradeCode="YOUR_GUID_HERE">
<Package InstallerVersion="xxx" Compressed="yes"/>
<Upgrade Id="YOUR_GUID_HERE">
    <UpgradeVersion Property="REMOVINGTHEOLDVERSION" Minimum="1.0.0.0" 
        RemoveFeatures="ALL" />
</Upgrade>
<InstallExecuteSequence>
    <RemoveExistingProducts After="InstallInitialize" />
</InstallExecuteSequence>

โปรดตรวจสอบให้แน่ใจว่า UpgradeCode ในผลิตภัณฑ์ตรงกับรหัสในการอัพเกรด


1

นี่คือสิ่งที่ใช้ได้ผลสำหรับฉันแม้จะเป็นเกรดดาวน์หลัก:

<Wix ...>
  <Product ...>
    <Property Id="REINSTALLMODE" Value="amus" />
    <MajorUpgrade AllowDowngrades="yes" />
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.