2012-10-12 27 views
6

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

  1. मुझे निर्मित करने के लिए बिल्ट-इन फ़ोल्डर को चेक आउट करना होगा क्योंकि इसमें फ़ाइलों को स्रोत नियंत्रण के तहत ही पढ़ा जाता है। यह जांचते समय परेशानी पैदा करता है क्योंकि मेरे पास चेक की गई बहुत सारी फाइलें हैं।
  2. जब मैं प्रोजेक्ट में एक नई फ़ाइल जोड़ता हूं तो मुझे यह सुनिश्चित करना होगा कि मुझे इसे बिल्टड फ़ोल्डर में जोड़ना याद है या फ़ाइल के निर्मित संस्करण को तैनात नहीं किया जाएगा।
  3. मेरा निर्माण बिल्ड सर्वर पर असफल हो जाएगा क्योंकि बिल्ट-इन फ़ोल्डर में फ़ाइलों को केवल वहां पढ़ा जाता है।
  4. फ़ाइलों के लिए खोज करते समय और टेक्स्ट आधारित खोजों को करने पर एक ही नाम वाली फ़ाइल की दो प्रतियां एक समस्या है।

मैं बिल्ड सर्वर का निर्माण करना चाहते हैं और एक पूर्व निर्माण कदम के रूप में जावास्क्रिप्ट फ़ाइलें minifiy लेकिन मैं नहीं करना चाहती BuiltScripts प्रोजेक्ट में जोड़ी फ़ोल्डर होगा। हालांकि जब निर्माण सर्वर अंत में प्रोजेक्ट को संकुल करता है, तो मैं इसे बिल्ड प्रक्रिया के आउटपुट के साथ बिल्ट-इन फ़ोल्डर की प्रतिलिपि बनाना चाहता हूं। इसे कैसे प्राप्त किया जा सकता है?

+0

आप तैनाती \ प्रकाशन के लिए क्या उपयोग कर रहे हैं - क्या यह मानक एमएसबिल्ड लक्ष्य है या आपने कुछ कस्टम बनाया है? –

+0

@AlexeyShcherbak MSBuild, TFS, कुछ भी कस्टम –

+0

मुझे संदेह है कि सईद इब्राहिम हाशिमी ने आपके प्रश्न के बाद उत्तर के साथ इस पोस्ट को लिखा था :)। http://sedodream.com/2012/10/09/VSWebPublishHowToIncludeFilesOutsideOfTheProjectToBePublished.aspx –

उत्तर

5

प्रोजेक्ट गुणों (जो मुझे लगता है कि आप क्या मतलब है) की पूर्व-निर्माण घटना का उपयोग करने के बजाय, .csproj/.vbproj फ़ाइल में पहलेबिल्ड लक्ष्य को ओवरराइड करें।

<Project ...> 
    ... 
    <Target Name="BeforeBuild"> 
    <!-- Create the 'BuildScripts' directory. --> 
    <!-- The $(IntermediateOutputPath) reference the 'obj' folder, which I like to --> 
    <!-- use for these kinds of things. --> 
    <MakeDir Directories="$(IntermediateOutputPath)BuiltScripts"> 
     <Output PropertyName="BuildScriptsPath" TaskParameter="DirectoriesCreated" /> 
    </MakeDir> 
    <!-- Execute the javascript minifier. --> 
    <Exec Command="..." /> 
    <!-- Create an item group for the minified scripts so we manipulate the target path. --> 
    <CreateItem Include="$(BuildScriptsPath)\*.js"> 
     <Output ItemName="BuiltScripts" TaskParameter="Include" /> 
     <Output ItemName="FileWrites" TaskParameter="Include" /> 
    </CreateItem> 
    <!-- Add the minified scripts to the Content item group, --> 
    <!-- which the deployment MSBuild inspects for files to deploy. --> 
    <CreateItem Include="@(BuiltScripts)" 
     AdditionalMetadata="TargetPath=scripts\%(Filename)%(Extension)"> 
     <Output ItemName="ContentWithTargetPath" TaskParameter="Include" /> 
    </CreateItem> 
    </Target> 
    ... 
</Project> 

आप सामग्री मद समूह है कि CreateItem कार्य के उत्पादन में है अगर फ़ाइलों सही निर्देशिका के लिए तैनात नहीं मिलता के आकार के साथ खेलने के लिए हो सकता है। ध्यान दें कि मैंने लक्षित पथ scripts\YourScript.js बनाने के लिए एक आइटम ट्रांसफॉर्म का उपयोग किया था।

यह भी ध्यान दें कि पहले CreateItem कार्य आउटपुट को 'फ़ाइलवाइट्स' नामक किसी आइटम समूह में रखता है। मैंने पाया कि स्वच्छ लक्ष्य का निरीक्षण करता है कि आइटम समूह को यह जानने के लिए कि कौन सी फाइलें हटाना है।

प्लेस कि<Import> तत्वों के बाद अपने प्रोजेक्ट फाइल में XML और तुम जाना अच्छा होना चाहिए। कोई जांच-इन स्रोत नियंत्रण आवश्यक नहीं है और यहां तक ​​कि आपका बिल्ड सर्वर भी खुश होगा।

+0

क्या आप पिछले बिल्टऑन फ़ोल्डर्स सामग्री को हटाने के लिए एक कदम जोड़ देंगे? –

+0

मैंने अपना नमूना कोड चलाया और ऐसा लगता है कि incrementalClean लक्ष्य स्वचालित रूप से फ़ाइलों को हटा देगा क्योंकि वे FileWrites आइटम समूह में शामिल हैं, जो उपयोगी है जब आप .js फ़ाइल को हटाते हैं और आप इसे अब तैनात नहीं करना चाहते हैं। – Matt

0

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

0

मुझे एक समान आवश्यकता थी, हालांकि यह केवल निर्माण के हिस्से के रूप में उन्हें उत्पन्न करने के बजाय मौजूदा फ़ाइलों को एक तैनाती पैकेज में जोड़ने में शामिल था। मैंने this page पर तकनीक को उपयोगी पाया।