पहले नहीं है कि अपने वाक्य रचना कार्यों लागू करने के लिए सही नहीं है, यह अवश्य होना चाहिए कि:
%(Reference.HintPath.IndexOf(...)) # Note: not supported by MSBuild
हालांकि, MSBuild में संपत्ति कार्यों not allowed आइटम मेटाडाटा पर कर रहे हैं, ताकि मदद करने के लिए नहीं जा रहा है आप या तो।
एक अलग लक्ष्य का आह्वान करके आप इसके आसपास क्या काम कर सकते हैं, जिसे मूल रूप से प्रत्येक आइटम के लिए बुलाया जाता है।
<Target Name="CheckProjectReferences">
<MSBuild
Projects="$(MSBuildProjectFullPath)"
Properties="Identity=%(Reference.Identity);HintPath=%(Reference.HintPath)"
Targets="_Warn"/>
</Target>
<Target Name="_Warn">
<Warning Text="Reference $(Identity) should be a project reference. HintPath: $(HintPath)"
Condition="$(HintPath.IndexOf('bin\debug')) != -1"/>
</Target>
सच कहूं, मुझे लगता है कि अगर सब कुछ "उल्लंघन" को पकड़ने के लिए पर्याप्त है यकीन नहीं है। उदाहरण के लिए, उपरोक्त केवल bin\debug
के लिए काम करेगा, लेकिन bin\Debug
या अन्य मिश्रित-आधारित विविधताओं के लिए नहीं, जो कार्यात्मक रूप से समकक्ष हैं। साथ ही उन्हें देखने के लिए, आपको, IndexOf(string, StringComparison)
अधिभार कॉल करने के लिए आवश्यकता होगी लेकिन अभी कर रही:
$(HintPath.IndexOf('bin\debug', System.StringComparison.OrdinalIgnoreCase))
काम नहीं करेगा, क्योंकि MSBuild अधिभार संकल्प IndexOf(char, Int32)
लेने और आपको यह त्रुटि दे देंगे:
MSB4184: The expression ""bin\debug".IndexOf(bin\debug, System.StringComparison.OrdinalIgnoreCase)" cannot be evaluated. String must be exactly one character long.
तुम भी 012 के लिए जाँच करने के लिए आवश्यकता हो सकती है
$(HintPath.IndexOf('bin\debug', 0, 9, System.StringComparison.OrdinalIgnoreCase))
:
तो, आप IndexOf(String, Int32, Int32, StringComparison)
अधिभार सीधे का उपयोग करके इसे समझाने के लिए की आवश्यकता होगीया अन्य विविधताएं। मुझे यकीन नहीं है कि संदर्भ का पता लगाने का यह सबसे अच्छा तरीका एक परियोजना संदर्भ होना चाहिए, लेकिन यदि आप जानते हैं (और एक निश्चित विस्तार नियंत्रण) आपके पर्यावरण को संभव हो सकता है।
+1: मैं आइटम मेटाडेटा से एक संपत्ति प्राप्त करने में था, कि मुझे यह स्पष्ट चीज़ नहीं दिखाई दे रही थी। असल में, आपकी विशिष्ट आवश्यकता को देखते हुए, यह बहुत बेहतर दिखता है। –
मेरे लिए काम करता है। काश मैं केस-असंवेदनशील लुकअप कर सकता हूं - इंडेक्सऑफ ('\ bin \ $ (कॉन्फ़िगरेशन)', स्ट्रिंग कॉम्परिसन। ऑर्डिनल इग्नोरकेस) - लेकिन एमएसबिल्ड ओवरलोड के साथ फ़ंक्शंस का आह्वान करने में सक्षम नहीं प्रतीत होता है। – Jonathan
+1 जब मैं गलत तरीके से इस मुद्दे को हल करने की कोशिश कर रहा था, मैंने इस विचार के बारे में सोचा, लेकिन एहसास नहीं हुआ, स्ट्रिंग ऑब्जेक्ट को तुरंत कैसे चालू करें (वास्तव में, मैं सी # में बहुत धाराप्रवाह नहीं हूं)। समाधान के लिए धन्यवाद। –