2009-08-26 18 views
9

मैं निम्नलिखित MSBuild स्क्रिप्ट है:उसी एमएसबिल्ड लक्ष्य को दो बार कैसे बुलाया जाए?

<?xml version="1.0" encoding="utf-8"?> 
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" 
     DefaultTargets="All"> 

    <PropertyGroup> 
    ... 
    </PropertyGroup> 

    <UsingTask AssemblyFile="$(GallioTaskPath)" TaskName="Gallio.MSBuildTasks.Gallio" /> 
    <Import Project="$(MSBuildCommunityTasksPath)\MSBuild.Community.Tasks.Targets" /> 

    <ItemGroup> 
    ... 
    </ItemGroup> 

    <Target Name="CheckServerHostsItemGroup" 
      Condition="'$(NoServerHosts)' != True"> 
    ... 
    </Target> 

    <Target Name="RunServerHosts" DependsOnTargets="CheckServerHostsItemGroup" 
      Condition="'$(NoServerHosts)' != True"> 
    ... 
    </Target> 

    <Target Name="KillServerHosts" DependsOnTargets="CheckServerHostsItemGroup" 
      Condition="'$(NoServerHosts)' != True"> 
    ... 
    </Target> 

    <Target Name="KillServerHosts2" 
      Condition="'$(NoServerHosts)' != True"> 
    <MSBuild Projects="$(MSBuildProjectFile)" Targets="KillServerHosts" Properties="Configuration=$(Configuration)" /> 
    </Target> 

    <Target Name="All" DependsOnTargets="Build;RunServerHosts;Test;KillServerHosts2"> 
    <OnError ExecuteTargets="KillServerHosts2" /> 
    </Target> 

    <Target Name="Test"> 
    ... 
    <Error Text="Tests execution failed with exit code $(ExitCode)" Condition="'$(ExitCode)' != 0" /> 
    </Target> 

    <Target Name="CheckSolutionsItemGroup"> 
    ... 
    </Target> 

    <Target Name="Build" DependsOnTargets="CheckSolutionsItemGroup;KillServerHosts"> 
    ... 
    </Target> 

    <Target Name="Clean" DependsOnTargets="CheckSolutionsItemGroup;KillServerHosts"> 
    ... 
    </Target> 

</Project> 

मैं स्थान बचाने के लिए लक्ष्य के शव को हटा दिया है और क्योंकि वे अप्रासंगिक हैं। हालांकि, अगर कोई सोचता है कि वे हैं, तो मैं उन्हें शामिल करूंगा। KillServerHosts, और एक अच्छे कारण के लिए जो मैं दो बार आह्वान करने के लिए इच्छा -

वैसे भी, के रूप में एक देख सकते हैं, वहाँ एक लक्ष्य है। बिल्ड करने से पहले, यह सुनिश्चित करने के लिए कि कोई असेंबली लॉक नहीं हो जाती है और परीक्षण के बाद दूसरी बार "तालिका को साफ करने" के लिए पूरा किया जाता है।

स्वाभाविक रूप से, लक्ष्य KillServerHosts आह्वान करने के लिए काम नहीं करता है की कोशिश कर दो बार, MSBuild एक ही लक्ष्य दो बार निर्माण करने के लिए मना कर दिया। तो, मैं KillServerHosts2 लक्ष्य का आह्वान करके धोखा देने की कोशिश कर रहा हूं। समस्या यह है कि कभी-कभी यह काम करता है और कभी-कभी ऐसा नहीं होता है।

अगर मैं कमांड लाइन से KillServerHosts लक्ष्य चलाने यह हमेशा प्रासंगिक सर्वर मेजबान को मारता है, तो इस संबंध से यह ठीक काम करता है।

कोई भी विचार?

उत्तर

22

डिज़ाइन द्वारा एमएसबिल्ड लक्ष्य एक से अधिक बार निष्पादित नहीं किए जाते हैं। आपको किसी विधि या फ़ंक्शन के रूप में MSBuild लक्ष्य के बारे में नहीं सोचना चाहिए, क्योंकि एमएसबिल्ड एक कार्यात्मक प्रोग्रामिंग भाषा नहीं है।

आप एक बार आप ऐसा करने के लिए MSBuild कार्य का उपयोग कर सकते की तुलना में अधिक लक्ष्य पर अमल करना चाहते हैं, बस गुण का एक अलग सेट में गुजरती हैं। इस तरह

<Target Name="SomeTarget"> 
    <MSBuild Projects="$(MSBuildProjectFile)" Targets="YourTarget" Properties="FakeProperty=one" /> 
    <MSBuild Projects="$(MSBuildProjectFile)" Targets="YourTarget" Properties="FakeProperty=two" /> 
</Target> 

नोट उदाहरण कुछ के लिए: मैं वास्तव में इस बाहर की कोशिश नहीं की तो वहाँ वाक्य रचना मुद्दों अगर मैं गलत वर्तनी या गलत तरीके से याद किया जा सकता है, लेकिन आप यह काम कर रहा प्राप्त करने में सक्षम होना चाहिए।

+0

विशेषता 'परियोजनाएं' होनी चाहिए, न कि 'परियोजना'। इस तरह आपका सुझाव पूरी तरह से काम करता है, धन्यवाद! –

+0

मैंने अभी इसे ठीक कर दिया है। –

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