2008-09-23 14 views
68

का उपयोग कर सभी फ़ाइलों और फ़ोल्डरों की प्रतिलिपि बनाएँ बस सोच रहा है कि कोई मुझे कुछ एमएसबिल्ड स्क्रिप्ट्स के साथ मदद कर सकता है जिसे मैं लिखने की कोशिश कर रहा हूं। मैं क्या करना चाहता हूं msbuild का उपयोग कर किसी फ़ोल्डर से सभी फ़ाइलों और उप फ़ोल्डरों को कॉपी करें।msbuild

{ProjectName} 
     |----->Source 
     |----->Tools 
       |----->Viewer 
         |-----{about 5 sub dirs} 

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

<ItemGroup> 
<Viewer Include="..\$(ApplicationDirectory)\Tools\viewer\**\*.*" /> 
</ItemGroup> 

<Target Name="BeforeBuild"> 
     <Copy SourceFiles="@(Viewer)" DestinationFolder="@(Viewer->'$(OutputPath)\\Tools')" /> 
    </Target> 

निर्माण स्क्रिप्ट लेकिन चलाता फ़ाइल या फ़ोल्डर का कोई भी नकल नहीं है।

धन्यवाद

उत्तर

3

क्या आप मुझे उन्नत MSBuild वाक्य रचना के साथ बहुत कुशल नहीं हूँ

DestinationFolder="@(Viewer->'$(OutputPath)\\Tools')" ? 

के बजाय ठोस गंतव्य निर्देशिका निर्दिष्ट करने के लिए प्रयास करते हैं, लेकिन

@(Viewer->'$(OutputPath)\\Tools') 

मुझे अजीब लग रहा है। स्क्रिप्ट, अच्छा लग रहा है तो समस्या $(ApplicationDirectory) के मूल्यों में हो सकता है और हो सकता है $(OutputPath)

संपादित करें:

How To: Recursively Copy Files Using the Task

+1

लिंक है, जो अधिक संक्षिप्त है कि zXen से स्वीकार किए जाते हैं जवाब है के लिए +1। –

+1

+1 लिंक के लिए, THX .. रास्ता आसान – crabCRUSHERclamCOLLECTOR

67

मुझे लगता है कि समस्या हो सकती है:

यहाँ एक ब्लॉग पोस्ट को उपयोगी हो सकता है है आप अपना आइटम समूह कैसे बना रहे हैं और कॉपी कार्य को कॉल कर रहे हैं।

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5"> 
    <PropertyGroup> 
     <YourDestinationDirectory>..\SomeDestinationDirectory</YourDestinationDirectory> 
     <YourSourceDirectory>..\SomeSourceDirectory</YourSourceDirectory> 
    </PropertyGroup> 

    <Target Name="BeforeBuild"> 
     <CreateItem Include="$(YourSourceDirectory)\**\*.*"> 
      <Output TaskParameter="Include" ItemName="YourFilesToCopy" /> 
     </CreateItem> 

     <Copy SourceFiles="@(YourFilesToCopy)" 
       DestinationFiles="@(YourFilesToCopy->'$(YourDestinationDirectory)\%(RecursiveDir)%(Filename)%(Extension)')" /> 
    </Target> 
</Project> 
+0

'CreateItem' कार्य मान्य नहीं है। Regex विकल्प है। https://msdn.microsoft.com/en-us/library/s2y3e43x.aspx –

+0

यह VS2015, धन्यवाद के साथ पूरी तरह से काम किया। – mecek

35

मैं थोड़े MSBuild करने के लिए नए कर रहा हूँ, लेकिन मैं इस तरह की स्थिति के लिए EXEC टास्क आसान लगता है: अगर यह समझ में आता है देखें। मैं अपनी परियोजना में एक ही चुनौती में आया और यह मेरे लिए काम किया और बहुत आसान था। अगर कोई अच्छा अभ्यास नहीं है तो कृपया मुझे बताएं।

<Target Name="CopyToDeployFolder" DependsOnTargets="CompileWebSite"> 
    <Exec Command="xcopy.exe $(OutputDirectory) $(DeploymentDirectory) /e" WorkingDirectory="C:\Windows\" /> 
</Target> 
+7

मैं इस सवाल को दूसरे तरीके से पूछने की हिम्मत करता हूं। क्या एमएसबिल्ड कॉपी कार्य भरने के लॉग का उपयोग करने का कोई कारण है? –

+4

संभावित रूप से। यदि आपके पास एक बिल्ड फार्म (जेनकींस, टीमसिटी इत्यादि) है, तो एजेंट सेवा एक अलग खाते के तहत चल सकती है जिसमें पथ में एक्सकॉपी नहीं है। आप रास्ते में% windir% \ system32 जैसी चीजों को आजमा सकते हैं, लेकिन यह कुछ बार काम नहीं करता है। –

+0

यही वह समाधान है जो मेरे लिए काम करता है। इसके अलावा मुझे वर्किंग डायरेक्टरी सेट करने की आवश्यकता नहीं थी। – Aebsubis

1

CopyFolder की व्यक्तिगत तौर पर मैं बना दिया है उपयोग जो एसडीसी कार्य लाइब्रेरी का हिस्सा है।

http://sdctasks.codeplex.com/

9
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5"> 
    <PropertyGroup> 
     <YourDestinationDirectory>..\SomeDestinationDirectory</YourDestinationDirectory> 
     <YourSourceDirectory>..\SomeSourceDirectory</YourSourceDirectory> 
    </PropertyGroup> 

    <Target Name="BeforeBuild"> 
     <CreateItem Include="$(YourSourceDirectory)\**\*.*"> 
      <Output TaskParameter="Include" ItemName="YourFilesToCopy" /> 
     </CreateItem> 

     <Copy SourceFiles="@(YourFilesToCopy)" 
       DestinationFiles="$(YourFilesToCopy)\%(RecursiveDir)" /> 
    </Target> 
</Project> 

\**\*.* मदद सभी फ़ोल्डर से फ़ाइलों को प्राप्त करने के लिए। रिकर्सिव डीआईआर सभी फाइल को संबंधित फ़ोल्डर में रखने में मदद करता है ...

+2

गंतव्य फ़ाइलें 1 वस्तुओं और sourcefiles को संदर्भित करता है 33 आइटम को दर्शाता है। उनके पास समान संख्या में आइटम होना चाहिए। उह .. msbuild भयानक हो सकता है, लेकिन कभी-कभी इस तरह के एक खराब दस्तावेज टुकड़े। –

+0

'CreateItem' कार्य को बहिष्कृत किया गया है। Regex विकल्प है। https://msdn.microsoft.com/en-us/library/s2y3e43x.aspx –

80

मैं भी इस पर सहायता खोज रहा था। मुझे थोड़ी देर लग गई, लेकिन मैंने ऐसा किया जो वास्तव में अच्छा काम करता था।

<Target Name="AfterBuild"> 
    <ItemGroup> 
     <ANTLR Include="..\Data\antlrcs\**\*.*" /> 
    </ItemGroup> 
    <Copy SourceFiles="@(ANTLR)" DestinationFolder="$(TargetDir)\%(RecursiveDir)" SkipUnchangedFiles="true" /> 
</Target> 

यह रिकर्सिवली $(TargetDir) को antlrcs नामित फ़ोल्डर की सामग्री की नकल की।

+4

हां, यह सबसे अच्छा जवाब है। MSDN ब्लॉग पर यहाँ की सिफारिश के रूप में ही: http://blogs.msdn.com/b/msbuild/archive/2005/11/07/490068.aspx – Karsten

+2

ठीक काम करता है - धन्यवाद! मुझे आश्चर्य है कि क्यों और अधिक जटिल उत्तरों में अधिक अपवर्तक हैं ?! – Ivan

+9

चाल यह प्रतीत होता है कि गंतव्य फ़ोल्डर में '% (रिकर्सिव डीआईआर)' जोड़ना निर्देशिका संरचना को फिर से बनाएगा। अन्यथा आउटपुट फ्लैट है। यह सबसे अच्छा जवाब है। –

2

यह उदाहरण है कि काम किया है:

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

    <ItemGroup> 
     <MySourceFiles Include="c:\MySourceTree\**\*.*"/> 
    </ItemGroup> 

    <Target Name="CopyFiles"> 
     <Copy 
     SourceFiles="@(MySourceFiles)" 
     DestinationFiles="@(MySourceFiles->'c:\MyDestinationTree\%(RecursiveDir)%(Filename)%(Extension)')" 
     /> 
    </Target> 

</Project> 

स्रोत: https://msdn.microsoft.com/en-us/library/3e54c37h.aspx

0

यह प्रतिलिपि काम मैं अपने प्रोजेक्ट में प्रयोग किया जाता है, यह मेरे लिए पूरी तरह से काम कर रहा था कि गंतव्य के लिए उप फ़ोल्डर्स के साथ प्रतियां फ़ोल्डर सफलतापूर्वक:

<ItemGroup > 
<MyProjectSource Include="$(OutputRoot)/MySource/**/*.*" /> 
</ItemGroup> 

<Target Name="AfterCopy" AfterTargets="WebPublish"> 
<Copy SourceFiles="@(MyProjectSource)" 
OverwriteReadOnlyFiles="true" DestinationFolder="$(PublishFolder)api/% (RecursiveDir)"/> 

मेरे मामले में मैंने किसी प्रोजेक्ट के प्रकाशित फ़ोल्डर को किसी अन्य गंतव्य फ़ोल्डर में कॉपी किया, मुझे लगता है कि यह आपके मामले से समान है।

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

  • कोई संबंधित समस्या नहीं^_^