आप VS2010 वेब परिनियोजन पैकेज का उपयोग करके अतिरिक्त फ़ाइलें कैसे शामिल करते हैं?


125

मैं दृश्य स्टूडियो 2010 में नई वेब पैकेजिंग कार्यक्षमता का उपयोग करके परीक्षण कर रहा हूं और एक ऐसी स्थिति में आया हूं जहां मैं आवश्यक प्रतिलिपि बनाने के लिए एक पूर्व-निर्माण घटना का उपयोग करता हूं। मेरे बिन फ़ोल्डर में वह एप्लिकेशन जो एपीआई कॉल के लिए निर्भर करता है। उन्हें एक संदर्भ के रूप में शामिल नहीं किया जा सकता है क्योंकि वे COM डीएलएस नहीं हैं जिन्हें इंटरोप के साथ इस्तेमाल किया जा सकता है।

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

जवाबों:


176

बड़ा सवाल है। मैंने अभी वेब परिनियोजन उपकरण (MSDeploy) में इसके बारे में एक बहुत विस्तृत ब्लॉग प्रविष्टि पोस्ट की है : अतिरिक्त फ़ाइलों सहित पैकेज या विशिष्ट फ़ाइलों को छोड़कर

यहाँ सार है। फ़ाइलों को शामिल करने के बाद, मैं दिखाता हूं कि फ़ाइलों को कैसे बाहर रखा जाए।

जिनमें एक्सट्रा फाइल्स शामिल हैं

पैकेज में अतिरिक्त फ़ाइलों को शामिल करना थोड़ा कठिन है लेकिन फिर भी कोई बड़ा नहीं है अगर आप MSBuild के साथ सहज हैं, और यदि आप नहीं हैं तो इसे पढ़ें। ऐसा करने के लिए, हमें उस प्रक्रिया के भाग में हुक करने की आवश्यकता है जो पैकेजिंग के लिए फाइलें एकत्र करता है। हमें जिस लक्ष्य का विस्तार करने की आवश्यकता है उसे CopyAllFilesToSingleFolder कहा जाता है। इस लक्ष्य के पास एक निर्भरता गुण है, PipelinePreDeployCopyAllFilesToOneFolderDependsOn, जिसे हम टैप कर सकते हैं और अपने लक्ष्य को इंजेक्ट कर सकते हैं। इसलिए हम CustomCollectFiles नाम का एक लक्ष्य बनाएंगे और इस प्रक्रिया में इंजेक्ट करेंगे। हम इसे निम्नलिखित के साथ प्राप्त करते हैं (आयात विवरण के बाद याद रखें)।

<PropertyGroup>
  <CopyAllFilesToSingleFolderForPackageDependsOn>
    CustomCollectFiles;
    $(CopyAllFilesToSingleFolderForPackageDependsOn);
  </CopyAllFilesToSingleFolderForPackageDependsOn>

  <CopyAllFilesToSingleFolderForMsdeployDependsOn>
    CustomCollectFiles;
    $(CopyAllFilesToSingleFolderForMsdeployDependsOn);
  </CopyAllFilesToSingleFolderForMsdeployDependsOn>
</PropertyGroup>

यह हमारे लक्ष्य को प्रक्रिया में जोड़ देगा, अब हमें लक्ष्य को स्वयं परिभाषित करने की आवश्यकता है। मान लेते हैं कि आपके पास एक्स्ट्रा फाइल्स नाम का एक फोल्डर है जो आपके वेब प्रोजेक्ट के ऊपर 1 लेवल पर बैठता है। आप उन सभी फ़ाइलों को शामिल करना चाहते हैं। यहाँ CustomCollectFiles लक्ष्य है और हम उसके बाद चर्चा करते हैं।

<Target Name="CustomCollectFiles">
  <ItemGroup>
    <_CustomFiles Include="..\Extra Files\**\*" />

    <FilesForPackagingFromProject  Include="%(_CustomFiles.Identity)">
      <DestinationRelativePath>Extra Files\%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath>
    </FilesForPackagingFromProject>
  </ItemGroup>
</Target>

यहाँ मैंने जो भी किया वह था आइटम _CustomFiles और इसे शामिल करें विशेषता में इसे उस फ़ोल्डर में सभी फ़ाइलों को लेने और इसके नीचे किसी भी फ़ोल्डर को लेने के लिए कहा। अगर किसी भी तरह से आपको उस सूची से कुछ को बाहर करने की आवश्यकता है , तो एक Excludeविशेषता जोड़ें _CustomFiles

तब मैं FilesForPackagingFromProject आइटम को पॉप्युलेट करने के लिए इस आइटम का उपयोग करता हूं। यह वह आइटम है जिसे MSDeploy वास्तव में अतिरिक्त फ़ाइलों को जोड़ने के लिए उपयोग करता है। यह भी ध्यान दें कि मैंने मेटाडेटा डेस्टिनेशनरेलिवेटिव वैल्यू घोषित किया है। यह सापेक्ष पथ निर्धारित करेगा कि इसे पैकेज में रखा जाएगा। मैंने यहाँ एक्सट्रा फाइल्स% (RecursiveDir)% (फाइलनाम)% (एक्सटेंशन) स्टेटमेंट का उपयोग किया। जो कुछ भी कह रहा है उसे पैकेज में उसी रिश्तेदार स्थान पर रखना है क्योंकि यह अतिरिक्त फ़ाइलों के फ़ोल्डर में है।

फाइलों को छोड़कर

यदि आप वीएस 2010 के साथ बनाई गई एक वेब एप्लिकेशन की प्रोजेक्ट फाइल खोलते हैं, तो उसके नीचे आपको एक लाइन मिलेगी।

<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />

BTW आप VS के अंदर प्रोजेक्ट फ़ाइल खोल सकते हैं। प्रोजेक्ट पिक अनलोड प्रोजेक्ट पर राइट क्लिक करें। फिर अनलोड्ड प्रोजेक्ट पर राइट क्लिक करें और एडिट प्रोजेक्ट चुनें।

इस वक्तव्य में वे सभी लक्ष्य और कार्य शामिल होंगे जिनकी हमें आवश्यकता है। हमारे अधिकांश अनुकूलन उस आयात के बाद होने चाहिए, यदि आपको यकीन नहीं है कि बाद में डाल दिया जाए! इसलिए यदि आपके पास फ़ाइल को बाहर करने के लिए कोई आइटम नाम है, तो ExcludeFromPackageFiles, ऐसा करने के लिए उपयोग किया जा सकता है। उदाहरण के लिए मान लें कि आपके पास Sample.Debug.xml नाम की फ़ाइल है जो आपके वेब एप्लिकेशन में शामिल है लेकिन आप चाहते हैं कि फ़ाइल को बनाए गए पैकेज से बाहर रखा जाए। आप उस आयात विवरण के बाद स्निपेट को नीचे रख सकते हैं।

<ItemGroup>
  <ExcludeFromPackageFiles Include="Sample.Debug.xml">
    <FromTarget>Project</FromTarget>
  </ExcludeFromPackageFiles>
</ItemGroup>

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


3
क्या आप अपने उदाहरण को अतिरिक्त प्रोजेक्ट आउटपुट को प्रकाशित करने के लिए बढ़ा सकते हैं?
एंथोनी सेरड्यूकोव

7
मेरे पास VS2012 (RC) स्थापित है, और मेरे लिए एक अलग डिपेंडेंसीप्रॉपर्टी थी। मिश्रित टीमों (और हमारे बिल्ड सर्वर) का समर्थन करने के लिए, मेरे पास मूल CopyAllFilesToSingleFolderForPackageDependsOn कॉन्फ़िगरेशन और डिपेंडेंसीप्रोपरेटी CopyAllFilesToSleleFolderForMsdeployDependsOn
Emil Lerch

2
यह अद्भुत है। इसका उपयोग txt फ़ाइल में संग्रहीत कुछ संस्करण जानकारी को तैनात करने के लिए किया जाता है।
लामरेंट

5
यह मेरे लिए काम नहीं लगता है। मैं VStudio 2013 का उपयोग कर रहा हूं। :( 2013 के लिए उपरोक्त msbuild सेटअप काम कर रहा है?
irperez

8
@ सय्यद इब्राहिमहशिमी और सह। asp.net वेबसाइट पर इस गाइड का एक बहुत अधिक अद्यतित संस्करण बनाया गया है । मैं उस लिंक की अत्यधिक अनुशंसा करता हूं, क्योंकि वह मेरे बीच का अंतर था, जो कि pubxml फ़ाइल के बजाय csproj फ़ाइल को संशोधित करने में अटक गया था।
एडम वेनेशिया

21

एक सरल समाधान बिन फ़ोल्डर में आवश्यक dll को शामिल करने के लिए csproj फ़ाइल को संपादित करना है और फिर आइटम को सामान्य लाइब्रेरी फ़ोल्डर से बिन फ़ोल्डर में कॉपी करने के लिए एक पूर्वनिर्मित लक्ष्य बनाना है जहां हम अपने 3 पार्टी dll को संग्रहीत करते हैं। क्योंकि आइटम समाधान फ़ाइल में मौजूद है जो इसे msbuild / msdeploy द्वारा तैनात किया गया है और कुछ भी जटिल नहीं है।

वीएस के माध्यम से फाइल को शामिल किए बिना टैग का उपयोग किया जाता है (जो आमतौर पर आपके वीसीएस में इसे जोड़ना चाहेगा)

<Content Include="Bin\3rdPartyNative.dll" ><Visible>false</Visible></Content>

यह मेरे द्वारा काम किए गए पहले का लक्ष्य है:

<Target Name="BeforeBuild">
    <Message Text="Copy $(SolutionDir)Library\3rdPartyNative.dll to '$(TargetDir)'3rdPartyNative.dll" Importance="high" />
    <Copy SourceFiles="$(SolutionDir)Library\3rdPartyNative.dll" DestinationFiles="$(TargetDir)3rdPartyNative.dll" />
</Target>

प्रविष्टि को छुपाने के लिए @ tuespetre के सुझाव को शामिल करने का संपादन इस प्रकार एक दृश्यमान बिन फ़ोल्डर के पिछले हिस्से को हटा देता है। मेरे द्वारा असत्यापित।


3
"सादगी परम परिष्कार है"
बॉर्नटोड

1
यह कई मामलों में काम करता है, लेकिन काम नहीं करता है यदि आपके पास बिन फ़ोल्डर के बाहर शामिल होने की आवश्यकता वाली फाइलें हैं।
नाथन

5
@toxaq, मुझे कुछ याद आ रहा है, लेकिन मुझे जो समस्या थी, वह यह थी कि मुझे वास्तव में तैनाती पैकेज में एक स्थान पर फ़ाइलों की आवश्यकता थी जो बिन फ़ोल्डर में नहीं थी । तो हाँ, आप बिन फ़ोल्डर से कहीं भी फ़ाइलों को कॉपी कर सकते हैं, लेकिन वे उस परिदृश्य में परिनियोजन पैकेज में सही स्थान पर शामिल नहीं होंगे। इसकी कीमत क्या है, इसके लिए मैं जिस स्थिति में गया था, वह ClearScript.V8 प्रोजेक्ट के साथ थी - देशी। Dll को बिन निर्देशिका में दिखाई नहीं देना चाहिए , लेकिन इसके माता-पिता में दिखाई देना चाहिए - चर्चा के लिए clearscript.codeplex.com/discussions/439696 देखें। ।
नाथन

3
अगर मैं कर सकता तो मैं दस बार और बढ़ा देता। यह स्वीकृत उत्तर होना चाहिए। मैं यह भी जोड़ना चाहूंगा कि आप <Visible>false</Visible>इसे समाधान एक्सप्लोरर से छिपाने के लिए सेट कर सकते हैं ।
ट्यूपेसेट्रे

1
@Tohid धन्यवाद, उस संपादन को बना दिया है। मेरे पास परीक्षण करने के लिए कोई एमएस सामान नहीं है इसलिए मैंने इसे सत्यापित नहीं किया है।
टॉक्सिक

7

बस @toxaq की तरह, लेकिन एक और भी सरल समाधान है:

समाधान खोजकर्ता में फ़ाइल को लायब्रेरी / संदर्भ फ़ोल्डर के लिंक के रूप में जोड़ें, और फिर गुणों में इसे बिल्ड के आउटपुट में कॉपी करने के लिए सेट करें।


3
-1 यह मानता है कि परियोजना एक स्पष्ट लिंकर-टाइम संबंध रखना चाहती है। प्लग-इन प्रकार प्रणालियों के लिए उपयुक्त नहीं है
मिकीडी

6

इसलिए सईद के कार्यान्वयन ने मेरे लिए काम नहीं किया। मैं VS2013 का उपयोग कर रहा हूं और वेब डिप्लॉय पैकेज का उपयोग कर रहा हूं और एक और फोल्डर से कुछ प्लगइन DLL को तैनाती पैकेज के बिन में जोड़ने की जरूरत है। यहां बताया गया है कि मैं इसे कैसे काम कर पाया (बहुत आसान):

अपनी csproj फ़ाइल जोड़ने के नीचे:

<Target Name="AdditionalFilesForPackage" AfterTargets="CopyAllFilesToSingleFolderForMsdeploy">
    <ItemGroup> 
        <Files Include="..\SomeOtherProject\bin\$(Configuration)\*.*"/>
    </ItemGroup>
    <Copy SourceFiles="@(Files)" DestinationFolder="$(_PackageTempDir)\bin\" />  
</Target>

Csproj फ़ाइल में अन्य उल्लेख:

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <DebugType>pdbonly</DebugType>
    <Optimize>true</Optimize>
    <OutputPath>bin\</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
    <DeployOnBuild>true</DeployOnBuild>
    <DeployTarget>Package</DeployTarget>
    <DeployIisAppPath>Default Web Site/MyWebsite</DeployIisAppPath>
    <DesktopBuildPackageLocation>..\output\Service\Service\Service.Release.zip</DesktopBuildPackageLocation>
    <FilesToIncludeForPublish>OnlyFilesToRunTheApp</FilesToIncludeForPublish>
    <ExcludeGeneratedDebugSymbol>true</ExcludeGeneratedDebugSymbol>
    <PublishDatabases>false</PublishDatabases>
</PropertyGroup>

<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v12.0\WebApplications\Microsoft.WebApplication.targets" />

धन्यवाद। मैं VS2015 का उपयोग कर रहा हूं और मुझे एक अन्य प्रोजेक्ट बिन फ़ोल्डर से DLLS जोड़ने की भी आवश्यकता है। आपका समाधान सबसे आसान था और निर्दोष रूप से काम किया।
राफेल

5

ऊपर एमिल लेर्च की टिप्पणी पर जोर देने के लिए टिप्पणी करना चाहता था। यदि आपने एक एज़्योर एसडीके स्थापित किया है, तो एक अलग डिपेंडेंसीप्रॉपर्टी की तलाश करें।

असल में, आपको "CopyAllFilesToSingleFolderForMsdeployDependsOn" के बजाय "CopyAllFilesToSingleFolderForPackageDependOn" का उपयोग करने की आवश्यकता हो सकती है। मैं वास्तव में एक उन्नत MsBuild आदमी नहीं हूं और मैं अपने लक्ष्य को निर्धारित करने की कोशिश में अपने बालों को खींच कर बर्बाद नहीं कर रहा हूं।

यहाँ एक और लिंक है अगर यह आपके लिए काम नहीं करता है और आपने एक Azure SDK स्थापित किया है: http://forums.iis.net/t/1190714.aspx


3

सईद के जवाब के परिशिष्ट के रूप में, मैंने पाया कि मेरी परियोजना के भीतर ExcludeFromPackageFiles आइटम की एक स्थिर घोषणा पर्याप्त नहीं थी। मुझे कुछ DLL को बाहर करने की आवश्यकता थी जो केवल संकलन के बाद उपलब्ध थे (Azure विशिष्ट Ninject मॉड्यूल जो IIS में लागू होने पर आवश्यक नहीं हैं)।

इसलिए मैंने ऊपर पोस्ट किए गए CopyAllFilesToSingleFolderForPackageDependsOn ट्रिक सैयद का उपयोग करके अपनी ExcludeFromPackageFiles सूची बनाने में हुक लगाने का प्रयास किया। हालाँकि, यह बहुत देर हो चुकी है क्योंकि पैकेजिंग प्रक्रिया ने पहले ही ExcludeFromPackageFiles आइटम हटा दिए हैं। इसलिए, मैंने उसी तकनीक का इस्तेमाल किया, लेकिन थोड़ा पहले:

<PropertyGroup>
    <ExcludeFilesFromPackageDependsOn>
        $(ExcludeFilesFromPackageDependsOn);
        _ExcludeAzureDlls
    </ExcludeFilesFromPackageDependsOn>
</PropertyGroup>

<Target Name="_ExcludeAzureDlls">
    <ItemGroup>
        <FilesForPackagingFromProjectWithNoAzure Include="@(FilesForPackagingFromProject)"
                               Exclude="%(RootDir)%(Directory)*Azure*.dll" />
        <AzureFiles Include="@(FilesForPackagingFromProject)"
                    Exclude="@(FilesForPackagingFromProjectWithNoAzure)" />
        <ExcludeFromPackageFiles Include="@(AzureFiles)">
            <FromTarget>_ExcludeAzureEnvironmentDlls</FromTarget>
        </ExcludeFromPackageFiles>
    </ItemGroup>
</Target>

उम्मीद है कि किसी की मदद करता है ...


1

साथ ही, फ़ाइल को सामग्री के रूप में सेट करना संभव है हमेशा कॉपी करें

साथ ही, फ़ाइल को सामग्री के रूप में सेट करना संभव है  हमेशा कॉपी करें


1
लगता है कि यह शीर्ष उत्तर होना चाहिए क्योंकि यह सबसे आसान और सबसे स्पष्ट है
जे मिगलियट्टा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.