আউটপুট ডিরেক্টরিতে অনুলিপি ফোল্ডার কাঠামো অনুলিপি করে তবে কেবল ফাইলগুলি অনুলিপি করতে চান


87

আমার একটি VS2008 আছে আমি একটি ডিরেক্টরি থেকে আমার /bin/ফোল্ডারে নির্দিষ্ট ফাইলগুলি অনুলিপি করতে চাই । আমি /common/browserhawk/"আউটপুট ডিরেক্টরিতে অনুলিপি করুন" তে ফাইলগুলি (অবস্থিত ) সেট করেছি । তবে এটি ফোল্ডারের কাঠামোটিও অনুলিপি করে: ফাইলগুলিতে অনুলিপি করা হয়/bin/common/browserhawk/

আমি কীভাবে এই ফাইলগুলি অনুলিপি করতে পারি /bin/? এগুলি সঠিকভাবে অনুলিপি করতে ওয়েবসাইটের মূলে সংরক্ষণ করতে চাই না।

সম্পর্কিত প্রশ্ন: ভিজ্যুয়াল স্টুডিও সংকলনের পরে প্রকল্পে .dll এবং .pdb যুক্ত করে

উত্তর:


59

ফাইলগুলি অনুলিপি করতে আপনি একটি পোস্ট বিল্ড ইভেন্ট যুক্ত করতে পারেন।
প্রকল্পের বৈশিষ্ট্যগুলিতে যান, ইভেন্টস ট্যাবে যান এবং পোস্ট-বিল্ড ইভেন্ট ইভেন্ট কমান্ড লাইনে নিম্নলিখিতটি যুক্ত করুন:

copy "$(ProjectDir)\common\browserhawk\*.*" "$(TargetDir)"

আপনার প্রকল্পের পাথের মধ্যে ফাঁকা স্থান থাকলে কোটগুলি অন্তর্ভুক্ত করার বিষয়ে নিশ্চিত হন।


সেই পরামর্শের জন্য ধন্যবাদ, কারণ এটি আমার পক্ষে ঠিক ভিএস ২০১২ তেও কাজ করেছে।
ডিবি

4
আমি আমার ক্ষেত্রে এটিকে কিছুটা সংশোধন করেছি:xcopy /s /d /y "$(ProjectDir)\stuff" "$(TargetDir)\stuff"
ড্যানি স্ট্যাপল

44

যেহেতু আমি পূর্ববর্তী উত্তরগুলিতে মন্তব্য করতে পারি না, আমি সমাধানটি এখানে রাখব:

@ পল অ্যালেক্সান্ডার যা সরবরাহ করেছে তাতে যুক্ত করে, আপনার .csproj / .vbproj ফাইলে নিম্নলিখিতটি যুক্ত করুন:

<ItemGroup>
    <AvailableItemName Include="RootContent">
      <Visible>false</Visible>
    </AvailableItemName>  
</ItemGroup>
<Target Name="AfterBuild">
    <Copy
        DestinationFolder="$(OutputPath)"
        SourceFiles="@(RootContent)"
        SkipUnchangedFiles="true"
        />  
</Target>

এটি আপনাকে সম্পত্তি উইন্ডোতে বিল্ড অ্যাকশন হিসাবে "রুট কনটেন্ট" নির্বাচন করতে দেয় এবং জিইউআইয়ের মাধ্যমে সমস্ত অ্যাক্সেস করতে পারে। আরও সম্পূর্ণ ব্যাখ্যা: "উপলভ্য আইটেমনেম" বিকল্পটি মূলত একটি নতুন নাম-তালিকা তৈরি করে যা আপনি প্রোপার্টি উইন্ডোতে "বিল্ড অ্যাকশন" বৈশিষ্ট্যের অধীনে প্রকল্পে আইটেমগুলি বরাদ্দ করতে পারেন। তারপরে আপনি নিজের পছন্দ মতো যে কোনও টার্গেটে (যেমন "@ (রুটকন্টেন্ট)") এর মাধ্যমে এই নতুন তৈরি তালিকাটি ব্যবহার করতে পারেন।


উত্তম উত্তর, সাফল্যের জন্য নিজেকে এটি ব্যবহার করেছি!
ক্রিস মেরিসিক

এছাড়াও মনে রাখবেন যে ভিএস 2010 (পুরানো সংস্করণ সম্পর্কে নিশ্চিত নয়) AvailableItemNameআপনি যদি ভিএসের মধ্যে প্রকল্পের ফাইলটি সম্পাদনা করেন তবে একটি অবৈধ উপাদান হিসাবে অভিযোগ করবে ; কেবল সতর্কতা উপেক্ষা করুন, এটি যাইহোক কাজ করে।
অ্যারোনআট

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

4
এটি vs2008 দিয়ে রিলিজ এবং ডিবাগ মোডে বিল্ডিংয়ের জন্য দুর্দান্ত কাজ করে তবে একটি ক্লিক প্রকাশনা ব্যবহার করার সময় এটি কাজ করে বলে মনে হয় না। কোনও পরামর্শ?
সোয়েনহে

4
Vs2015 এ আমার জন্য কাজ করেনি। লক্ষ্যটিকে কিছুটা পুনর্লিখন দ্বারা স্থির করা হয়েছে: <Target Name="RootOutputCopyTarget" AfterTargets="Build">... </ টার্গেট>
লরন্ড

44

আপনি যদি একটি টেক্সট সম্পাদকে .csproj / .vbproj সম্পাদনা করেন তবে আউটপুট ডিরেক্টরিতে ফাইলটি কোথায় রাখা হয়েছে এবং আউটপুট ডিরেক্টরিতে ফাইলটির কী নাম থাকবে তাও আপনি নিয়ন্ত্রণ করতে পারেন। উদাহরণ স্বরূপ:

<None Include="content\someContent.txt">
  <Link>someContentInOutputDirectory.txt</Link>
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>

এটি ফাইলটি content\someContent.txt.োকাবে bin\someContentInOutputDirectory.txt। আপনি চাইলে একটি উপ-ডিরেক্টরিও চয়ন binকরতে পারেন; কেবল এটিকে লিঙ্ক উপাদানটিতে যুক্ত করুন।


4
বাহ, দু'দিন আগে নয়, এখন আমার এটাই দরকার ছিল বলে আমি ভাগ্যবান ছিলাম। ধন্যবাদ; এটা অসাধারণ!
আশেরা

4
ওহে আল্লাহ, তোমাকে ধন্যবাদ। আমি মাত্র 6 ঘন্টা কিছু কর্নার-কেস আবর্জনা ঠিক করতে চেষ্টা করেছি যেখানে ভিএস কপি করছিল না। ডেল এর বুদ্ধিমান উপায়ে। এটিই জীবন, মহাবিশ্ব এবং সমস্ত কিছুর আসল উত্তর।
ব্র্যান্ডন

4
এটি এখন পর্যন্ত সর্বোত্তম সমাধান
ফিল এইচডি

4
আমি একবার এটি করেছি এবং ভিজ্যুয়াল স্টুডিওতে এই প্রকল্পটি পুনরায় লোড করেছি সেক্ষেত্রে সমাধান এক্সপ্লোরার থেকে নির্ভরতা ফাইলগুলি অদৃশ্য হয়ে গেছে যেন প্রকল্পে অন্তর্ভুক্ত থাকে না। তবে এটি এখনও প্রত্যাশা অনুযায়ী তৈরি করে এবং আকাউন্টে অনুলিপি করে। একটি পরিশ্রম হিসাবে আমি বর্তমানে প্রতিটি ফাইল দুবার যুক্ত করছি; একবার কোনও ক্রিয়া ছাড়াই এবং একবার 'অনুলিপিতে অনুলিপি' সেট করুন।
etteliette

4
এটি এই ট্যাগের উদ্দেশ্যে ব্যবহার নয়। ভিএস ২০১৩-তে, প্রকল্পটি লোড করার সময় এটি একটি সতর্কতা ছুঁড়ে দেয় এবং প্রকল্পটি ডিরেক্টরি হিসাবে যুক্ত হওয়ায় ফাইলটি প্রকল্পে যুক্ত হিসাবে দৃশ্যমান হয় না।
jpmc26

15

আমি বিশ্বাস করি XCOPY কমান্ড ডিরেক্টরি এবং ফাইলগুলি আরও ভালভাবে পরিচালনা করে। অতএব,

    XCOPY "$(ProjectDir)common/browserhawk" "$(TargetDir)" /E /I /F /Y

যা লক্ষ্য ডিরেক্টরি থেকে ফোল্ডার তৈরি করার অনুমতি দেয়।

    XCOPY "$(ProjectDir)Templates" "$(TargetDir)" /E /I /F /Y

এর প্রকল্প ফোল্ডার / ফাইল কাঠামো:

    A:\TEMP\CONSOLEAPPLICATION3\TEMPLATES
    ├───NewFolder1
    ├───NewFolder2
    │       TextFile1.txt
    │       TextFile2.txt
    └───NewFolder3
            TextFile1.txt
            TextFile2.txt
            TextFile3.txt

হয়ে:

    A:\TEMP\CONSOLEAPPLICATION3\BIN\DEBUG
    │   ConsoleApplication3.exe
    │   ConsoleApplication3.pdb
    │   ConsoleApplication3.vshost.exe
    │   ConsoleApplication3.vshost.exe.manifest
    ├───NewFolder1
    ├───NewFolder2
    │       TextFile1.txt
    │       TextFile2.txt
    │
    └───NewFolder3
            TextFile1.txt
            TextFile2.txt
            TextFile3.txt

/Dওভাররাইটিং সম্ভাব্য পরিবর্তনগুলি এড়াতে খুব কার্যকর হতে পারে।
কুর্জেডমেটাল

10

আপনার .csproj / .vbproj ফাইলে নিম্নলিখিতটি যুক্ত করুন

<Target Name="AfterBuild">
    <Copy
        DestinationFolder="$(OutputPath)"
        SourceFiles="@(RootContent)"
        SkipUnchangedFiles="true"
        />  
</Target>

এরপরে রুট ফোল্ডারে আপনার যে কোনও ফাইলের বিল্ড অ্যাকশনটি রুটকন্টে পরিবর্তন করুন।


কথোপকথনের মাধ্যমে নয় ... তবে আপনি আপনার প্রকল্পটি ভিএস-তে সম্পাদনা করতে পারবেন প্রকল্পটিতে ডান ক্লিক করুন এবং আনলোড প্রকল্পটি নির্বাচন করুন। তারপরে ডান ক্লিক করুন এবং সম্পাদনা নির্বাচন করুন। তারপরে আপনি এমএসবিল্ড ফাইলটি আপনার প্রকল্প হিসাবে সম্পাদনা করতে পারবেন।
পল আলেকজান্ডার

4
ধন্যবাদ, এটি দরকারী মনে হচ্ছে। দুর্ভাগ্যক্রমে, আপনার স্নিপেটটি .vbproj ফাইলে যোগ করার পরেও, RootContent"বিল্ড অ্যাকশন" ড্রপডাউন তালিকায় প্রদর্শিত হবে না এবং ম্যানুয়ালি এটি প্রবেশ করাতে ভিজ্যুয়াল স্টুডিওর "সম্পত্তি মানটি বৈধ নয়" এর ফলস্বরূপ। আমি কি থেকে বাতিল হলাম?
হেইনজি

ভিজ্যুয়াল স্টুডিও 2010 সি # কনসোল অ্যাপ্লিকেশন প্রকল্পের সাথে কাজ করছে না।
এএমিসিকো

ভিজ্যুয়াল স্টুডিও 2010 ভিবি.এনইটি কনসোল অ্যাপ্লিকেশন প্রকল্পের সাথে কাজ করছে না।
এমিসিকো

ভিজ্যুয়াল স্টুডিও 2008 সি # কনসোল অ্যাপ্লিকেশন প্রকল্পের সাথে কাজ করছে না।
এএমিসিকো

5

আমি এটি VS2010, VS2015, VS2017, এবং VS2019 এ ব্যবহার করেছি। আমি এই সমাধানটি পছন্দ করি কারণ:

  1. এক্সএমএল কোনও প্রকল্পে পুনরায় ব্যবহারযোগ্য
  2. "রুট কনটেন্ট" অন্যান্য "সামগ্রী" এর মতোই ভিজ্যুয়াল স্টুডিও ইউআইতে বিল্ড অ্যাকশন হিসাবে বেছে নেওয়া হয়েছে
  3. "কপিরাইটআউটপুট ডিরেক্টরি" হ'ল, যেমনটি আপনি আশা করেছিলেন
  4. প্রকল্পের আউটপুটটিতে রুট কনটেন্ট যুক্ত করা হয়: প্রকল্প-রেফারেন্সগুলির মাধ্যমে বাহিত হয়, "ক্লিন" মানেন, ইত্যাদি through
  5. পুনরাবৃত্তি ফোল্ডার কাঠামো সংরক্ষণ করে একটি ওয়াইল্ডকার্ডের সাহায্যে রুটকন্টটি নির্দিষ্ট করা যেতে পারে:
<RootContent Include="common\browserhawk\**">
  <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</RootContent>

প্রকল্প ফাইলের শুরুতে:

  <ItemGroup>
    <AvailableItemName Include="RootContent">
      <!-- Add "RootContent" as a choice in the "Build Action" dropdown. -->
      <Visible>True</Visible>
    </AvailableItemName>
  </ItemGroup>

এই উত্তর থেকে ধার করা

মাইক্রোসফ্ট .targets আমদানি পরে:

  <PropertyGroup>
    <AssignTargetPathsDependsOn>
      $(AssignTargetPathsDependsOn);
      IncludeRootContentAsContent;
    </AssignTargetPathsDependsOn>
  </PropertyGroup>
  <Target Name="IncludeRootContentAsContent">
    <CreateItem Include="@(RootContent)" AdditionalMetadata="TargetPath=%(RecursiveDir)%(Filename)%(Extension)">
      <Output ItemName="ContentWithTargetPath" TaskParameter="Include" />
    </CreateItem>
  </Target>

এই উত্তর থেকে ধার করা


এটি ভাল - আমি এই প্রকল্পটিতে আমরা যুক্ত করছি এমন বিশেষ বিষয়বস্তু RootContentযা তা বোঝাতে "হার্ড কোডড" বোঝায় তা আমি বদলে নেব CustomContentএবং আমাদের এই বিশেষ উপায়ে অনুলিপি করা দরকার। পাশাপাশি TargetPath=%(RecursiveDir)%(Filename)%(Extension)অন্যদিকে , আমাকে ফোল্ডারের কাঠামোটি নির্দিষ্ট CustomContentফাইলগুলি থেকে আউটপুট পথে পুনরায় তৈরি করতে হবে।
জোনো

@ জন্নো লক্ষ্য হ'ল পুনরাবৃত্তির নির্দেশিকা নির্বিশেষে ফাইলগুলি গুলি সরাসরি আউটপুট ডিরেক্টরিতে অনুলিপি করা। অন্তর্নির্মিত "সামগ্রী" বিল্ড অ্যাকশন ইতিমধ্যে আমাদের পুনরাবৃত্তির নির্দেশিকা বজায় রেখে অনুলিপি করার একটি ব্যবস্থা সরবরাহ করে।
ম্যাটগার্গ

আমি কিছুক্ষণের মধ্যে এটি পরীক্ষা করার সুযোগ পাইনি, তবে ওপি যেমন বলেছে তেমন "কনটেন্ট" বিল্ড অ্যাকশন কারণের ফাইলগুলিকে /common/browserhawk/অনুলিপি করা যাবে না /bin/common/browserhawk/? আইআইআরসি, আমার উদ্দেশ্য ছিল /common/browserhawk/a.txtশেষ পর্যন্ত হওয়া উচিত /bin/a.txtতবে সেখান থেকে পুনরাবৃত্তির অনুমতি দেওয়া উচিত, তাই /common/browserhawk/secret/stuff.pngশেষ পর্যন্ত /bin/secret/stuff.png
জনো

@ জন্নো ওকে, হ্যাঁ, এটি এখন পুরোপুরি বোঝায়। আমি উত্তর অন্তর্ভুক্ত আপডেট %(RecursiveDirectory)। এটি সত্যিই দুর্দান্ত, কারণ আইডিইতে পৃথক ফাইল নির্বাচন করা ছাড়াও, আপনি ওয়াইল্ডকার্ড সহ একাধিক ফাইলও নির্দিষ্ট করতে পারেন। **ওয়াইল্ডকার্ড ব্যবহার করার সময় পুরো ফোল্ডার কাঠামো সংরক্ষণ করা হবে।
ম্যাটগার্গ

4
এত বড় উত্তরের জন্য অনেক ধন্যবাদ! আমি মনে করি নিম্নলিখিতগুলির কারণে এই উত্তরটি সঠিক উত্তর: ১. কোনও বাহ্যিক সেন্টিমিডি নেই ২. ক্রস প্ল্যাটফর্ম
জর্জ আনিসিমভ

2

আমি সফল প্রশংসা করার পরে অনুলিপি বিল্ড ফাইলটি অনুলিপি করতে একটি পদক্ষেপ যুক্ত করে শেষ করেছি

<target name="action.copy.browserhawk.config" depends="compile.source">
    <copy todir="${App.Web.dir}/bin/" includeemptydirs="false">
        <fileset basedir="${browserhawk.config.dir}">
            <include name="bhawk_bb.dat" />
            <include name="bhawk_sp.dat" />
            <include name="browserhawk.properties" />
            <include name="maindefs.bdd" />
            <include name="maindefs.bdf" />
            <include name="BH_PRO.lic" />
        </fileset>
    </copy>
    <echo message="COPY BROWSERHAWK CONFIG: SUCCESS   ${datetime::now()}" />
</target>

4
+1 কারণ কারও পক্ষে ন্যান্ট ব্যবহার করা এটি এখনও একটি সহায়ক উত্তর
ক্রিস হেইনেস

1

ফাইলগুলি অনুলিপি করতে এবং পোস্ট-বিল্ড ইভেন্ট হিসাবে এটি কার্যকর করতে আপনি একটি ব্যাচ ফাইল তৈরি করতে পারেন।


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