ข้าม MSI หากติดตั้งไว้แล้ว

ฉันมีตัวติดตั้ง WIX ที่ฉันติดตั้งโปรแกรมและ .NET Core 1.0.5 .NET Core ได้รับการติดตั้งในโหมดเงียบ:

<ExePackage InstallCommand="/q" Id = "DotNetCore.Setup" SourceFile="..\DotNetCore\DotNetCore.exe" />

บนระบบที่สะอาด ตัวติดตั้งก็ทำงานได้ดี หากฉันพยายามติดตั้งใหม่ ฉันจะรีบูตเครื่อง อาจตรวจพบว่าตัวติดตั้ง .NET ได้รับการติดตั้งแล้ว และเรียกใช้คุณสมบัติการซ่อมแซมด้วยตัวเอง มีวิธีใดบ้างที่จะข้ามการติดตั้ง .NET Core หากติดตั้งไว้แล้ว

ฉันพยายามค้นหาพารามิเตอร์บรรทัดคำสั่ง แต่ดูเหมือนไม่มีอะไรมีประโยชน์


person Gianluca Ghettini    schedule 24.07.2017    source แหล่งที่มา


คำตอบ (2)


องค์ประกอบ ExePackage มีคุณสมบัติ DetectCondition ซึ่งหมายความว่าคุณสามารถระบุเงื่อนไขได้ว่าหากเงื่อนไขประเมินเป็นเท็จ แพ็คเกจจะถูกติดตั้ง คุณสามารถรวมสิ่งนี้เข้ากับองค์ประกอบ util:RegistrySearch ซึ่งสามารถ ใช้เพื่อค้นหาผ่านรีจิสทรีเพื่อตรวจสอบว่าติดตั้ง .NET Core แล้วหรือไม่

ในการค้นหารีจิสทรี คุณจะต้องค้นหาคีย์รีจิสทรีซึ่งจะแสดงทุกครั้งที่ติดตั้ง .NET ก่อน

ค้นหาคีย์ "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" (หรือ "HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\" บนเครื่อง 64 บิต) ในรีจิสทรีของคุณ จากนั้นค้นหาคีย์ย่อย ซึ่งสอดคล้องกับ .NET Core - คีย์นี้ควรมีค่าสำหรับ "DisplayName" ซึ่งควรเป็น ".NET Core" หรืออะไรที่คล้ายกัน

เมื่อพบคีย์ที่ถูกต้องแล้วควรมีชื่อที่เป็นสตริงอักขระฐานสิบหก - นี่เป็นหนึ่งใน GUID ที่สอดคล้องกับโปรแกรม .NET Core จากนั้นคุณสามารถใช้รหัสต่อไปนี้เพื่อให้โปรแกรมติดตั้งค้นหาคีย์นี้ได้:

<util:RegistrySearch Id="VCRedistTest32" Root="HKLM" Key="SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{YOUR_GUID_HERE}" Result="exists" Variable="DOTNETPresent" Win64="no"/>

(ใช้ Win64="yes" แทนสำหรับรีจิสทรี 64 บิต)

จากนั้นคุณสามารถใช้สิ่งต่อไปนี้สำหรับ ExePackage:

<ExePackage InstallCommand="/q" Id = "DotNetCore.Setup" SourceFile="..\DotNetCore\DotNetCore.exe" DetectCondition="DOTNETPresent"/>

อย่าลืมเพิ่มการอ้างอิงไปยังส่วนขยาย util ให้กับองค์ประกอบ wix ระดับบนสุด:

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
 xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
person Calum MacLeod    schedule 24.07.2017

คุณต้องใช้แอตทริบิวต์ DetectCondition และการค้นหารีจิสทรีที่กำหนดคุณสมบัติในกรณีที่ติดตั้ง .net Core

องค์ประกอบ ExePackage - DetectCondition

"เงื่อนไขที่กำหนดว่ามีแพ็คเกจอยู่บนระบบเป้าหมายหรือไม่ เงื่อนไขนี้สามารถใช้ตัวแปรในตัวและตัวแปรที่ส่งคืนโดยการค้นหา เงื่อนไขนี้จำเป็นเนื่องจาก Windows ไม่มีวิธีการตรวจจับการมีอยู่ของ ExePackage เขียน ใช้เงื่อนไขนี้เพื่อกำหนดวิธีปฏิบัติต่อแพ็คเกจนี้ระหว่างการดำเนินการบันเดิล ตัวอย่างเช่น หากเงื่อนไขนี้เป็นเท็จหรือละเว้นและบันเดิลกำลังถูกติดตั้ง Burn จะติดตั้งแพ็คเกจนี้"

person Arkady Sitnitsky    schedule 24.07.2017
comment
อ่า ขอบคุณมาก! คุณจะสามารถระบุเงื่อนไขเพื่อตรวจสอบว่าติดตั้ง .net core ได้หรือไม่ ฉันสามารถหลีกเลี่ยงเงื่อนไขการตรวจจับได้หากสามารถบังคับติดตั้งทับการติดตั้งได้ - person Gianluca Ghettini; 24.07.2017
comment
คุณต้องตรวจสอบรีจิสทรีหลังการติดตั้ง ตัวอย่างแบบเต็ม คุณสามารถตรวจสอบได้ที่นี่ firegiant.com/wix/tutorial/ net-and-net/bootstrapping - person Arkady Sitnitsky; 24.07.2017