2012-09-03 20 views
39

टीएल; डीआर: मुझे इसे बनाने के लिए इस सशर्त घटक में खाली<CreateFolder/> तत्व क्यों चाहिए?मेरे वाईएक्स इंस्टॉलर को एक एक्सएमएल फ़ाइल को सशर्त रूप से अपडेट करने के लिए एक खाली CreateFolder की आवश्यकता क्यों है?

मैं एक इन-हाउस एप्लिकेशन के लिए एक साधारण वाईएक्स आधारित इंस्टॉलर डाल रहा हूं। इस इंस्टॉलर को मानक कॉन्फ़िगरेशन फ़ाइल (सामान्य .NET .config फ़ाइल) को तैनात करने की आवश्यकता होती है और उसके बाद कमांड लाइन पर msiexec पर गुणों का उपयोग करके इसे अनुकूलित करें।

अनुकूलन में से एक केवल एक विशिष्ट अनुप्रयोग सेटिंग बनाना है यदि RUNTIME संपत्ति को परिभाषित किया गया हो। यहाँ उस के लिए WiX घटक है:

<Component Id="C.Rbnz.Fsis.CollectionPeriodService.exe.config.runtime" 
      Guid="*"> 
    <Condition> 
     <![CDATA[RUNTIME]]> 
    </Condition> 

    <CreateFolder/> 

    <util:XmlFile Id="X.Runtime.1" 
        Action="createElement" 
        ElementPath="/configuration/appSettings" 
        File="[#F.Rbnz.Fsis.CollectionPeriodService.exe.config]" 
        Name="add" 
        Sequence="2"/> 

    <util:XmlFile Id="X.Runtime.2" 
        File="[#F.Rbnz.Fsis.CollectionPeriodService.exe.config]" 
        ElementPath="/configuration/appSettings/add[\[]not(@key)[\]]" 
        Action="setValue" 
        Name="key" 
        Value="RunTime" 
        Sequence="3"/> 

    <util:XmlFile Id="X.Runtime.3" 
        File="[#F.Rbnz.Fsis.CollectionPeriodService.exe.config]" 
        ElementPath="/configuration/appSettings/add[\[]@key='RunTime'[\]]" 
        Action="setValue" 
        Name="value" 
        Value="[RUNTIME]" 
        Sequence="4"/> 

    </Component> 

यह काम करता है बस के रूप में मैं चाहता हूँ - अगर क्रम msiexec के लिए कमांडलाइन पर निर्दिष्ट किया जाता है, नए तत्व बनाया जाता है; यदि नहीं, कुछ भी नहीं होता है।

मुझे इस घटक के भीतर खाली <CreateFolder/> क्यों होना चाहिए?

जबकि मैं यह काम करने की कोशिश कर रहा था, मुझे "Wix Condition Statement" मिला, जो एक कार्य घटक दिखाता है, लेकिन यह नहीं बताता कि <CreateFolder/> क्यों आवश्यक है।

<CreateFolder/> निकाला जा रहा है मुझे इस त्रुटि देता है:

ICE18: KeyPath for Component: 'C.Rbnz.Fsis.CollectionPeriodService.exe.config.runtime' is Directory: 'INSTALLDIR'. The Directory/Component pair must be listed in the CreateFolders table.

है जो, मुझे यकीन है, काफी जानकारीपूर्ण एक बार आप जानते हैं कि इसका क्या मतलब है।

उत्तर

39

प्रत्येक घटक का एक महत्वपूर्ण पथ होता है; सबसे आम एक फाइल है। आपके घटक में फ़ाइल या अन्य कुंजी पथ नहीं है, इसलिए वाईएक्स इसे निर्देशिका का डिफ़ॉल्ट देता है। इसके बाद विंडोज इंस्टालर आता है और कहता है कि निर्देशिका कुंजी पथ वाले घटकों को यह सुनिश्चित करना चाहिए कि निर्देशिका बनाई गई हो, भले ही कुछ और ऐसा करे। यह एक आसान फिक्स के साथ एक मूर्ख नियम है।

+1

मैं इसका हिस्सा समझता हूं - घटक को एक महत्वपूर्ण पथ की आवश्यकता होती है, डिफ़ॉल्ट रूप से यह एक निर्देशिका प्राप्त करता है, और यह सुनिश्चित करने के लिए '' की आवश्यकता होती है। लेकिन यह कौन सी निर्देशिका है, और कहां? क्या यह सुरक्षित है? क्या यह इंस्टॉल के हिस्से के रूप में लक्ष्य मशीन पर कहीं खाली (मलबे) फ़ोल्डर्स बना रहा है? क्या ऐसा करने का कोई आसान तरीका है? – Bevan

+1

यह जो कुछ भी आप घटक को बता रहे हैं उसकी मूल निर्देशिका है। त्रुटि संदेश के आधार पर, यह इंस्टॉल किया गया है। –

+0

@ बेवन: किसी रिक्त फ़ोल्डर में स्थापित करने के लिए सेट किए गए खाली घटक में एक कम बनाने वाली फोल्डर प्रविष्टि, जिसमें कोई अन्य फाइल नहीं है, एक विदेशी स्थिति को ट्रिगर करेगा जहां लॉन्च के बाद विंडोज इंस्टालर द्वारा फ़ोल्डर हटा दिया गया है (क्योंकि यह खाली है) तो विंडोज इंस्टालर एक विज्ञापित शॉर्टकट के माध्यम से इसे अगले लॉन्च पर दोबारा डालने का प्रयास करता है (यह एक कीपैथ चेक ट्रिगर करता है)। यह बकवास एक अंतहीन चक्र में दोहराता है। मैंने अभी परीक्षण करने के लिए सत्यापित किया है कि यह विंडोज इंस्टालर के बाद के संस्करणों में तय किया गया है, लेकिन मुझे अभी भी समस्या दिखाई दे रही है। एक CreateFolder प्रविष्टि इस विदेशी स्व-मरम्मत समस्या को रोकती है। –

15

आप इसके बजाय अपने घटक टैग में पैरामीटर कुंजीपैथ = "हाँ" का उपयोग कर सकते हैं। केवल तभी जब 'इंस्टालडियर' इस घटक के लिए सही पथ है।