2012-07-17 31 views
5

मैं एक डब्ल्यूसीएफ सेवा लिख ​​रहा हूं जिसका उपयोग हमारी कंपनी के भीतर बड़े पैमाने पर किया जा रहा है, और मैं निर्माण प्रक्रिया के हिस्से के रूप में डब्ल्यूसीएफ क्लाइंट प्रॉक्सी उत्पन्न करना चाहता हूं और उन्हें पैकेज करना चाहता हूं एक असेंबली ताकि सेवा के ग्राहकों को इस प्रक्रिया को कई बार अपने अंत में दोहराना पड़े। क्या कोई तरीका है कि कोई इसे पूरा करने के बारे में जानता है? क्या MSBuild के लिए कोई पूर्व-मौजूदा निर्माण कार्य है?निर्माण प्रक्रिया के हिस्से के रूप में डब्ल्यूसीएफ प्रॉक्सी उत्पन्न करें

उत्तर

3

यहाँ के रूप में परियोजनाओं मैं क्या कर को समाप्त कर दिया गया है:

1) परियोजना है कि सेवा है जिसके लिए मैं ग्राहक कोड जनरेट करना चाहते है बनाएं

a) Takes the compiled WCF Service assembly, runs svcutil.exe on it to extract XSD and WSDL metadata for all the services in the Service assembly. 

b) Runs svcutil.exe again, this time on the extracted XSD and WSDL files to generate a .cs file containing the client 

c) Run csc.exe to compile the generated client code into a separate assembly. 

3) 'AfterBuild' लक्ष्य में MSBuild कार्य डालें: 2) एक MSBuild कार्य है जो निम्न करता बनाएं सेवा युक्त परियोजना का।

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

+0

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

+0

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

0

मैं किसी भी में निर्मित कार्यों के बारे में पता नहीं कर रहा हूँ, यह कैसे मैं यह कर:

एक परियोजना बनाएँ, svcutil के माध्यम से प्रॉक्सी वर्ग पैदा करते हैं और परियोजना में जोड़ें। एक MSBuild स्क्रिप्ट बनाएं जो (1) svcutil को कॉल करता है और उपरोक्त वर्ग को ओवरराइट करता है और (2) प्रोजेक्ट बनाता है।

क्या आप जो चाहते हैं उसे हासिल नहीं करेंगे?

-1

T4 templating को देखें, और इस तरह के T4Toolbox

-1

क्यों न केवल एक अलग, कक्षा पुस्तकालय परियोजना बनाएं। उस प्रोजेक्ट में, आपको आवश्यक सेवाओं में से प्रत्येक के लिए "सेवा संदर्भ जोड़ें" का उपयोग करें।

अन्य कोड क्लास लाइब्रेरी में कक्षाओं का उपयोग कर सकते हैं।

+1

पर उस nuget पैकेज को प्रकाशित करें क्योंकि यह अविश्वसनीय रूप से मैन्युअल है, और मुझे इसे बनाए रखना होगा एक परियोजना के रूप में।इस तरह, मैं क्लाइंट असेंबली स्वचालित रूप से जेनरेट कर सकता हूं, मुझे कभी भी कुछ भी बनाए रखना नहीं पड़ता है, और लोगों को कभी भी प्रोजेक्ट नहीं ढूंढना पड़ता है और इसे स्वयं संकलित नहीं करना पड़ता है, उनके पास पहले से ही असेंबली है, जो उपयोग करने के लिए तैयार है। –

+0

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

0

आपके द्वारा बनाए गए एमएसबिल्ड दृष्टिकोण बिल्कुल जो मैं प्राप्त करना चाहता हूं (वर्तमान में बैच फ़ाइल का उपयोग कर रहा हूं)। कृपया एमएसबिल्ड कार्य और एक्सएमएल स्निपेट पोस्ट/भेजें!

3

मैं एक ही समस्या को हल करने की कोशिश कर रहा था। यहाँ क्या खत्म हो गया है। .csproj में, AfterBuild लक्ष्य के तहत, एसडीके पथ लाने के लिए एक कार्य जोड़ें, और svcutil.exe चलाने के लिए Exec कमांड का उपयोग करें। मुझे & का उपयोग करना पड़ा; क्योंकि पथ में रिक्त स्थान हैं।

<Target Name="AfterBuild"> 
    <GetFrameworkSdkPath> 
     <Output TaskParameter="Path" PropertyName="SdkPath"/> 
    </GetFrameworkSdkPath> 
    <Exec Command="&quot;$(SdkPath)bin\NETFX 4.5.1 Tools\svcutil.exe&quot; $(TargetPath)"/> 
</Target> 

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

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