2011-02-07 6 views
20

प्रोजेक्ट फ़ाइल में मैं अपने खुद के लक्ष्य फ़ाइल आयातकैसे दृश्य स्टूडियो में निर्माण परिभाषाओं की कैशिंग बंद करने के लिए

<Import Project="Build\CopyDependencies.target" /> 

और बाद में मुझे लगता है कि लक्ष्य फ़ाइल

<CallTarget Targets="CopyDependencies" UseResultsCache="false" /> 

से लक्ष्य फोन अगर मैं CopyDependencies संपादित । लक्ष्य फ़ाइल मुझे पूरे समाधान को फिर से लोड करना होगा और केवल तब CopyDependencies में परिवर्तन करना होगा। लक्ष्य प्रभावी करें। मेरा मानना ​​है कि यह विजुअल स्टूडियो में कैशिंग की कुछ तरह की बिल्ड परिभाषा है? यदि ऐसा है, तो शायद इसे बंद कर दिया जा सकता है?

उत्तर

13

धन्यवाद @KazR

यहाँ एक छोटे समाधान है कि आप अपने .csproj फ़ाइल

<Target Name="AfterBuild"> 
    <PropertyGroup> 
    <TempProjectFile>Build.$([System.Guid]::NewGuid()).proj</TempProjectFile> 
    </PropertyGroup> 
    <Copy SourceFiles="Build.proj" DestinationFiles="$(TempProjectFile)" /> 
    <MSBuild Projects="$(TempProjectFile)" /> 
    <ItemGroup> 
    <TempProjectFiles Include="Build.????????-????-????-????-????????????.proj"/> 
    </ItemGroup> 
    <Delete Files="@(TempProjectFiles)" /> 
</Target> 

समस्या हल

+1

ग्रेट सॉल्यूशन! [मुझे] के लिए काम किया (http://stackoverflow.com/q/9227641/684399) – CitizenInsane

+2

एक उचित कामकाज की तरह लगता है। एमएसबिल्ड 4 के लिए एफवाईआई आप CreateProperty के बजाय लक्ष्य के अंदर PropertyGroup का उपयोग कर सकते हैं। –

+0

टिप के लिए धन्यवाद, मैंने इसे बदल दिया ... बहुत अच्छा लगता है – Martin

8

मुझे नहीं पता कि आप वीएस कैश को कैसे अक्षम करेंगे, हालांकि मेरे पास एक वर्कअराउंड हो सकता है जो आपको समाधान को फिर से लोड किए बिना निर्माण लक्ष्य को संपादित करने की अनुमति देगा।

आप अपनी प्रोज फ़ाइल में एमएसबिल्ड कार्य का उपयोग एक रैपर लक्ष्य को कॉल करने के लिए कर सकते हैं जो आपकी प्रतिलिपि निर्भरता.target फ़ाइल को प्रतिलिपि पर निर्भर करता है। [RandomNumber]। लक्ष्य, फिर नई प्रतिलिपि बनाई गई फ़ाइल में अपनी प्रतिलिपि निर्भरता लक्ष्य को आमंत्रित करता है, और अंत में इसे हटा देता है ।

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

myProject.proj

AfterBuild लक्ष्य को यह करें:: - निर्माण पर

<MSBuild Projects="Wrapper.target" Targets="MyWrappedTarget" UnloadProjectsOnCompletion="true"/> 

Wrapper.target

यहाँ हम लक्ष्य है कि होगा है

यहाँ एक उदाहरण है समय - असली लक्ष्य फ़ाइल की प्रतिलिपि बनाएँ और इसके भीतर वांछित निर्माण लक्ष्य का आह्वान करें (मैंने एक इनलाइन सी # कार्य का उपयोग किया है जो केवल एमएसबिल्ड 4.0 में उपलब्ध है):

<UsingTask TaskName="RandomNumber" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll"> 
    <ParameterGroup> 
     <Number ParameterType="System.Int32" Output="true"/> 
    </ParameterGroup> 
    <Task> 
     <Code Type="Fragment" Language="cs"> 
     <!-- CDATA --> 
     Random rndGenerator = new Random(); 
     Number = rndGenerator.Next(Int32.MaxValue); 
     <!-- CDATA --> 
     </Code> 
    </Task> 
</UsingTask> 

<Target Name="MyWrappedTarget"> 
    <Message Text="MyWrappedTarget target called"/> 


    <RandomNumber> 
     <Output TaskParameter="Number" PropertyName="FileNumber"/> 
    </RandomNumber> 

    <PropertyGroup> 
     <CopiedTarget>inner.test.$(FileNumber).target</CopiedTarget> 
    </PropertyGroup> 

    <Copy SourceFiles="inner.test.target" DestinationFiles="$(CopiedTarget)"/> 

    <MSBuild Projects="$(CopiedTarget)" Targets="_innerTestTarget"/> 

    <Delete Files="$(CopiedTarget)"/> 
</Target> 

inner.test.target

यह वास्तविक निर्माण लक्ष्य आप पर अमल करना चाहते हैं, इस उदाहरण में यह एक साधारण फ़ाइल प्रतिलिपि है।

<Target Name="_innerTestTarget"> 

    <Message Text="This is a inner test text message"/> 
    <Copy SourceFiles="x.txt" DestinationFiles="x1.txt"/> 
</Target> 

यह उत्पादन तैयार नहीं है, लेकिन उम्मीद है कि मेरे बिंदु को दिखाता है।

इस (थोड़ी सी गठित) प्रक्रिया के साथ, आप आंतरिक.test.target फ़ाइल को VS में समाधान को फिर से लोड किए बिना बदल सकते हैं।

+0

क्या पागल वैकल्पिक हल में! आप, महोदय, एक बुरा प्रतिभा है। –

3

मैं एक अलग समाधान है, अस्थायी फ़ाइलों को शामिल नहीं में सम्मिलित कर सकते है:

शामिल करें।लक्ष्य फ़ाइल:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 

    <Target Name="Foobar"> 
     <Copy SourceFiles="test.source" DestinationFiles="testFoobar.dest" /> 
    </Target> 

</Project> 

परियोजना फ़ाइल:

.... 
<Target Name="BeforeBuild"> 
    <Exec Command="$(MSBuildToolsPath)\MSBuild.exe Include.targets /t:Foobar" ContinueOnError="false" /> 
</Target> 
.... 

इस मामले में वी.एस. MSBuild आदेश को नहीं पहचानता है, और फ़ाइल को कैश नहीं है।

खुश कोडिंग!

+2

मुझे उद्धरण चिह्नों की भी आवश्यकता है: '' – Cel

3

यहां एक समाधान है जिसके लिए किसी भी एमएसबील्ड स्क्रिप्टिंग की आवश्यकता नहीं है।

मैंने देखा कि एक परियोजना को उतारना और पुनः लोड करना कैश के आसपास नहीं मिलता है, लेकिन समाधान को बंद करना और फिर से खोलना है। इसके अतिरिक्त, विजुअल स्टूडियो आपको समाधान को फिर से लोड करने के लिए संकेत देगा यदि यह नोटिस करता है कि .sln फ़ाइल बदल गई है। और अंत में, this superuser question बताता है कि विंडोज़ में किसी फ़ाइल को कैसे स्पर्श करें।

इन्हें एक साथ रखकर, मैंने वर्तमान समाधान फ़ाइल को स्पर्श करने के लिए एक विजुअल स्टूडियो बाहरी टूल जोड़ा।

  1. टूल> बाहरी उपकरण ...
  2. एक नया उपकरण जोड़ने के लिए जोड़ें बटन क्लिक करें: यहाँ कैसे।
  3. सेट गुण इस प्रकार है:
    • शीर्षक: पुनः लोड समाधान
    • कमान: cmd.exe
    • तर्क:/सी प्रतिलिपि "$ (SolutionFileName)" +> nul
    • प्रारंभिक निर्देशिका: $ (SolutionDir)
    • और बाहरी उपकरण विंडो को बंद करने
  4. ठीक क्लिक करें पर उपयोग आउटपुट खिड़की बारी
  5. +०१२३५१६४१०६

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

मैं विंडोज 7 64-बिट और विंडोज डेस्कटॉप के लिए विजुअल स्टूडियो 2012 एक्सप्रेस का उपयोग कर रहा हूं।

0

MSBuild को चलाने से पहले मैं इस डाउनलोड कैश को साफ़ करने के लिए चलाएँ:

call "%VS120COMNTOOLS%vsvars32.bat" 
echo Clear download cache 
gacutil -cdl 
+0

जीएसी और कैश स्टोर असेंबली डाउनलोड करें, लेकिन एमएसबिल्ड फाइलें, जहां तक ​​मुझे पता है। – weir

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