2010-09-01 18 views
13

.NET 4.0 में msbuild का उपयोग करके, मैं "पैकेज" लक्ष्य के साथ वेब प्रोजेक्ट का निर्माण कर सकता हूं, और यह पैकेज को ज़िप फ़ाइल में डालने का अच्छा काम करता है। लेकिन, जब मैं वहां web.config को देखता हूं, तो यह परिवर्तित नहीं होता है, इसमें "$ (ReplacableToken_Web_SiteConnection-Web.config कनेक्शन स्ट्रिंग_0)"क्या एमएस तैनात कर सकता है पैकेज और ट्रांसफॉर्म कर सकता है, लेकिन तैनात नहीं किया जा सकता है?

मैं "ट्रांसफॉर्म वेबकॉन्फिग" लक्ष्य चला सकता हूं और यह उचित परिवर्तन करेगा , लेकिन सिर्फ अपने ही सिलो में।

मैं "बिल्ड" लक्ष्य भी चला सकता हूं और "DeployOnBuild = True; DeployTarget = MSDeployPublish" गुणों को पास कर सकता हूं और यह उचित वेब.कॉन्फिग ट्रांसफ़ॉर्म के साथ मेरे सर्वर पर पैकेज को तैनात करेगा।

लेकिन, अगर मैं सर्वर पर मैन्युअल रूप से पैकेज को तैनात करना चाहता हूं, तो मैं "ट्रांसफॉर्म वेबकॉन्फिग" के साथ "पैकेज" कैसे करूं ताकि ज़िप फ़ाइल में अंतिम वेब.कॉन्फिग हो?

उत्तर

10

हम जिस तरह से इसे पैकेजिंग से पहले ट्रांसफॉर्म करने के लिए प्रोजेक्ट बिल्ड को संशोधित करके संशोधित करते हैं।

लक्ष्य कॉल TransformXml है और Microsoft.Web.Publishing.Tasks.dll

का एक हिस्सा

अपने खुद के लक्ष्य में है इसकी

<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll" /> 

लेकिन यह एक डिफ़ॉल्ट वी.एस. सी # निर्माण में शामिल किया जाएगा ।

तो

<TransformXml Source="web.config" Transform="web.release.config" Destination="$(DeployPath)\web.config" /> 

हमारे लिए काम कर देता है।

सही आइटम समूह ("सामग्री" के साथ उन पथों को सेट करें) और सुनिश्चित करें कि आपके .csproj में पैकेज को कॉल से पहले लक्ष्य निकाल दिया गया है, और बिल्ड आउटपुट में "Web.config" सामान्य, सही रूप से परिवर्तित मूल्यों के साथ।

वैकल्पिक रूप से (हमने इसे संकुल के लिए उपयोग किया है जो हर किसी के लिए सब कुछ होने की आवश्यकता है), आप सभी चालों को करने के लिए उस चाल का उपयोग कर सकते हैं और उनमें से प्रत्येक को अंतिम पैकेज में शामिल कर सकते हैं।

तो फिर तुम Msdeploy मैन्युअल फोन और उसके छोड़ का उपयोग करें और केवल उत्पादन के लिए तैनाती के समय

जैसा एक निर्देशों (भूल तकनीकी शब्द) की जगह मान लिया जाये कि आप अपने पैकेज में एक web.usethisone.config है, कि

-skip:objectname=filepath,absolutepath=web\..*\.config 

-replace:objectName=filepath,match=.*web\.usethisone\.config,replace=web.config 
+0

धन्यवाद, यह एक आकर्षण की तरह काम करता है और मुझे बहुत समय बचाता है। मैंने विभिन्न तैनाती पर्यावरण के लिए एकाधिक Web.config फ़ाइलों को बदलने के लिए अधिक समय व्यतीत किया। –

+0

मैं एक ही समस्या से जूझ रहा हूं। मैंने को अपने वेब एप्लिकेशन की .csproj फ़ाइल में जोड़ा, लेकिन मुझे समझ में नहीं आया कि मुझे अनुभाग कहां रखना चाहिए। मुझे कैसे पता चलेगा कि "सही आइटम समूह (" सामग्री "सबसे अधिक संभावना है)" और मैं अपने .csproj फ़ाइल में "पैकेज पर कॉल से पहले लक्ष्य को कैसे निकाल सकता हूं"? –

12

यदि आप इसे होने से छोड़ना चाहते हैं तो आपको अपने निर्माण में एक संपत्ति सेट करने की आवश्यकता है। आप दो तरह से

  1. संपादित अपनी परियोजना फ़ाइल में ऐसा कर सकते हैं
  2. एक .wpp.targets फ़ाइल

मैं # 2 की सिफारिश करेंगे बनाएँ। इस मामले के लिए उसी प्रोजेक्ट में एक नई फ़ाइल बनाएं जैसे आपकी प्रोजेक्ट फ़ाइल नाम {ProjectName} .wpp.targets जहां {ProjectName} आपके प्रोजेक्ट का नाम है। फिर इस फ़ाइल के अंदर आपको निम्नलिखित सामग्री रखना चाहिए।

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" 
     ToolsVersion="4.0"> 
    <PropertyGroup> 
    <AutoParameterizationWebConfigConnectionStrings>false</AutoParameterizationWebConfigConnectionStrings> 
    </PropertyGroup> 
</Project> 

इस मामले में आप संपत्ति AutoParameterizationWebConfigConnectionStrings जो वेब प्रकाशन पाइपलाइन बताता कनेक्शन तार के लिए web.config में उन {} प्लेसहोल्डर सम्मिलित नहीं करने के लिए सेट कर रहे हैं।

+0

जो प्लेसहोल्डर्स से संबंधित है लेकिन पैकेजिंग के दौरान ट्रांसफॉर्म को लागू करने का तरीका नहीं बताता है। –

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

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