पोस्ट बिल्ड इवेंट की फ़ाइलों को शामिल करने के लिए विज़ुअल स्टूडियो 'पब्लिश' कार्यक्षमता कैसे प्राप्त करें?


90

मैं वर्तमान में अपनी वेब परिनियोजन आवश्यकताओं को संभालने के लिए Visual Studio 2010 'Publish' और MSDeploy कार्यक्षमता का उपयोग करने का प्रयास कर रहा हूं, लेकिन मेरे बिल्ड कॉन्फ़िगरेशन के आधार पर पैकेज को कस्टमाइज़ करने के संबंध में एक अवरोधक में चला गया है।

मैं एक 32 बिट वातावरण में विकसित होता हूं, लेकिन 64 बिट पर्यावरण के लिए एक रिलीज़ पैकेज बनाने की आवश्यकता होती है, इसलिए 'रिलीज़' कॉन्फ़िगरेशन में मेरे पास एक पोस्ट बिल्ड इवेंट है जो 32-बिट संस्करण को अधिलेखित करने वाले बिन निर्देशिका में 64-बिट संस्करण के 64 बिट संस्करण की प्रतिलिपि बनाता है। । जब मैं 'प्रकाशित' कार्यक्षमता का उपयोग करता हूं, भले ही सही 64 बिट डीएल को बिन निर्देशिका में कॉपी किया जा रहा हो, यह पैकेज में शामिल नहीं होता है।

क्या पोस्ट बिल्ड इवेंट के दौरान बिन निर्देशिका में कॉपी की गई फ़ाइलों को शामिल करने के लिए 'प्रकाशित' करने का कोई तरीका है?


1
यदि आप इसके बजाय पूर्व- निर्माण ईवेंट का उपयोग करते हैं, तो यह काम करने लगता है जैसा कि आप पहले से ही चाहते हैं (विजुअल स्टूडियो 2013, ASP.NET प्रोजेक्ट टेम्पलेट)।
bzlm

वे दृश्य स्टूडियो 2015 में और बाद में टिप्पणी में उल्लिखित पूर्व-निर्मित व्यवहार को हटा चुके हैं।
justdan23

जवाबों:


92

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

आपके परिदृश्य में आप पोस्ट बिल्ड ईवेंट का उपयोग कर रहे हैं, मैं आपको पोस्ट बिल्ड ईवेंट को छोड़ने और पोस्ट बिल्ड इवेंट के बजाय अपने स्वयं के MSBuild लक्ष्यों का उपयोग करके अपने कार्यों को लागू करने की सलाह दूंगा। नीचे आपको दूसरे उत्तर का पाठ मिलेगा।


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


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

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

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

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

<PropertyGroup>
  <CopyAllFilesToSingleFolderForPackageDependsOn>
    CustomCollectFiles;
    $(CopyAllFilesToSingleFolderForPackageDependsOn);
  </CopyAllFilesToSingleFolderForPackageDependsOn>
</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 आइटम बनाना और इसमें शामिल विशेषता ने उस फ़ोल्डर में सभी फ़ाइलों को लेने और इसके नीचे किसी भी फ़ोल्डर को लेने के लिए कहा। तब मैं FilesForPackagingFromProject आइटम को पॉप्युलेट करने के लिए इस आइटम का उपयोग करता हूं। यह वह आइटम है जिसे MSDeploy वास्तव में अतिरिक्त फ़ाइलों को जोड़ने के लिए उपयोग करता है। यह भी ध्यान दें कि मैंने मेटाडाटा डेस्टिनेशनरेलिवेटिव वैल्यू घोषित किया है। यह सापेक्ष पथ निर्धारित करेगा कि इसे पैकेज में रखा जाएगा। मैंने यहाँ स्टेटमेंट फाइल्स% (RecursiveDir)% (फाइलनाम)% (एक्सटेंशन) का उपयोग किया। जो कुछ भी कह रहा है उसे पैकेज में उसी सापेक्ष स्थान पर रखना है क्योंकि यह अतिरिक्त फ़ाइलों के फ़ोल्डर में है।

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

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

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

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

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

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

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


8
@ देखा, यह VS2012 के लिए काम नहीं करता है, क्या आप जानते हैं कि इस परिदृश्य के लिए इसे कैसे अपडेट किया जा सकता है। v11.0 को बदलने से काम नहीं चलता है। TIA।
साइमन फ्रांसेस्को

2
इस सामान के बारे में कहीं भी कोई दस्तावेज नहीं है। Microsoft प्रलेखन आपके ब्लॉग का संदर्भ देता है।
मैथ्यू जेम्स डेविस

2
@ डैनियल यदि आपको केवल विशिष्ट फ़ाइलों की आवश्यकता है और फ़ोल्डर की नहीं, तो केवल *** के साथ पुनरावर्ती जोड़ने के बजाय उन विशिष्ट फ़ाइलों को शामिल करने के लिए _CustomFiles को बदलें। तो कुछ ऐसा <_CustomFiles शामिल करें = ".. \ निर्भरताएँ \ FileA.dll" /> <_ CustomFiles शामिल करें = "C: \ Someotherplace \ FileB.txt" /> कुछ इसी तरह।
बर्क

3
@SimonFrancesco मैंने इसे भी अनुभव किया है, और उपरोक्त परिवर्तन के रूप में लिखित रूप में <CopyAllFilesToSingleFolderForMsdeployDependsOn> के बजाय <CopyAllFilesToSingleFolderMordeployDependsOn> का विस्तार किया गया है।
bwerks


13

मुझे ExcludeFilesFromDeploymentप्रोजेक्ट फ़ाइल में तत्व का उपयोग करके समस्या के लिए वर्कअराउंड मिला । मुझे वेब परिनियोजन से विचार मिला : फ़ाइलों और फ़ोल्डरों को छोड़कर

इसलिए यदि आपको प्रोजेक्ट फ़ाइलों को पैकेज करने की आवश्यकता है क्योंकि वे एक सफल बिल्ड और संबद्ध पोस्ट बिल्ड चरणों के बाद आपकी प्रोजेक्ट निर्देशिका में मौजूद हैं, तो निम्न कार्य करें।

  1. "पैकेज / प्रकाशित वेब" परियोजना सेटिंग्स संपादित करें और
    "इस परियोजना फ़ोल्डर में सभी फाइलें" होने के लिए आइटम का चयन करें
  2. प्रोजेक्ट को उतारें
  3. अनलोड किए गए प्रोजेक्ट पर राइट क्लिक करें और प्रोजेक्ट कॉन्फिग को एडिट करना चुनें
  4. PropertyGroup"रिलीज़" जैसे कॉन्फ़िगरेशन सेटिंग से जुड़े तत्व का पता लगाएँ
  5. PropertyGroupतत्व के भीतर निम्नलिखित तत्वों को जोड़ें और उन फ़ाइलों और फ़ोल्डरों को बाहर करें जिन्हें आप पैकेज में नहीं चाहते हैं

    <ExcludeFilesFromDeployment>*.cs;**\.svn\**\*.*;Web.*.config;*.csproj*</ExcludeFilesFromDeployment>
    <ExcludeFoldersFromDeployment>.svn;Controllers;BootstrapperTasks;Properties</ExcludeFoldersFromDeployment>
    
  6. अपनी परियोजना को सहेजें और पुनः लोड करें

यह समय के लिए मेरी समस्या को हल करता है लेकिन अगर कोई बेहतर समाधान है तो कृपया मुझे बताएं, क्योंकि यह हैकरी शामिल होने के कारण आदर्श नहीं है, लेकिन फिर शायद यह एक असामान्य तैनाती परिदृश्य है?


6

अपनी फ़ाइलों या फ़ोल्डरों का चयन करें और गुण विंडो से सामग्री के रूप में निर्माण कार्य बदलें।


1
सही, लेकिन अतिरिक्त आपको "कॉपी करें यदि नया" या "हमेशा कॉपी करें" का चयन करना होगा, क्योंकि अन्यथा डिफ़ॉल्ट कार्रवाई "कॉपी न करें", भले ही "कंटेंट" चुना गया हो।
मैट

1
अतिरिक्त कदम के लिए मैट से सहमत
गोम्स

7
फोल्डर (VS2013) के लिए कोई बिल्ड एक्शन मौजूद नहीं है
क्रिस्टियान ई।

copytooutputdirectory = कॉपी ऑलवेज
गोम्स

हमेशा कॉपी के बिना भी काम किया।
टेंगिज

3

मुझे इसका पुराना सवाल पता है, लेकिन इनमें से किसी ने भी मेरे लिए काम नहीं किया।

2017 के वीएस में मैंने अभी प्रकाशित होने के लिए अतिरिक्त फ़ोल्डर पर राइट क्लिक किया और प्रकाशित काम का चयन किया।

उदाहरण:

यहाँ छवि विवरण दर्ज करें


हालांकि यह एक छोटा अतिरिक्त कदम है लेकिन यह बहुत सरल है।
सियारन गैलाघर

0

परियोजना में बिन फ़ोल्डर (और यह सामग्री है) को जोड़ने से फाइलों को प्रकाशित आउटपुट निर्देशिका में कॉपी किया जा सकता है।

मेरे लिए, मेरा मुद्दा यह था कि मुझे बिन / फ़ोल्डर में एक मालिकाना सॉफ़्टवेयर लाइसेंस फ़ाइल रखने की आवश्यकता थी, लेकिन प्रत्येक तैनाती के लिए मैन्युअल रूप से इसे कॉपी नहीं करना चाहता था।

यह Visual Studio 2015 Professional का उपयोग कर रहा था


0

मुझे पता है कि यह एक पुरानी बातचीत है, लेकिन मैं उसी काम को करने की कोशिश करते हुए आया था और मुझे लगा कि जो मुझे यहां मिला है उसे जोड़ने में मददगार होगा।

आपके प्रकाशन में अतिरिक्त फ़ाइलों सहित लगभग सभी लेखों में CopyAllFilesToSingleFolderForPackageDependsOnया CopyAllFilesToSingleFolderForMSDeployDependsOnवस्तुओं को जोड़ने की इस पद्धति का उपयोग किया जाता है PropertyGroupऔर वे सभी कुछ "जैसे मैंने इसे फ़ाइल के अंत में जोड़ा ..."

यह वही है जो मैंने किया था और एक दोपहर बिताने की कोशिश कर रहा था कि क्यों कुछ भी नहीं हो रहा था जब तक मुझे एहसास नहीं हुआ PropertyGroupकि फ़ाइल के शीर्ष पर एक अनुभाग पहले से ही था । जब मैंने CopyAllFilesToSingleFolderForPackageDependsOnउस खंड में अपना काम किया तो यह ठीक रहा।

आशा है कि यह किसी दिन किसी को समय बचाता है

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