2015-01-16 5 views
6

पर पहले लक्ष्यीकरण = "बिल्ड" का उपयोग करते समय लक्ष्य नहीं चल रहा है मेरे पास एक कस्टम। लक्ष्य लक्ष्य फ़ाइल है जिसे मैं अपने सी # एमवीसी वेब एप्लिकेशन की प्रोजेक्ट फ़ाइल में आयात करता हूं। मैं तो इस तरह के कस्टम लक्ष्यों को जोड़ दिया है:बिल्ड सर्वर

<Target Name="CopyFiles" BeforeTargets="Build"></Target> 

यह ठीक काम करता है जब दृश्य स्टूडियो के तहत निर्माण, लेकिन जब मैं TeamCity का उपयोग यह निर्माण करने के लिए, लक्ष्य कभी नहीं चलाने हो जाता है, और मैं बाहर काम नहीं कर सकता क्यों ।

यदि मैं पहले लक्ष्य का उपयोग करने के लिए अपना लक्ष्य बदलता हूं = "संकलन" तो यह चलता है। मौजूदा लक्ष्य का निर्माण और इस प्रकार अपने आवेदन का निर्माण नहीं करता है या फिर, यदि मैं नाम के साथ एक अतिरिक्त लक्ष्य जोड़ने के लिए .targets फ़ाइल

<Target Name="Build" /> 

तो यह चलेंगे निर्माण, लेकिन ऐसा करने से ओवरराइड करता है। मैं इस पर तर्क नहीं कर सकता - यह समझ में नहीं आता है। मैं अब के लिए संकलन लक्ष्य का उपयोग कर रहा हूं, लेकिन अगर कोई यह बता सकता है कि बिल्ड कार्य काम करने से पहले इसे निष्पादित करने का प्रयास क्यों कर रहा है, तो मैं वास्तव में इसकी सराहना करता हूं।

+0

क्या आपकी कस्टम लक्ष्य फ़ाइल टीमसिटी द्वारा उठाई जा रही है? क्या यह निश्चित रूप से आपको वीसीएस में जोड़ा गया है? – Castrohenge

+0

हां, और हां। जैसा कि बताया गया है, अगर मैं इसे पहले लक्ष्य का उपयोग करने के लिए बदलता हूं = "संकलित करें" तो यह चलता है। बिल्ड कार्य के साथ बस नहीं। –

उत्तर

8

'बिल्ड' एक विशेष अंतर्निहित लक्ष्य है, इसलिए वास्तव में अन्य अधिकांश लक्ष्यों के समान काम नहीं करता है। यह निश्चित रूप से सुरक्षित रूप से ओवरराइड नहीं किया जा सकता है।

सबसे प्रासंगिक दस्तावेज यहाँ है: https://msdn.microsoft.com/en-us/library/ms366724.aspx

आप, निर्माण से पहले चलाने के लिए कुछ मानक दृष्टिकोण (के रूप में टिप्पणी से अनुशंसा करते हैं एक नव निर्मित फ़ाइल .csproj) BeforeBuild लक्ष्य ओवरराइड करने के लिए है (चाहते हैं ऊपर दस्तावेज के रूप में)।

हालांकि, यह सबसे मजबूत समाधान नहीं है। जैसा कि ऊपर प्रलेखन में टिप्पणी की थी

अधिभावी पूर्वनिर्धारित लक्ष्य एक आसान तरीका निर्माण प्रक्रिया का विस्तार करने के एक और परियोजना है कि से अपनी परियोजना का आयात रोकने के लिए कोई रास्ता नहीं है क्योंकि MSBuild क्रमिक रूप से लक्ष्यों की परिभाषा का मूल्यांकन करता है, लेकिन, आपके द्वारा पहले से ओवरराइड किए गए लक्ष्यों को ओवरराइड करना।

यह बेहतर (और केवल थोड़ा और अधिक जटिल) है, BuildDependsOn संपत्ति को ओवरराइड और इस संपत्ति का डिफ़ॉल्ट मान का विस्तार लक्ष्य आप चलाना चाहते हैं को शामिल करने के लिए (यह भी ऊपर के लिंक में प्रलेखित है)।

एक और दृष्टिकोण पहले से खाली छोड़ने और BeforeTargets="BeforeBuild" का उपयोग करना होगा, जो थोड़ा अजीब लगता है लेकिन काफी सरल है और फिर भी काम करेगा यदि पहले सेउल्ड लक्ष्य ओवरराइड हो जाता है।

क्यों BeforeTargets="Build" काम नहीं करता है, मुझे दस्तावेज़ में इसके लिए कोई संदर्भ नहीं मिल रहा है, लेकिन मुझे लगता है कि यह अपनी विशेष प्रकृति के साथ है। यह सामान्य लक्ष्यों के समान काम नहीं करता है और शायद यह बेहतर है कि इसे लक्ष्य के रूप में न सोचें।

+5

यह गलत है, 'Build' को' Microsoft.Common.CurrentVersion.targets 'में परिभाषित किया गया है और किसी अन्य लक्ष्य की तरह व्यवहार करता है। 'पहले लक्ष्य = = "बनाएं" 'पूरी तरह मान्य है। मुद्दा यह है कि 'बिल्ड' लक्ष्य एक वास्तविक शरीर के साथ एक आभासी लक्ष्य है और हमेशा स्थिति के आधार पर नहीं कहा जाता है। विशिष्टता वीएस संस्करण और परियोजना प्रकार के आधार पर भिन्न होती है, खासकर वेब परियोजनाओं के साथ जो बहुत अधिक रूपों में आती हैं। यही कारण है कि 'पहले बिल्ड' को 'Micrsoft.Common.targets' के आधार पर सब कुछ के लिए एक गारंटीकृत विस्तार बिंदु के रूप में प्रदान किया जाता है। –

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