2011-11-07 12 views
10

मैं विंडोज़ सेवा के लिए एक वाईएक्स इंस्टॉलर बनाने की कोशिश कर रहा हूं, और मैंने पढ़ा है कि मैंने अपनी सभी फाइलों के लिए कीपैथ को "नहीं" पर सेट करने के लिए तैयार किया है मेरी वाईएक्स स्क्रिप्ट में .exe का अपवाद।वाईएक्स इंस्टॉलर: गुणों को अद्यतन करने के लिए heat.exe के साथ xslt का उपयोग

"$(WIX)bin\heat.exe" dir $(SolutionDir)EmailGenerationService\bin\PROD 
        -cg EmailGenFiles -gg -scom -sreg -sfrag -srd -suid 
        -dr INSTALLLOCATION -var var.FileSource 
        -t $(Projectdir)KeyPathTransform.xslt 
        -out $(ProjectDir)DirectoryAndFileComponents.wxs 

यह मेरी DirectoryAndFileComponents.wxs फ़ाइल में मुख्यपथ के साथ = "नहीं" सभी फ़ाइल तत्वों को अपडेट करने के लिए मेरा इरादा है: मैं वर्तमान में यहां Heat.exe उपयोग करते हुए मेरे निर्देशिका और फ़ाइल संरचना पैदा कर रहा हूँ मेरी आदेश है। गर्मी से उत्पादन का एक नमूना है:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" 
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
      xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
      exclude-result-prefixes="msxsl" 
      xmlns:wix="http://schemas.microsoft.com/wix/2006/wix" 
      xmlns:my="my:my"> 

    <xsl:output method="xml" indent="no"/> 

    <xsl:strip-space elements="*"/> 

    <xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match='/wix:Wix/wix:Fragment/wix:DirectoryRef/wix:Component/wix:File[@Id and not (@Id="EmailGenerationService.exe")]'> 
    <xsl:attribute name="KeyPath"> 
      <xsl:value-of select="no"/> 
    </xsl:attribute> 
    </xsl:template> 
</xsl:stylesheet> 

मैं अन्य के आधार पर इस बात का काफी कुछ रूपों की कोशिश की है:

<?xml version="1.0" encoding="utf-8"?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 
    <Fragment> 
    <DirectoryRef Id="INSTALLLOCATION"> 
     <Component Id="Dollar.Common.dll" Guid="{2BCD0767-2383-47CF-B1BF-325FA4A3264F}"> 
     <File Id="Dollar.Common.dll" KeyPath="yes" Source="$(var.FileSource)\Dollar.Common.dll" /> 
     </Component> 
     <Component Id="Dollar.Common.Exceptions.dll" Guid="{B7238091-76D1-42F5-A3B4-A539DFF3BD92}"> 
     <File Id="Dollar.Common.Exceptions.dll" KeyPath="yes" Source="$(var.FileSource)\Dollar.Common.Exceptions.dll" /> 
     </Component> 
     <Component Id="Dollar.Common.Exceptions.pdb" Guid="{43711979-747D-49C9-BAE4-ECD44FAF5E67}"> 
     <File Id="Dollar.Common.Exceptions.pdb" KeyPath="yes" Source="$(var.FileSource)\Dollar.Common.Exceptions.pdb" /> 
     </Component> 
     <Component Id="Dollar.Common.Logging.dll" Guid="{59F9ABF3-5F68-410C-BC96-0556282F1E04}"> 
     <File Id="Dollar.Common.Logging.dll" KeyPath="yes" Source="$(var.FileSource)\Dollar.Common.Logging.dll" /> 
     </Component> 

यहाँ XSLT मैं परिवर्तन को करने के लिए गर्म करने के लिए गुजर रहा है इस साइट पर पोस्ट और अन्यथा, लेकिन अभी तक keyPath = "no" रखने के लिए heat.exe द्वारा बनाई गई फ़ाइल प्राप्त करने में असमर्थ रहा है।

क्या मुझे कुछ याद आ रही है?

  1. एक्सएमएल में: _ http://schemas.microsoft.com/wix/2006/wi
  2. XSLT में: http://schemas.microsoft.com/wix/2006/wix

मुझे पता है के रूप में, WiX के लिए सही नाम स्थान http://schemas.microsoft.com/wix/2006/wi है

उत्तर

11

आप अलग अलग परिभाषित नामस्थान की है। तो आपको अपने एक्सएसएलटी को सही करना चाहिए।

XSLT:

<xsl:stylesheet version="1.0" 
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
      xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
      exclude-result-prefixes="msxsl" 
      xmlns:wix="http://schemas.microsoft.com/wix/2006/wi" 
      xmlns:my="my:my"> 

    <xsl:output method="xml" indent="yes" /> 

    <xsl:strip-space elements="*"/> 

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match='wix:Wix/wix:Fragment/wix:DirectoryRef/wix:Component/wix:File[@Id and not (@Id = "EmailGenerationService.exe")]'> 
     <xsl:copy> 
      <xsl:apply-templates select="@*"/> 
      <xsl:attribute name="KeyPath"> 
       <xsl:text>no</xsl:text> 
      </xsl:attribute> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

इनपुट एक्सएमएल:

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 
    <Fragment> 
     <DirectoryRef Id="INSTALLLOCATION"> 
      <Component Id="Dollar.Common.dll" Guid="{2BCD0767-2383-47CF-B1BF-325FA4A3264F}"> 
       <File Id="Dollar.Common.dll" KeyPath="yes" Source="$(var.FileSource)\Dollar.Common.dll" /> 
      </Component> 
      <Component Id="Dollar.Common.Exceptions.dll" Guid="{B7238091-76D1-42F5-A3B4-A539DFF3BD92}"> 
       <File Id="Dollar.Common.Exceptions.dll" KeyPath="yes" Source="$(var.FileSource)\Dollar.Common.Exceptions.dll" /> 
      </Component> 
      <Component Id="Dollar.Common.Exceptions.pdb" Guid="{43711979-747D-49C9-BAE4-ECD44FAF5E67}"> 
       <File Id="Dollar.Common.Exceptions.pdb" KeyPath="yes" Source="$(var.FileSource)\Dollar.Common.Exceptions.pdb" /> 
      </Component> 
      <Component Id="Dollar.Common.Logging.dll" Guid="{59F9ABF3-5F68-410C-BC96-0556282F1E04}"> 
       <File Id="Dollar.Common.Logging.dll" KeyPath="yes" Source="$(var.FileSource)\Dollar.Common.Logging.dll" /> 
      </Component> 
     </DirectoryRef> 
    </Fragment> 
</Wix> 

आउटपुट एक्सएमएल:

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 
    <Fragment> 
    <DirectoryRef Id="INSTALLLOCATION"> 
     <Component Id="Dollar.Common.dll" Guid="{2BCD0767-2383-47CF-B1BF-325FA4A3264F}"> 
     <File Id="Dollar.Common.dll" Source="$(var.FileSource)\Dollar.Common.dll" KeyPath="no" /> 
     </Component> 
     <Component Id="Dollar.Common.Exceptions.dll" Guid="{B7238091-76D1-42F5-A3B4-A539DFF3BD92}"> 
     <File Id="Dollar.Common.Exceptions.dll" Source="$(var.FileSource)\Dollar.Common.Exceptions.dll" KeyPath="no" /> 
     </Component> 
     <Component Id="Dollar.Common.Exceptions.pdb" Guid="{43711979-747D-49C9-BAE4-ECD44FAF5E67}"> 
     <File Id="Dollar.Common.Exceptions.pdb" Source="$(var.FileSource)\Dollar.Common.Exceptions.pdb" KeyPath="no" /> 
     </Component> 
     <Component Id="Dollar.Common.Logging.dll" Guid="{59F9ABF3-5F68-410C-BC96-0556282F1E04}"> 
     <File Id="Dollar.Common.Logging.dll" Source="$(var.FileSource)\Dollar.Common.Logging.dll" KeyPath="no" /> 
     </Component> 
    </DirectoryRef> 
    </Fragment> 
</Wix> 
+0

प्रतिक्रिया के लिए धन्यवाद, लेकिन यह भी काम नहीं कर रहा है। गर्मी त्रुटियों के साथ ठीक है, लेकिन परिणामस्वरूप फ़ाइल में अभी भी सभी नोड्स पर कीपैथ = "हां" है। –

+0

@ मार्कजोन, मैंने अपना जवाब अपडेट कर लिया है। –

+1

सही, आपको बहुत धन्यवाद –

2

मैं अपने मूल सवाल का जवाब नहीं होगा। :)

मैंने पढ़ा है कि मैं मुख्यपथ सेट करने के लिए "नहीं" मेरे सभी फाइलें, .exe

के अपवाद के साथ के लिए करने के लिए मुझे लगता है कि आप गुमराह थे nned। हकीकत में ServiceInstall table एक स्तंभ Component_ है और MSDN के अनुसार:

इस सेवा InstallService तालिका का उपयोग कर स्थापित करने के लिए, इस घटक के लिए मुख्यपथ सेवा के लिए निष्पादन योग्य फ़ाइल होना चाहिए।

इसका मतलब यह नहीं है कि अन्य घटकों में गैर-एक्सई फाइलों में @KeyPath='no' होना चाहिए। यह सिर्फ इतना कहता है कि सेवा की EXE फ़ाइल को एक अलग घटक में रहना चाहिए और इसका मुख्य मार्ग होना चाहिए।

कुंजी पथ एमएसआई प्रौद्योगिकी की एक बहुत ही महत्वपूर्ण अवधारणा है। आप इसके बारे में here, see the description of the KeyPath column के बारे में अधिक पढ़ सकते हैं।

अब, यदि हम आपके मूल प्रश्न पर वापस आते हैं - नहीं, आपको जिस तरह से उल्लेख किया गया है, उसे गर्मी आउटपुट को ट्विक करने की आवश्यकता नहीं है। यह आपको डिफ़ॉल्ट रूप से आवश्यक वाईएक्स संलेखन उत्पन्न करेगा।

+0

यान की जानकारी के लिए धन्यवाद, मैंने यहां से अपनी धारणाएं लीं: http://blog.tentaclesoftware.com/archive/2009/01/01/21.aspx –

+0

नमूने में आप एक घटक में संदर्भित करते हैं जिसमें कई फाइलें होती हैं। यह सच है कि केवल एक फ़ाइल को KeyPath = 'yes' के रूप में चिह्नित किया जा सकता है, लेकिन आपको दूसरों को स्पष्ट रूप से KeyPath = 'no' के रूप में चिह्नित करने की आवश्यकता नहीं है। और आपके लिए उत्पन्न नमूना heat.exe में आपकी धारणा पूरी तरह से गलत है। –

+0

@ मार्क जोन्स, क्षमा करें अगर मेरी पिछली टिप्पणी एक कठिन रूप में व्यक्त की जाती है। जब मैं लोगों को समय और खर्चों को हल करने की कोशिश कर रहा हूं जो कि अस्तित्व में नहीं आते हैं, तो मैं प्रतिक्रिया का विरोध नहीं कर सकता :) –

1

क्या मैं एक अलग दृष्टिकोण सुझा सकता हूं?

<xsl:template match="@KeyPath[parent::wix:File[parent::wix:Component[parent::wix:DirectoryRef[parent::wix:Fragment[parent::wix:Wix]]]] and . != 'EmailGenerationService.exe']"> 
     <xsl:attribute name="KeyPath"> 
      <xsl:value-of select="'no'"/> 
     </xsl:attribute> 
</xsl:template> 

बस ऊपर दिए गए अपने टेम्पलेट मिलान को बदलें और आपके पास सही परिणाम होना चाहिए।

संबंधित मुद्दे