2013-05-09 5 views
8

मैं वाईएक्स 3.7 पर हूं, और मुझे सरल < पैकेज समूह समूह आईडी = "नेटएफएक्स 40 वेब" /> बंडल तत्व काम करने के लिए नहीं मिल रहा है, क्योंकि यह नहीं लाता है नेट एफएक्स इंस्टॉलर पैकेज में, या setup.exe में एम्बेड करें। मैंने अपने Bundle.wxs फ़ाइल में इसके लिए अपना स्वयं का पैकेज बनाने का सहारा लिया है, लेकिन मुझे अभी भी समस्या है। ऐसा लगता है कि .NET 4 को स्थापित करने का प्रयास हमेशा होता है, भले ही मशीन पहले से ही .NET स्थापित है।वाईएक्स बंडल में .NET इंस्टॉलर सहित पहले से स्थापित

मैं InstallCondition और DetectCondition के बीच अंतर की काफी यकीन नहीं है। मुझे लगता है कि इंस्टॉलकंडिशन का उपयोग पैकेज को स्थापित करने के लिए किया जाता है यदि मूल्यांकन सही है, अन्यथा इसे अनइंस्टॉल करें। यह उन चीज़ों के साथ कैसे काम करता है जो आमतौर पर स्थायी = हाँ, जैसे कि अधिकतर पूर्व-आवश्यकताएं हैं? DetectCondition लगभग विपरीत है, मुझे लगता है कि, यह जांचता है कि यह पहले से ही सिस्टम पर है, और यदि ऐसा है, तो इसे इंस्टॉल नहीं करता है।

नीचे अपना पूरा Bundle.wxs फ़ाइल जो एक दृश्य स्टूडियो WiX Bootstrapper परियोजना में है। मैं रजिस्ट्री को देखने का प्रयास कर रहा हूं और .NET 4.0 रजिस्ट्री कुंजी से बाहर निकल रहा हूं। यदि यह मौजूद है, तो मैं .NET 4 स्थापित नहीं करना चाहता, और यदि यह वहां नहीं है, तो इसे इंस्टॉल करें। लेकिन, यह काम नहीं कर रहा है, और यह हमेशा .NET स्थापित करने का प्रयास करता है।

<?xml version="1.0" encoding="UTF-8"?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 
    <Bundle 
     Name="MyProgramBootstrapper" 
     Version="1.0.0.0" 
     Manufacturer="Microsoft" 
     UpgradeCode="{2299B51D-9FD8-4278-90C8-2B79DB37F402}"> 

     <BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense" /> 
     <Chain> 
      <PackageGroupRef Id="Netfx4Full"/> 
      <MsiPackage 
       Id="MyProgramInstaller" 
       SourceFile="$(var.MyProgramInstaller.TargetPath)" 
       Compressed="no"/> 
     </Chain> 
    </Bundle> 

    <Fragment> 
     <Property Id="NET40_FULL_INSTALL_32"> 
      <RegistrySearch 
       Id ="SearchNet40_32bit" 
       Root="HKLM" 
       Key="SOFTWARE\Microsoft\Net Framework Setup\NDP\v4\Full" 
       Name="Version" 
       Type ="raw"/> 
     </Property> 
     <Property 
      Id="NET40_FULL_INSTALL_64"> 

      <RegistrySearch 
       Id ="SearchNet40_64bit" 
       Root="HKLM" 
       Key="SOFTWARE\Microsoft\Net Framework Setup\NDP\v4\Full" 
       Name="Version" 
       Type ="raw" 
       Win64="yes" /> 
     </Property> 

     <WixVariable 
      Id="WixMbaPrereqPackageId" 
      Value="Netfx4Full" /> 
     <WixVariable 
      Id="WixMbaPrereqLicenseUrl" 
      Value="NetfxLicense.rtf" /> 
     <PackageGroup 
      Id="Netfx4Full"> 
      <ExePackage 
       Id="Netfx4Full" 
       Cache="no" 
       Compressed="no" 
       PerMachine="yes" 
       Permanent="yes" 
       Vital="yes" 
       SourceFile="C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bootstrapper\Packages\DotNetFX40\dotNetFx40_Full_x86_x64.exe" 
       DetectCondition="NET40_FULL_INSTALL_32 OR NET40_FULL_INSTALL_64" 
       DownloadUrl="http://go.microsoft.com/fwlink/?LinkId=164193"/> 
     </PackageGroup> 
    </Fragment> 
</Wix> 

Bootstrapper इंस्टॉलर लॉग:

[010C:2FB0][2013-05-10T12:07:07]w120: Detected partially cached package: Netfx4Full, invalid payload: Netfx4Full, reason: 0x80070570 
[010C:2FB0][2013-05-10T12:07:07]i052: Condition 'NETFRAMEWORK40' evaluates to false. 
[010C:2FB0][2013-05-10T12:07:07]w120: Detected partially cached package: MyInstaller, invalid payload: f4832BA0972BDE9B6FA8A19FBB614A7BA, reason: 0x80070570 
[010C:2FB0][2013-05-10T12:07:07]i101: Detected package: Netfx4Full, state: Absent, cached: Partial 

अद्यतन, समाधान के साथ। मैंने यह निर्धारित करने के लिए अंतर्निहित वाईएक्स रजिस्ट्रीशर्च का उपयोग किया है कि यह इंस्टॉल है या नहीं। मुझे अपने बंडल प्रोजेक्ट में WixUtilExtension.dll का संदर्भ देना पड़ा। यहां अपडेट किया गया Bundle.wxs:

<?xml version="1.0" encoding="UTF-8"?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" 
    xmlns:netfx="http://schemas.microsoft.com/wix/NetFxExtension" 
    xmlns:util="http://schemas.microsoft.com/wix/UtilExtension" 
> 
    <Bundle 
     Name="MyProgramBootstrapper" 
     Version="1.0.0.0" 
     Manufacturer="Microsoft" 
     UpgradeCode="{2299B51D-9FD8-4278-90C8-2B79DB37F402}"> 

     <BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense" /> 
     <Chain> 
      <PackageGroupRef Id="Netfx4Full"/> 
      <!-- TODO: Define the list of chained packages. --> 
        <!-- <MsiPackage SourceFile="path\to\your.msi" /> --> 
      <MsiPackage 
       Id="MyProgramInstaller" 
       SourceFile="$(var.MyProgramInstaller.TargetPath)" 
       Compressed="no" /> 
     </Chain> 
    </Bundle> 

    <Fragment> 
     <util:RegistrySearchRef Id="NETFRAMEWORK40"/> 
     <PackageGroup 
      Id="Netfx4Full"> 

      <ExePackage 
       Id="Netfx4FullExe" 
       Cache="no" 
       Compressed="no" 
       PerMachine="yes" 
       Permanent="yes" 
       Vital="yes" 
       SourceFile="C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bootstrapper\Packages\DotNetFX40\dotNetFx40_Full_x86_x64.exe" 
       InstallCommand="/q /norestart /ChainingPackage FullX64Bootstrapper" 
       DetectCondition="NETFRAMEWORK40" 
       DownloadUrl="http://go.microsoft.com/fwlink/?LinkId=164193"/> 
     </PackageGroup> 
    </Fragment> 
</Wix> 
+1

अगर मैं आपके सवाल का सही ढंग से पढ़ा है, मुझे लगता है कि आपके प्रश्न के शीर्षक भ्रामक है । मुद्दा यह नहीं है कि 'WixNetfxExtension' काम करने में विफल रहा है। मुद्दा यह है कि आप ऐसा कुछ करना चाहते हैं जो आज 'WixNetfxExtension' द्वारा समर्थित नहीं है। दूसरों के लिए एक और वर्णनात्मक शीर्षक हो सकता है: "बंडल में संपीड़ित .NET Framework को कैसे शामिल करें"। अगर नीचे मेरा जवाब पूरी तरह से गलत है, तो इस टिप्पणी को नजरअंदाज करने के लिए स्वतंत्र महसूस करें। :) –

+0

@RobMensching, सही, शीर्षक भ्रामक था। मैं एक्स्टेलर को एक्सई के पास ढीला/आसन्न करने में सक्षम हूं, जो मैं चाहता हूं। हालांकि, मेरी स्थितियों का पता लगाने में असफल रहा है कि .NET पहले से स्थापित है या नहीं, और मुझे यकीन नहीं है कि क्यों। –

+0

प्रश्न में उत्तर जोड़ने के बजाय आप इसे एक उत्तर के रूप में भी जोड़ सकते हैं। यह बहुत समर्थित है Stackoverflow। (यह देखना मुश्किल है कि वास्तविक उत्तरों को ब्राउज़ करने की बजाय पूरी चीज़ को पढ़ने के बिना प्रश्न में एक एम्बेडेड उत्तर है) – Default

उत्तर

8

यहां बहुत सारे प्रश्न हैं।

यह जड़ सवाल की तरह लगता है कि कैसे शामिल करने के लिए NETFX अपने बंडल में एम्बेडेड स्थापित है। यदि ऐसा है, तो आप सही हैं कि WixNetfxExtension आज इसका समर्थन नहीं करता है। आपको अपनी प्रतिलिपि परिभाषित करनी होगी और आपकी प्रति करीब है (शायद src\ext\NetFxExtension\wixlib में क्या है) से कॉपी किया गया है। आपके बंडल में एम्बेडेड नेटफैक्स प्राप्त करने के लिए आपको केवल एक चीज बदलने की आवश्यकता है ExePackage/@Compressed विशेषता 'yes' पर सेट करें। या आप Compressed विशेषता बंद कर सकते हैं और यह आपके Bundle तत्व (जो 'yes' पर डिफ़ॉल्ट है) के संपीड़न का पालन करेगा।

दूसरा, DetectCondition निर्धारित करता है, तो पैकेज मशीन पर है। पैकेज मशीन पर है या नहीं, इस पर आधारित तार्किक चीजें जलाएंगी। उदाहरण के लिए, इंस्टॉलेशन बर्न के दौरान पैकेज अनुपस्थित होगा यदि पैकेज अनुपस्थित है लेकिन पैकेज पहले से मौजूद होने पर कुछ भी नहीं करेगा। बेशक, अनुपस्थित और स्थायी पैकेज अनइंस्टॉल करने के अनुरोधों को अनदेखा करते हैं।

तीसरा, InstallCondition इंगित करता है कि पैकेज कभी मशीन पर स्थापित किया जाना चाहिए। यदि यह सत्य का मूल्यांकन करता है तो पैकेज स्थापित किया जा सकता है (यदि अनुपस्थित है और स्थापित होने का अनुरोध किया गया है)। यदि यह गलत होने का मूल्यांकन करता है तो पैकेज हटा दिया जाता है (यदि मौजूद है)।

नोट: आपकी रजिस्ट्री खोज और शर्तें एनईटीएफएक्स का पता लगाने के लिए वाईएक्स टूलसेट में उपयोग की जाने वाली चीज़ों से थोड़ा अलग हैं।

<util:RegistrySearch 
    Id="NETFRAMEWORK40" 
    Variable="NETFRAMEWORK40" 
    Root="HKLM" 
    Key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" 
    Value="Install" 
    Result="value" /> 

DetectCondition तो है बस "NETFRAMEWORK40": निम्नलिखित NETFX के लिए पता लगाने WiX टूलसेट का उपयोग करता है। वह अंतर उन मुद्दों को समझा सकता है जो आप देख रहे हैं।

+0

मुझे वास्तव में नेट 40 इंस्टॉलर सहित कोई समस्या नहीं है। मेरा मुख्य मुद्दा यह है कि मेरी पहचान की स्थिति ठीक से काम नहीं कर रही है, और यह अलार्म पैकेज को स्थापित करने का प्रयास करता है भले ही उसके पास सिस्टम पर .NET 4.0 स्थापित है। –

+0

मैंने वाईएक्स टूलसेट द्वारा उपयोग किए गए नेटफैक्स 4 डिटेक्शन को शामिल करने के लिए अपना उत्तर अपडेट किया। –

+0

मेरी रजिस्ट्री खोजों को छोड़ने और DetectCondition को NETFRAMEWORK40 में बदलने के बाद, यह अभी भी परीक्षण मशीन (x64) पर .NET4 स्थापित करने का प्रयास करता है, जिसमें पहले से ही .NET 4 –

2

मैं इस उत्तर में .NET Framework 4.5.2 का उपयोग कर रहा हूं। .NET फ्रेमवर्क एक ऑफ़लाइन स्थापना के रूप में शामिल करने के लिए:

  1. अपने Chain में एक PackageGroupRef तत्व शामिल हैं:

    <Bundle> 
        <Chain> 
         <PackageGroupRef Id="NetFx452" />   
         <MsiPackage ... /> 
        </Chain> 
    </Bundle> 
    
  2. Download the Microsoft .NET Framework 4.5.2 (Offline Installer), और अपने Bootstrapper परियोजना में जोड़ें। (मैं इसे एक फ़ोल्डर "संसाधन" कहा जाता है में डाल दिया।)

  3. निम्नलिखित Fragment जोड़ें:

    <Fragment> 
        <util:RegistrySearchRef Id="NETFRAMEWORK45"/> 
        <PackageGroup Id="NetFx452"> 
         <ExePackage Id="NetFx452" 
            Cache="no" 
            Compressed="yes" 
            PerMachine="yes" 
            Permanent="yes" 
            Vital="yes" 
            Name="NDP452-KB2901907-x86-x64-AllOS-ENU.exe" 
            SourceFile="Resource\NDP452-KB2901907-x86-x64-AllOS-ENU.exe" 
            DetectCondition="NETFRAMEWORK45" 
            InstallCommand="/q /norestart" />  
        </PackageGroup> 
    </Fragment> 
    
संबंधित मुद्दे