মিসবিল্ড ব্যবহার করে সমস্ত ফাইল এবং ফোল্ডার অনুলিপি করুন


94

আমি ভাবতে চাইছি যে কেউ আমাকে লেখার চেষ্টা করছি এমন কিছু এমসবিল্ড স্ক্রিপ্টগুলি আমাকে সহায়তা করতে পারে কিনা। আমি যা করতে চাই তা হ'ল এমএসবিল্ড ব্যবহার করে একটি ফোল্ডার থেকে সমস্ত ফোল্ডার এবং সাব ফোল্ডারগুলি অন্য ফোল্ডারে অনুলিপি করা।

{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>

বিল্ড স্ক্রিপ্টটি চলতে থাকে তবে কোনও ফাইল বা ফোল্ডার অনুলিপি করে না।

ধন্যবাদ

উত্তর:


136

আমি এটিতেও সাহায্য খুঁজছিলাম। এটি আমাকে কিছুটা সময় নিয়েছিল, তবে আমি এখানে যা করেছি তা সত্যিই ভালভাবে কাজ করেছে।

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

এটি পুনরাবৃত্তভাবে নামযুক্ত ফোল্ডারের বিষয়বস্তু অনুলিপি antlrcsকরে $(TargetDir)


4
হ্যাঁ, এটি সেরা উত্তর। একই MSDN এখানে সুপারিশ হিসাবে ব্লগ: blogs.msdn.com/b/msbuild/archive/2005/11/07/490068.aspx
কার্স্টেন

18
কৌশলটি মনে হচ্ছে %(RecursiveDir)গন্তব্য ফোল্ডারে যুক্ত করা ডিরেক্টরি কাঠামোটিকে পুনরায় তৈরি করবে। অন্যথায় আউটপুট সমতল হয়। এটি সেরা উত্তর।
জেবি। মনিকার সাথে।

4
.Fsproj ফাইলের নীচে স্থাপন করা দরকার , বা এটি নেয় না।
হেনরিক

আমার জন্য যে মূল মুহূর্তটি এখানে কাজ করেছিল তা হ'ল আফটার বিল্ড লক্ষ্যমাত্রার অধীনে চলক ঘোষণাপত্র ( <এএনটিএলআর অন্তর্ভুক্ত = ".. \ ডেটা \ অ্যান্ট্রিলিকস ***। *" /> ) চলছে। আমার ক্ষেত্রে এটি বাহ্যিক স্কোপে ঘোষণা করা হয়েছিল এবং কার্যকর হয়নি।
Shpand

এটি দুর্দান্ত ধারণা! আমি খুঁজে পেয়েছি %(RecursiveDir)মধ্যে MSBuild সুপরিচিত আইটেমটি মেটাডেটা : docs.microsoft.com/en-us/visualstudio/msbuild/...
kenjiuno

72

আমি মনে করি যে সমস্যাটি আপনি কীভাবে আপনার আইটেমগ্রুপ তৈরি করছেন এবং অনুলিপি টাস্কে কল করছেন তাতে। দেখুন কি এটি উপলব্ধি করে:

<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>

CreateItemকাজ হ্রাস করা হয়। regex বিকল্প আছে। msdn.microsoft.com/en-us/library/s2y3e43x.aspx
রায় চেং

35

আমি এমএসবাইল্ডের কাছে নতুন কিন্তু আমি এএসসিইসি টাস্ককে এ জাতীয় পরিস্থিতির জন্য কার্যকর বলে মনে করি। আমি আমার প্রকল্পে একই চ্যালেঞ্জটি পেয়েছি এবং এটি আমার পক্ষে কাজ করেছে এবং অনেক সহজ ছিল। কেউ দয়া করে আমাকে জানান যদি এটি একটি ভাল অনুশীলন না হয়।

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

9
আমি অন্যভাবে রাস্তাটি জিজ্ঞাসা করতে সাহস করি। লগ ফিলিং এমএসবিল্ড কপি টাস্কটি ব্যবহার করার কোনও কারণ আছে কি?
bernd_k

4
সম্ভাব্যভাবে। আপনার যদি বিল্ড ফার্ম (জেনকিনস, টিমসিটি ইত্যাদি) থাকে তবে এজেন্ট পরিষেবাটি অন্য কোনও অ্যাকাউন্টের অধীনে চলতে পারে যার পথে এক্সকপি নেই। আপনি% উইন্ডির% \ system32 এর মতো জিনিসগুলিতে চেষ্টা করতে পারেন তবে এটি কিছু সময় কার্যকর হয় না।
অ্যান্ড্রু dh

এটাই আমার পক্ষে কাজ করে এমন সমাধান। এছাড়াও আমার ওয়ার্কিং ডিরেক্টরীটি সেট করার দরকার নেই।
এজেসবিস

এফওয়াইআই, ফাইল / ফোল্ডার ওভাররাইড প্রম্পটটি দমন করতে আমার / y যুক্ত করতে হবে। এছাড়াও যদি $ (ডিপোয়েন্টি ডিরেক্টরী) কোনও ফোল্ডার হয় তবে পথের পরে "\" রেখে প্রম্পটটি সরিয়ে ফেলবে: "গন্তব্য ফোল্ডার বা ফাইল?"
হোং লং

6
আমি জানি যে এই সমস্যাটি প্রায়শই সামনে আসে না তবে Copyকমান্ডের পরিবর্তে টাস্কটি ব্যবহার করার আমার প্রধান কারণটি হল সামঞ্জস্য। আমি এর আগে মনো ব্যবহার করে লিনাক্স তৈরি করেছি এবং স্পষ্টতই xcopyসেখানে কাজ করে না।
গ্রেগরোস

13
<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>

\**\*.*সমস্ত ফোল্ডার থেকে ফাইল পেতে সহায়তা করুন। পুনরাবৃত্তির সাহায্যে সমস্ত ফাইলকে সংশ্লিষ্ট ফোল্ডারে রাখতে সহায়তা করুন ...


4
গন্তব্য ফাইলগুলি 1 টি আইটেম এবং উত্স ফাইলগুলি 33 আইটেমকে বোঝায়। তাদের অবশ্যই একই সংখ্যক আইটেম থাকতে হবে। উঘ .. ম্যাসবিল্ড দুর্দান্ত হতে পারে, তবে কখনও কখনও কখনও কখনও এ জাতীয় দুর্বল ডকুমেন্টেড টুকরা।
মাফিন ম্যান

CreateItemকাজ হ্রাস করা হয়। regex বিকল্প আছে। msdn.microsoft.com/en-us/library/s2y3e43x.aspx
রায় চেং

4

আপনি এর পরিবর্তে কংক্রিট গন্তব্য ডিরেক্টরি নির্দিষ্ট করার চেষ্টা করেছেন?

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

আমি উন্নত এমএসবিল্ড সিনট্যাক্সের সাথে খুব দক্ষ নই, তবে

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

আমার কাছে অদ্ভুত লাগছে স্ক্রিপ্ট, ভাল দেখায় তো সমস্যাটা মান হতে পারে $(ApplicationDirectory)এবং$(OutputPath)

সম্পাদনা:

এখানে একটি ব্লগ পোস্ট যা কার্যকর হতে পারে:

কীভাবে: টাস্কটি ব্যবহার করে পুনরাবৃত্তভাবে ফাইলগুলি অনুলিপি করুন


4
লিঙ্কটির জন্য +1, যা zXen থেকে গৃহীত উত্তরটি আরও সংক্ষিপ্ত।
bernd_k

3

এটি উদাহরণস্বরূপ যা কাজ করেছে:

<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


2

এটি আমার নিজের প্রকল্পে ব্যবহৃত অনুলিপি টাস্ক, এটি আমার পক্ষে নিখুঁতভাবে কাজ করছে যা সাব ফোল্ডারগুলির সাথে ফোল্ডারটি সফলভাবে গন্তব্যে অনুলিপি করে:

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

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

আমার ক্ষেত্রে আমি কোনও প্রকল্পের প্রকাশিত ফোল্ডারটিকে অন্য গন্তব্য ফোল্ডারে অনুলিপি করেছি, আমার কাছে মনে হয় এটি আপনার ক্ষেত্রে সমতুল্য।



0

এমএসবাইল্ড ব্যবহার করে এক ডিরেক্টরি থেকে অন্য ডিরেক্টরিতে পুনরাবৃত্তভাবে ফাইলগুলি অনুলিপি করার সর্বোত্তম উপায় হ'ল পরামিতি হিসাবে সোর্সফায়ালস এবং গন্তব্যস্থান ফাইলগুলি সহ অনুলিপি করা টাস্কটি ব্যবহার করা। উদাহরণস্বরূপ - বিল্ড ডিরেক্টরি থেকে ব্যাক আপ ডিরেক্টরিতে সমস্ত ফাইল অনুলিপি করা হবে

<PropertyGroup>
<BuildDirectory Condition="'$(BuildDirectory)' == ''">Build</BuildDirectory>
<BackupDirectory Condition="'$(BackupDiretory)' == ''">Backup</BackupDirectory>
</PropertyGroup>

<ItemGroup>
<AllFiles Include="$(MSBuildProjectDirectory)/$(BuildDirectory)/**/*.*" />
</ItemGroup>

<Target Name="Backup">
<Exec Command="if not exist $(BackupDirectory) md $(BackupDirectory)" />
<Copy SourceFiles="@(AllFiles)" DestinationFiles="@(AllFiles-> 
'$(MSBuildProjectDirectory)/$(BackupDirectory)/%(RecursiveDir)/%(Filename)% 
(Extension)')" />
</Target>

এখন উপরের কপি কমান্ডে সমস্ত উত্স ডিরেক্টরিগুলি ট্র্যাভার্স করা হয়েছে এবং ফাইলগুলি গন্তব্য ডিরেক্টরিতে অনুলিপি করা হয়েছে।


0

আপনি যদি সাধারণ সি ++ টুলচেনের সাথে কাজ করে থাকেন তবে যাওয়ার অন্য একটি উপায় হ'ল আপনার ফাইলগুলিকে স্ট্যান্ডার্ড কপিরাইট ফাইলফোল্ডার তালিকায় যুক্ত করা is

<ItemGroup>
  <CopyFileToFolders Include="materials\**\*">
    <DestinationFolders>$(MainOutputDirectory)\Resources\materials\%(RecursiveDir)</DestinationFolders>
  </CopyFileToFolders>
</ItemGroup>

সহজ হওয়া ছাড়াও, এটি যাওয়ার একটি দুর্দান্ত উপায় কারণ কপি ফাইলস টোফোল্ডার টাস্কটি উপযুক্ত ইনপুট, আউটপুট এবং এমনকি টিএলওগ ফাইল তৈরি করবে তাই নিশ্চিত করে নিন যে অনুলিপি অপারেশন কেবল তখনই চালিত হবে যখন কোনও ইনপুট ফাইল বদলেছে বা আউটপুট ফাইলগুলির একটি অনুপস্থিত রয়েছে। টিএলএগের সাথে, ভিজ্যুয়াল স্টুডিওও প্রকল্পটিকে "আপ টু ডেট" হিসাবে সঠিকভাবে স্বীকৃতি দেবে (এটি এর জন্য পৃথক ইউ 2 ডিচেক প্রক্রিয়া ব্যবহার করে)।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.