2009-09-02 14 views
14

के साथ गुणों को ओवरराइट करें मैं अपनी एमएसबील्ड फ़ाइल में तीन गुणों को घोषित करना चाहता हूं और एक संपत्ति को दूसरे के मूल्य (जिसे लक्ष्य कहा जा रहा है) के साथ ओवरराइट करना चाहता हूं, लेकिन यह नहीं पता कि यह कैसे किया जाए। मैं संपत्ति की स्थापना तदनुसार मूल्य है फिर से घोषित करने के लिए कोशिश कर रहा हूँ, लेकिन यह काम नहीं कर रहाMSBuild

<PropertyGroup> 
    <DeployPath_TEST>\\test-server-path\websites\mysite</DeployPath_TEST> 
    <DeployPath_LIVE>\\live-server-path\websites\mysite</DeployPath_LIVE> 
    <DeployPath></DeployPath> 
</PropertyGroup> 

<Target Name="Deploy-TEST"> 
    <PropertyGroup> 
     <DeployPath>$(DeployPath_TEST)</DeployPath> 
    </PropertyGroup> 
    <CallTarget Targets="Deploy-Sub"/> 
</Target> 

<Target Name="Deploy-LIVE"> 
    <PropertyGroup> 
     <DeployPath>$(DeployPath_TEST)</DeployPath> 
    </PropertyGroup> 
    <CallTarget Targets="Deploy-Sub"/> 
</Target> 

<Target Name="Deploy-Sub"> 
    <Message Text="Deploying to $(DeployPath)"/> 
    <MSBuild Projects="MySolution.csproj" Targets="Rebuild" /> 

    <ItemGroup> 
    <MyFiles Include="**\*"/> 
    </ItemGroup> 

    <Copy SourceFiles="@(MyFiles)" 
     DestinationFiles="@(MyFiles->'$(DeploymentPath)\%(RecursiveDir)%(FileName)%(Extension)')"/> 

</Target> 

फिलहाल: मेरा निर्माण फ़ाइल कुछ इस तरह लग रहा है।

उत्तर

13

Mehmet कैसे एक और संपत्ति से एक संपत्ति के मूल्य निर्धारित करने के लिए के बारे में सही है, लेकिन वहां MSBuild में एक बग/सुविधा जिसका मतलब है कि यदि आप एक ही लक्ष्य में CreateProperty और CallTarget कहते हैं, अपने नए संपत्ति नहीं होगा है (described here) अन्य लक्ष्यों के लिए विश्व स्तर पर उपलब्ध हो।

<PropertyGroup> 
    <DeployPath_TEST>\\test-server-path\websites\mysite</DeployPath_TEST> 
    <DeployPath_LIVE>\\live-server-path\websites\mysite</DeployPath_LIVE> 
    <DeployPath></DeployPath> 
</PropertyGroup> 

<Target Name="SetDeployPath-TEST"> 
    <CreateProperty Value="$(DeployPath_TEST)"> 
    <Output TaskParameter="Value" PropertyName="DeployPath"/> 
    </CreateProperty> 
</Target> 

<Target Name="Deploy-TEST"> 
    <CallTarget Targets="SetDeployPath-TEST"/> 
    <CallTarget Targets="Deploy-Sub"/> 
</Target> 

<Target Name="Deploy-Sub"> 
    <Message Text="Deploying to $(DeployPath)"/> 
    <MSBuild Projects="MySolution.csproj" Targets="Rebuild" /> 

    <ItemGroup> 
    <MyFiles Include="**\*"/> 
    </ItemGroup> 

    <Copy SourceFiles="@(MyFiles)" 
    DestinationFiles="@(MyFiles->'$(DeploymentPath)\%(RecursiveDir)%(FileName)%(Extension)')"/> 

</Target> 
+0

धन्यवाद, वह उपयोगी था। मैं अभी भी बैचिंग के लिए कुछ नया हूं और एमएस मेरी राय में संबंधित अवधारणाओं को समझाते हुए एक अच्छी नौकरी नहीं करता है। एक और नोट मैं वास्तव में एक वैश्विक संपत्ति के निर्माण के बिना दूर हो गया; जो संदर्भ को थोड़ा सा बताता है, इसलिए कोड को पढ़ना आसान होता है: लक्ष्य ए कॉल लक्ष्य बी और सी बी एक सूची संपत्ति सेट करता है और सी उस संपत्ति के मूल्य पर बैचिंग करता है। चूंकि mdresser ने एक ही लक्ष्य में संपत्ति को स्थापित करने पर ध्यान दिया, काम नहीं किया। उम्मीद है कि यह किसी की मदद करता है; इस पोस्ट को पाने से पहले मैंने इसे समझने की कोशिश में 3-4 घंटे बिताए हैं। – AlexeiOst

+0

एक और बिंदु, आप कहते हैं कि आपको अधिसूचना मिलती है कि केवल बिल्ली बदल गई है, क्या आपने परिवर्तनों को सहेजने की कोशिश की है? क्या यह काम करता है? (मुझे शक है) –

8

आप मौजूदा संपत्ति के मूल्य को ओवरराइट करने के लिए CreateProperty कार्य का उपयोग कर सकते हैं।

<Target Name="Deploy-LIVE"> 
    <CreateProperty Value="$(DeployPath_LIVE)"> 
    <Output PropertyName="DeployPath" TaskParameter="Value"/> 
    </CreateProperty> 
    <CallTarget Targets="Deploy-Sub"/> 
</Target> 
+0

यह मेरे लिए काम करने के लिए प्रतीत नहीं होता। मैं CreateProperty ब्लॉक के तुरंत बाद DeployPath प्रॉपर्टी के मान का उपयोग कर सकता हूं, लेकिन यह तैनाती-उप लक्ष्य के भीतर इसका मान खो देता है। –

+2

हा, इस आलेख को http://weblogs.asp.net/bhouse/archive/2006/03/20/440648.aspx CreateProperty कार्य के साथ एक बग/फीचर का वर्णन करता है। –

+0

दिलचस्प मुझे इस बग के बारे में पता नहीं था। मैंने पहले CreateProperty का उपयोग किया था, लेकिन स्पष्ट रूप से उस ओवरराइट की गई संपत्ति को एक्सेस करने के लिए कुछ भी आवश्यक नहीं था जो इसे ओवरराइट करता है। धन्यवाद। –

4

मैं आम तौर पर CallTarget काम से बचने:

तो यहाँ समस्या का अंतिम समाधान है। लक्ष्य निर्भरताओं का उपयोग करना बहुत बेहतर है।

+0

क्या आप थोड़ा विस्तार कर सकते हैं? यह आपके लिए बेहतर क्यों है? इस बग की वजह से –

+2

@ हायोमोकुत्सबाच http://sedodream.com/PermaLink ,guid,dd6cb1db-c0e4-47f7-ad84-6e59ff6b03d0.aspx और मुझे लगता है कि कॉलटाइटल मानसिक मॉडल के खिलाफ कैसे जाता है, इस बारे में msbuild का उपयोग कैसे किया जाना चाहिए। एमएसबिल्ड घोषणात्मक है, कॉलटाइटल बहुत जरूरी है। इसके साथ ही कुछ मामलों में इसकी आवश्यकता होती है, लेकिन आपको कॉलटाइटल से पहले निर्भर करना चाहिए। –

+0

धन्यवाद! मैं सहमत हूं और ऐसा लगता है कि एमएसबिल्ड टीम आयातित परियोजनाओं में विश्व स्तर पर सेट करने के लिए संपत्तियों को सक्षम करने के लिए भी निर्भर करता है। –

0

इसके अलावा, आप जिस तरह से निम्न का उपयोग कर सकते हैं:

<PropertyGroup> 
    <DeployPath_TEST>\\test-server-path\websites\mysite</DeployPath_TEST> 
    <DeployPath_LIVE>\\live-server-path\websites\mysite</DeployPath_LIVE> 
    <DeployPath></DeployPath> 
</PropertyGroup> 

<Target Name="SetDeployPath-TEST"> 
    <CreateProperty Value="$(DeployPath_TEST)"> 
    <Output TaskParameter="Value" PropertyName="DeployPath"/> 
    </CreateProperty> 
</Target> 

<Target Name="Deploy-Sub" DependsOnTargets="SetDeployPath-TEST"> 
    <Message Text="Deploying to $(DeployPath)"/> 
    <MSBuild Projects="MySolution.csproj" Targets="Rebuild" /> 

    <ItemGroup> 
    <MyFiles Include="**\*"/> 
    </ItemGroup> 

    <Copy SourceFiles="@(MyFiles)" 
    DestinationFiles="@(MyFiles->'$(DeploymentPath)\%(RecursiveDir)%(FileName)%(Extension)')"/> 

</Target>