यहाँ उत्तर मिला:
http://www.digitallycreated.net/Blog/59/locally-publishing-a-vs2010-asp.net-web-application-use-msbuild
विज़ुअल स्टूडियो 2010 में शानदार नए वेब एप्लिकेशन प्रोजेक्ट प्रकाशन सुविधाएँ हैं जो आपको एक बटन के एक क्लिक के साथ अपनी वेब ऐप परियोजना को आसानी से प्रकाशित करने की अनुमति देती हैं। पर्दे के पीछे Web.config परिवर्तन और पैकेज बिल्डिंग एक विशाल MSBuild स्क्रिप्ट द्वारा किया जाता है जो आपकी परियोजना फ़ाइल में आयात की जाती है (पाया: C: \ Program Files (x86) \ MSBuild \ Microsoft \ VisualStudio \ v \ _ \ _ \ Web \ Microsoft .Web.Publishing.targets)। दुर्भाग्य से, स्क्रिप्ट बेहद जटिल, गन्दा और अनिर्दिष्ट है (अन्य तो कुछ बुरी तरह से वर्तनी और फ़ाइल में ज्यादातर बेकार टिप्पणियां)। उस फ़ाइल का एक बड़ा फ़्लोचार्ट और उस पर हुक करने के तरीके के बारे में कुछ दस्तावेज़ीकरण करना अच्छा होगा, लेकिन लगता है कि इसमें दुख की कमी है (या कम से कम मुझे यह नहीं मिल सकता है)।
दुर्भाग्य से, इसका मतलब यह है कि कमांड लाइन के माध्यम से प्रकाशन करना बहुत अधिक अपारदर्शी है जितना कि इसकी आवश्यकता है। मैं इस क्षेत्र में दस्तावेज़ीकरण की कमी से हैरान था, क्योंकि इन दिनों कई दुकानें एक निरंतर एकीकरण सर्वर का उपयोग करती हैं और कुछ भी स्वचालित तैनाती (जो VS2010 प्रकाशन सुविधाओं के साथ बहुत मदद कर सकते हैं) करते हैं, इसलिए मैंने सोचा होगा कि इसे सक्षम करना ( आसानी से!) सुविधा के लिए एक काफी मुख्य आवश्यकता रही होगी।
वैसे भी, Microsoft.Web.Publishing.targets के माध्यम से घंटों तक खुदाई करने और परीक्षण और त्रुटि दीवार के खिलाफ मेरे सिर को पीटने के बाद, मैंने यह पता लगाने में कामयाबी हासिल की है कि विज़ुअल स्टूडियो अपने जादू को कैसे प्रदर्शित करता है "फाइल सिस्टम को प्रकाशित करें" पर क्लिक करें और "परिनियोजन पैकेज बनाएँ" सुविधाएँ। मैं MSBuild स्क्रिप्टिंग का एक सा हो जाएगा, इसलिए यदि आप MSBuild से परिचित नहीं हैं, तो मेरा सुझाव है कि आप इस क्रैश कोर्स MSDN पृष्ठ को देखें।
फाइल सिस्टम पर प्रकाशित करें
VS2010 पब्लिश टू फाइल सिस्टम डायलॉग पब्लिश टू फाइल सिस्टम ने मुझे थोड़ी देर के लिए निकाल दिया क्योंकि मुझे उम्मीद थी कि MSBuild के कुछ समझदार उपयोग होने वाले हैं। इसके बजाय, VS2010 कुछ अजीब करता है: यह MSBuild को एक तरह की अर्ध-तैनाती करने के लिए कहता है जो आपके प्रोजेक्ट के obj फ़ोल्डर में वेब ऐप की फ़ाइलों को तैयार करता है, फिर यह उन फ़ाइलों की मैन्युअल प्रति (जैसे MSBuild के बाहर) करता है। आपके लक्ष्य में प्रकाशित फ़ोल्डर। यह वास्तव में अजीब व्यवहार है क्योंकि MSBuild को (और अन्य बिल्ड-संबंधित चीजों) के आसपास फ़ाइलों को कॉपी करने के लिए डिज़ाइन किया गया है, इसलिए यह समझ में आता है कि यदि पूरी प्रक्रिया सिर्फ एक MSBuild लक्ष्य थी जिसे VS2010 ने एक लक्ष्य के रूप में कहा, तो एक मैन्युअल प्रतिलिपि नहीं।
इसका मतलब यह है कि कमांड-लाइन पर MSBuild के माध्यम से ऐसा करना उतना आसान नहीं है जितना कि किसी विशेष लक्ष्य के साथ आपकी प्रोजेक्ट फ़ाइल को लागू करना और कुछ गुण सेट करना। आपको ऐसा करने की आवश्यकता होगी कि VS2010 को क्या करना चाहिए: अपने आप को एक लक्ष्य बनाएं जो अर्ध-तैनाती करता है और फिर परिणाम को लक्ष्य फ़ोल्डर में कॉपी करता है। अपनी प्रोजेक्ट फ़ाइल को संपादित करने के लिए, VS2010 में प्रोजेक्ट पर राइट क्लिक करें और अनलोड प्रोजेक्ट पर क्लिक करें, फिर राइट क्लिक करें और फिर एडिट पर क्लिक करें। वेब एप्लिकेशन लक्ष्य (Microsoft.WebApplication.targets) आयात करने वाले आयात तत्व को खोजने तक नीचे स्क्रॉल करें; यह फ़ाइल स्वयं Microsoft.Web.Publishing.targets फ़ाइल आयात करती है जो पहले बताई गई है। इस पंक्ति के नीचे हम अपने नए लक्ष्य को जोड़ेंगे, जिसे PublishToFileSystem कहा जाता है:
<Target Name="PublishToFileSystem"
DependsOnTargets="PipelinePreDeployCopyAllFilesToOneFolder">
<Error Condition="'$(PublishDestination)'==''"
Text="The PublishDestination property must be set to the intended publishing destination." />
<MakeDir Condition="!Exists($(PublishDestination))"
Directories="$(PublishDestination)" />
<ItemGroup>
<PublishFiles Include="$(_PackageTempDir)\**\*.*" />
</ItemGroup>
<Copy SourceFiles="@(PublishFiles)"
DestinationFiles="@(PublishFiles->'$(PublishDestination)\%(RecursiveDir)%(Filename)%(Extension)')"
SkipUnchangedFiles="True" />
</Target>
यह लक्ष्य PipelinePreDeployCopyAllFilesToOneFolder लक्ष्य पर निर्भर करता है, जो कि VS2010 अपनी मैन्युअल कॉपी करने से पहले कॉल करता है। Microsoft.Web.Publishing.targets में चारों ओर खुदाई से पता चलता है कि इस लक्ष्य को कॉल करने से प्रोजेक्ट फ़ाइलों को संपत्ति _PackageTempDir द्वारा निर्दिष्ट निर्देशिका में रखा जाता है।
पहला काम जिसे हम अपने लक्ष्य में कहते हैं वह है त्रुटि कार्य, जिस पर हमने एक शर्त रखी है जो यह सुनिश्चित करता है कि कार्य केवल तब होता है जब पब्लिशडेशन प्रॉपर्टी सेट नहीं की गई हो। यह आपके द्वारा प्रकाशित किए गए प्रॉपर्टी को निर्दिष्ट करने के लिए भूल गए मामले में बिल्ड को पकड़ लेगा और आपको त्रुटि देगा। हम तब MakeDir कार्य को उस पब्लिशडेशन डायरेक्टरी बनाने के लिए कहते हैं यदि यह पहले से मौजूद नहीं है।
इसके बाद हम पब्लिशफिल्स नामक एक आइटम को परिभाषित करते हैं जो _PackageTempDir फ़ोल्डर के तहत मिलने वाली सभी फाइलों का प्रतिनिधित्व करता है। प्रतिलिपि कार्य को तब कहा जाता है जो उन सभी फ़ाइलों को प्रकाशित गंतव्य फ़ोल्डर में कॉपी करता है। गंतव्य तत्व की प्रतिलिपि तत्व पर विशेषता थोड़ा जटिल है; यह आइटमों का एक रूपांतरण करता है और पब्लिशड फोल्डर फ़ोल्डर में रूट किए गए नए रास्तों पर जाने के लिए उनके पथ को परिवर्तित करता है (वेल-ज्ञात आइटम मेटाडेटा देखें) कि वे% (क्या मतलब है) देखें।
कमांड-लाइन से इस लक्ष्य को कॉल करने के लिए हम अब बस इस कमांड को कर सकते हैं (जाहिर है कि प्रोजेक्ट फ़ाइल का नाम और गुण आपके अनुरूप हो):
msbuild Website.csproj "/p:Platform=AnyCPU;Configuration=Release;PublishDestination=F:\Temp\Publish" /t:PublishToFileSystem
Condition="false"
पीछे की संगतता के लिए सशर्त आयात मौजूद है। VS2010 के लिए आवश्यक है कि यह आयात मौजूद है, भले ही यह झूठी स्थिति के कारण छोड़ दिया गया हो। यदि आप फिर से देखते हैं तो आप देखेंगे कि csproj में एक और आयात है$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets
जिसके लिए विज़ुअल स्टूडियो के वर्तमान संस्करण के लिए लक्ष्य फ़ाइल में हल होता है।