2010-10-16 19 views
7

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

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

उत्तर

2

this answer के रूप में ही होना चाहिए, का उपयोग कर TargetOutputs parameter ::

<MSBuild Projects="File.sln" > 
    <Output TaskParameter="TargetOutputs" ItemName="AssembliesBuiltByChildProjects" /> 
</MSBuild> 
<Message Text="Assemblies built: @(AssembliesBuiltByChildProjects)" /> <!-- just for debug --> 
<CallTarget Targets="SignExe" Condition="'@(AssembliesBuiltByChildProjects)'!=''" /> 
+0

मुझे लगता है कि यह एक अलग दृष्टिकोण है - मैं यह समझने की कोशिश कर रहा हूं कि एक परियोजना फ़ाइल के संदर्भ में यह कैसे करें। नियमित परियोजना के लिएcsproj - एक एमएसबिल्ड परियोजना फ़ाइल नहीं बना रहा जो समाधान को लक्षित करता है –

0

तुम बस ऐसा कर सकते हैं: क्योंकि किसी माइक्रोसॉफ्ट पर स्मार्ट अंत में निम्न पंक्ति जोड़ा

<PropertyGroup> 
    <TargetsTriggeredByCompilation>DoStuffWithNewlyCompiledAssembly</TargetsTriggeredByCompilation> 
</PropertyGroup> 

यह काम करता है CoreCompileMicrosoft.[CSharp|VisualBasic][.Core].targets में लक्ष्य (फ़ाइल का नाम भाषा और एमएसबिल्ड/विजुअल स्टूडियो संस्करण पर निर्भर करता है)।

<CallTarget Targets="$(TargetsTriggeredByCompilation)" Condition="'$(TargetsTriggeredByCompilation)' != ''"/> 

तो अगर आप TargetsTriggeredByCompilation संपत्ति में लक्ष्य नाम निर्दिष्ट, अपने लक्ष्य है, तो CoreCompile runs-- चलेंगे और अगर CoreCompile को छोड़ दिया है अपने लक्ष्य नहीं चलेंगे (जैसे क्योंकि उत्पादन विधानसभा पहले से ही अप-हैं- है कोड के संबंध में तारीख)।

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

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