2011-02-09 11 views
8

मेरे पास एक ऐसा उत्पाद है जिसमें कई विशेषताओं को शामिल किया जा सकता है जिन्हें विभिन्न स्थानों पर इंस्टॉल किया जा सकता है उदा। फ़ीचर 1 प्रोग्राम फ़ाइलों में एक निष्पादन योग्य स्थापित है और फ़ीचर 2 एक वेबसाइट है जो wwwroot में स्थापित है। हालांकि फ़ीचर 1 और फ़ीचर 2 दोनों एक ही डीएलएल पर भरोसा करते हैं और इसलिए उन सुविधाओं को आवश्यक है जो उन डीएलएस को 2 अलग-अलग स्थानों में स्थापित करने की आवश्यकता रखते हैं, जिन पर निर्भर करता है।विभिन्न स्थानों पर स्थापित सुविधाएं, लेकिन उसी घटक को संदर्भित करना

क्या प्रत्येक घटक को दो बार परिभाषित किए बिना इसे प्राप्त करने का कोई तरीका है?

मैं क्या हासिल करने की कोशिश कर रहा हूँ का एक और पूरा उदाहरण प्रदान करने के लिए निम्न पूरा wxs फ़ाइल का उपयोग कर संकलित किया जा सकता:

> candle.exe Foobar.wxs

> light.exe -ext WixUIExtension Foobar.wixobj

> msiexec/i Foobar.msi

<?xml version='1.0' encoding='windows-1252'?> 
<Wix xmlns='http://schemas.microsoft.com/wix/2006/wi'> 

    <Product Name='Foobar 1.0' 
      Id='E578DF12-DDE7-4BC2-82CD-FF11862862D5' 
      UpgradeCode='90F09DD5-E01B-4652-8971-515997730195' 
      Language='1033' 
      Codepage='1252' 
      Version='1.0.0' 
      Manufacturer='Acme Ltd.'> 

    <Package Id='*' 
      Keywords='Installer' 
      Description="Acme 1.0 Installer" 
      InstallerVersion='100' 
      Languages='1033' 
      Compressed='yes' 
      SummaryCodepage='1252' /> 

    <Media Id='1' Cabinet='Sample.cab' EmbedCab='yes' DiskPrompt="CD-ROM #1" /> 
    <Property Id='DiskPrompt' Value="Acme 1.0 Installation" /> 

    <Directory Id='TARGETDIR' Name='SourceDir'> 
     <!-- Directory 1 (Program Files) --> 
     <Directory Id="ProgramFilesFolder" Name="PFiles"> 
      <Directory Id="PROGRAM_INSTALLDIR" Name="Acme" /> 
     </Directory> 

     <!-- Directory 2 (wwwroot) --> 
     <Directory Id="Inetpub" Name="Inetpub"> 
      <Directory Id="wwwroot" Name="wwwroot"> 
       <Directory Id="WEBSITE_INSTALLDIR" Name="AcmeWebSite" /> 
      </Directory> 
     </Directory> 
    </Directory> 

    <DirectoryRef Id='PROGRAM_INSTALLDIR'> 
     <Component Id="Component1" Guid="79EC9E0B-8325-427B-A865-E1105CB16B62"> 
      <File Id="File1" Name="File1.txt" Source="File1.txt" /> 
     </Component> 
    </DirectoryRef> 

    <DirectoryRef Id='WEBSITE_INSTALLDIR'> 
     <Component Id="Component2" Guid="702E6573-8FBC-4269-A58D-FD1157111F0F"> 
      <File Id="File2" Name="File2.txt" Source="File2.txt" /> 
     </Component> 
    </DirectoryRef> 

    <Feature Id="Feature.Program" 
      Title="My Program" 
      TypicalDefault="install" 
      Level="1" 
      ConfigurableDirectory="PROGRAM_INSTALLDIR" > 
     <ComponentRef Id="Component1"/> 
     <ComponentRef Id="Component2"/> 
    </Feature> 

    <Feature Id="Feature.Website" 
      Title="My Website" 
      TypicalDefault="install" 
      Level="1" 
      ConfigurableDirectory="WEBSITE_INSTALLDIR" > 
     <ComponentRef Id="Component1"/> 
     <ComponentRef Id="Component2"/> 
    </Feature> 

    <UIRef Id="WixUI_Mondo" /> 
    <UIRef Id="WixUI_ErrorProgressText" /> 

    </Product> 
</Wix> 

हालांकि यह केवल File1.txt में

सी स्थापित किया जा रहा में परिणाम होगा: \ Program Files (x86) \ एक्मे

और केवल File2.txt में

_C स्थापित किया जा रहा: \ Inetpub \ wwwroot \ AcmeWebsite_

एक समाधान के रूप में दो बार घटकों को परिभाषित करने के लिए है:

<DirectoryRef Id='PROGRAM_INSTALLDIR'> 
    <Component Id="Component1" Guid="79EC9E0B-8325-427B-A865-E1105CB16B62"> 
     <File Id="File1" Name="File1.txt" Source="File1.txt" /> 
    </Component> 
    <Component Id="Component2" Guid="702E6573-8FBC-4269-A58D-FD1157111F0F"> 
     <File Id="File2" Name="File2.txt" Source="File2.txt" /> 
    </Component> 
</DirectoryRef> 

<DirectoryRef Id='WEBSITE_INSTALLDIR'> 
    <Component Id="Component1.Web" Guid="397E93AA-32FB-425A-A783-386E0CCA2357"> 
     <File Id="File1.Web" Name="File1.txt" Source="File1.txt" /> 
    </Component> 
    <Component Id="Component2.Web" Guid="5C3AFF06-3623-4524-A90B-72B46DE5572A"> 
     <File Id="File2.Web" Name="File2.txt" Source="File2.txt" /> 
    </Component> 
</DirectoryRef> 

<Feature Id="Feature.Program" 
     Title="My Program" 
     TypicalDefault="install" 
     Level="1" 
     ConfigurableDirectory="PROGRAM_INSTALLDIR" > 
    <ComponentRef Id="Component1"/> 
    <ComponentRef Id="Component2"/> 
</Feature> 

<Feature Id="Feature.Website" 
     Title="My Website" 
     TypicalDefault="install" 
     Level="1" 
     ConfigurableDirectory="WEBSITE_INSTALLDIR" > 
    <ComponentRef Id="Component1.Web"/> 
    <ComponentRef Id="Component2.Web"/> 
</Feature> 

लेकिन फिर क्या होता है यदि हम किसी अन्य स्थान पर स्थापित होने वाली तीसरी सुविधा जोड़ते हैं? क्या हमें फिर से हर घटक को फिर से परिभाषित करना है? 100 से अधिक घटकों के साथ, डुप्लिकेट घटकों का प्रबंधन एक बड़ा काम बन जाएगा।

कोई सुझाव?

+1

किसी को भी इस समस्या को हल करने के लिए देख रहे किसी भी व्यक्ति के लिए, मैं इस [माइक्रोसॉफ्ट समर्थन आलेख] (http://support.microsoft.com/kb/837908) से विधि 3 का उपयोग कर समाप्त हुआ ताकि वेबसाइट इसे अपने डीएलएस लोड कर सके प्रोग्राम फ़ाइलें बिन स्थान से और वहां डीएलएस की एक प्रतिलिपि स्थापित की गई। केवल कुछ छोटी संख्या में डीएलएल को डुप्लिकेट करने की आवश्यकता होती है क्योंकि उन्हें असेंबली रिसोलव हैंडलर सेट करने से पहले वेब ऐप लोड करना आवश्यक होता है। हमारा सॉफ़्टवेयर थोड़ा अजीब है कि वेबसाइट बड़ी संख्या में डीएलएस से बड़ी संख्या में ऑब्जेक्ट्स लोड करने, डुप्लिकेट घटकों को परिभाषित करने या – Casey

उत्तर

14

आप विंडोज इंस्टालर में एक सीमा देख रहे हैं। एक घटक केवल एमएसआई के माध्यम से स्थापित किया जा सकता है।प्रत्येक घटक केवल एक निर्देशिका में स्थापित किया जा सकता है। एक घटक की सामग्री को दो अलग-अलग स्थानों पर स्थापित करने के लिए, आपको या तो एक ही सामग्री के साथ एक और घटक बनाना होगा या सामग्री को डुप्लिकेट करने के लिए CopyFile तत्व का उपयोग करने का प्रयास करना होगा।

शायद आप जो सुनना नहीं चाहते थे, वैसे ही विंडोज इंस्टालर काम करता है।

सौभाग्य से, यदि आपने विकल्प 1 के साथ जाना चुना है, तो वाईएक्स टूलसेट केवल एक बार घटक में डुप्लिकेट सामग्री को संपीड़ित करेगा। Smart cabbing rocks!

1

मैं एक अलग सुविधा बनाने की अनुशंसा करता हूं जिसमें केवल सामान्य घटक हों। इसे डिफ़ॉल्ट रूप से स्थापित नहीं किया जाना चाहिए। फिर आप एक कस्टम एक्शन बना सकते हैं जो इस सुविधा को केवल इंस्टॉलेशन के लिए चिह्नित करता है जब आपकी वास्तविक सुविधाओं में से एक इंस्टॉल हो।

स्थापना के लिए सुविधा चिह्नित करने के लिए आप MsiSetFeatureState फ़ंक्शन का उपयोग कर सकते हैं: http://msdn.microsoft.com/en-us/library/aa370387(VS.85).aspx

जो इस अपनी सुविधाओं की सुविधा कार्रवाई के साथ अनुकूलित किया जा सकता करता कस्टम क्रिया: http://msdn.microsoft.com/en-us/library/aa368561(VS.85).aspx

+0

को परिभाषित करने के लिए प्रतिबिंब का उपयोग करती है, मुझे अभी भी यह समझ में नहीं आता कि यह सामान्य घटकों को कैसे स्थापित करने में मदद करता है प्रत्येक सुविधा द्वारा निर्दिष्ट 2 अलग-अलग स्थान। शायद आप यह बता सकते हैं कि आप कैसे काम करते हैं? – Casey

+1

आप सामान्य घटकों को डुप्लिकेट क्यों करना चाहते हैं? आम तौर पर आम संसाधन सार्वजनिक स्थान (परीक्षा कार्यक्रम कार्यक्रम \ सामान्य फाइलों के लिए) में रखा जाता है और सभी उत्पाद उन्हें इस स्थान से उपयोग करते हैं। –

0

विशेषताएं एक निर्देशिका संदर्भित कर सकते हैं ब्राउज़ क्षमता के लिए, लेकिन इसका मतलब केवल कुछ है यदि घटक निर्देशिका का उपयोग करते हैं जो उस निर्देशिका या उस निर्देशिका के बच्चे हैं। अन्यथा घटक निर्दिष्ट निर्देशिका में जाएगा। दूसरे शब्दों में, आप सुविधा के लिए स्थापित कर सकते हैं और अधिकांश घटकों में अभी तक कोई अन्य है (कहें [कॉमनफाइलफोल्डर] कंपनी \ किसी अन्य घटक के लिए साझा की गई है और यह वहां जाएगी। वह घटक तब कई सुविधाओं से संबंधित हो सकता है और आप ठीक रहेगा।

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