2012-02-17 19 views
7

यदि संभव हो तो मैं काम करने की कोशिश कर रहा हूं, विजुअल स्टूडियो में कस्टम टूल का उपयोग करते समय, एक फ़ाइल की सामग्री में बदलाव करने के लिए, दूसरे के कस्टम टूल को ट्रिगर करें।विजुअल स्टूडियो में, क्या मैं एक फ़ाइल को किसी अन्य का कस्टम टूल चला सकता हूं? (इस मामले में Xsd2Code का उपयोग कर)

मेरे परिदृश्य यह है:

एक दृश्य स्टूडियो सी # परियोजना में, मैं एक "master.xsd" XML स्कीमा जो कई अन्य अन्य XSD फ़ाइलें शामिल है। मैं स्कीमा से .cs उत्पन्न करने के लिए Xsd2Code विजुअल स्टूडियो कस्टम टूल का उपयोग कर रहा हूं। यह ठीक काम करता है जब master.xsd स्वयं बदलता है, लेकिन मैं कस्टम मास्टर को फ़ाइल master.xsd पर चलाने के लिए चाहूंगा जब किसी अन्य xsds में से कोई एक बदल जाए।

क्या किसी अन्य फ़ाइल का एक और तरीका ट्रिगर करने का कोई तरीका है?

[संपादित - कारण है कि मैं इस के लिए एक कस्टम उपकरण का उपयोग कर में देख रहा हूँ पर और अधिक विस्तार]

वर्तमान में हम एक GenerateFiles.bat फ़ाइल है कि कोड fiels उत्पन्न करने के लिए कमांड लाइन से Xsd2Code कॉल स्कीमा से (जैसा कि नीचे मैटडेवी द्वारा सुझाया गया है)। यह काम करता है, बस बहुत धीमा है।

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

उत्तर

4

मैं Xsd2Code इस तरह से एक बहुत का उपयोग करें, लेकिन मेरे दृष्टिकोण एक पूर्व निर्माण घटना है जो Xsd2Code कमांड लाइन कॉल करता है और प्रत्येक निर्माण पर एक्सएमएल पुन: बनाता है जोड़ने के लिए है ..

मेरे पूर्व निर्माण घटना की तरह दिखता है इस:

$(ProjectDir)BuildTools\Xsd2Code.exe $(ProjectDir)Api\Schemas\MySchema.xsd MyProject.Api.Schemas $(ProjectDir)Api\Schemas\MySchema.cs /platform Net40 /collection Array /sc+ /ap+ /if- /xa+ 

आपके मामले में आप केवल मास्टर XSD पर इस पूर्व-निर्माण कदम चला सकते हैं (जो मैं XSD अनुमान लगा रहा हूँ: अन्य स्कीमा आयात), या आप अपने स्कीमा में से प्रत्येक पर आदेश चला सकता है फाइलें व्यक्तिगत रूप से। इस के लिए

लाभ यह है कि, अगर मैं XSD स्कीमा बदलने के लिए, मैं बहुत ही उपयोगी संकलन समय त्रुटियों :)

आशा है कि आप कुछ विचार देता है मिलता है!

संपादित

मैं कुछ समय बिताया मुद्दा आप समय का निर्माण के बारे में हाइलाइट किए गए के बारे में सोच और इतने की तरह पूर्व निर्माण स्क्रिप्ट को संशोधित:

$(ProjectDir)BuildTools\Xsd2Code.exe $(ProjectDir)Api\Schemas\MySchema.xsd MyProject.Api.Schemas $(ProjectDir)Api\Schemas\MySchema.cs.temp /platform Net40 /collection Array /sc+ /ap+ /if- /xa+ 

fc $(ProjectDir)Api\Schemas\MySchema.cs $(ProjectDir)Api\Schemas\MySchema.cs.temp 

if errorlevel 1 copy $(ProjectDir)Api\Schemas\MySchema.cs.temp $(ProjectDir)Api\Schemas\MySchema.cs /Y 

del $(ProjectDir)Api\Schemas\MySchema.cs.temp 

तो Xsd2Code अब में स्रोत कोड पैदा कर रहा है एक अस्थायी फ़ाइल, जो मौजूदा .cs फ़ाइल को केवल ओवरराइट कर रही है यदि यह अलग है। यह मतलब यह होना चाहिए कि अगर .xsd बिल्कुल नहीं बदला है, न तो होगा उत्पन्न .cs :)

तुम अब भी xsd2code चलाने का हिट ले जा रहे हैं, लेकिन आप MSBuild की हिट नहीं ले जा रहे हैं प्रोजेक्ट की एक पूरी श्रृंखला का पुनर्निर्माण यदि उत्पन्न स्रोत समान था ..

+0

सुझाव के लिए धन्यवाद। दुर्भाग्यवश, इस समय हम इसे करते हैं, और यह बहुत धीमा है।समस्या यह है कि प्रत्येक बिल्ड Xsd2Code पर, चलाएगा, लेकिन कई अन्य परियोजनाएं इस परियोजना पर स्कीमा के साथ निर्भर करती हैं, लेकिन वे सभी भी फिर से संकलित हो जाएंगे, भले ही कुछ भी नहीं बदला हो। यही कारण है कि यदि स्कीमा बदलता है तो मैं केवल कोड फ़ाइलों को उत्पन्न करने के लिए कस्टम टूल दृष्टिकोण देख रहा हूं। हालांकि अन्य परिदृश्यों में, मुझे लगता है कि आपके द्वारा विस्तारित दृष्टिकोण एक अच्छा है। –

+0

ओह कठिन एक। पहली बात जो दिमाग में आती है वह xsd2code चरण को छोड़ रहा है जब xsd फ़ाइल अपरिवर्तित है। इसमें थोड़ी अधिक जटिल पूर्व-निर्माण बैच स्क्रिप्ट शामिल हो सकती है, संभवतः xsd फ़ाइल का हैश उत्पन्न करना और इसे पहले से संग्रहीत हैश से तुलना करना। लेकिन मैं अभी अनुमान लगा रहा हूं :) – MattDavey

+0

@RobLevine संपादित करें – MattDavey

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

  • कोई संबंधित समस्या नहीं^_^