প্রকল্প শঙ্কার বাইরে থাকা .csproj এ সামগ্রী ফাইলগুলি অন্তর্ভুক্ত


86

আমার কাছে একটি সি # প্রকল্প রয়েছে যা মাইপ্রজেক্ট.সিএসপিজেজে "সি: \ প্রকল্পসমূহ \ মাইপ্রজেক্ট \" এ অবস্থিত। আমার কাছে এমন ফাইলও রয়েছে যা আমি এই প্রকল্পের আউটপুট ডিরেক্টরিতে অনুলিপি করতে চাই। তবে, ফাইলগুলি "সি: \ মাই কনটেন্টফিলস \" অবস্থানে রয়েছে, অর্থাত্ সেগুলি প্রকল্প শঙ্কার মধ্যে নেই। এই ডিরেক্টরিতে পাশাপাশি উপ-ডিরেক্টরি রয়েছে। ডিরেক্টরি বিষয়বস্তু পরিচালনা করা হয় না। অতএব আমি এর অধীনে যা আছে তা অন্তর্ভুক্ত করতে হবে।

আমি যখন তাদের প্রকল্পের 'সামগ্রী' হিসাবে অন্তর্ভুক্ত করি তখন সেগুলি অনুলিপি করা হয় তবে ডিরেক্টরি কাঠামোটি হারিয়ে যায়। আমি এরকম কিছু করেছি: -

<Content Include="..\..\MyContentFiles\**">
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>

আমি কীভাবে এই ফাইলগুলি / ডিরেক্টরিগুলি অনিবার্যভাবে প্রজেক্টের আউটপুট ডিরেক্টরিতে অনুলিপি করে ডিরেক্টরি কাঠামোর সংরক্ষণে সংরক্ষণ করতে পারি?

উত্তর:


56

আপনাকে লিঙ্ক হিসাবে ফাইল যুক্ত করতে হবে:

  1. ভিএস-তে প্রকল্পে রাইট ক্লিক করুন
  2. যুক্ত করুন -> বিদ্যমান আইটেম ...
  3. ফাইলটি সন্ধান করুন।
  4. এটি নির্বাচন করুন এবং।
  5. যোগ একটি লিঙ্ক হিসাবে (ডায়ালগে যোগ বোতাম ড্রপ ডাউন)।
  6. ফাইলটির বৈশিষ্ট্যগুলি খুলুন এবং "সর্বদা অনুলিপি করুন" এ "আউটপুট ডিরেক্টরিতে অনুলিপি করুন" সেট করুন।

কিন্তু আপনি ডিরেক্টরি গাছের জন্য এটি করতে পারবেন না।
পরিবর্তে আপনার জন্য পোস্ট-বিল্ড টাস্ক লিখতে হবে। এটি এমন একটি নমুনা যা আপনাকে স্তব্ধ করে তুলবে।


8
এই উত্তরে যেমন বলা হয়েছে , "ডিরেক্টরি ডিরেক্টরিতে আপনি এটি করতে পারবেন না।" বিবৃতি সত্য নয়।
মান্দার্ক

164

আমি বিশ্বাস করি @ ডমিট্রি এটি একদিকে পেয়েছে - আপনি "লিঙ্ক" বৈশিষ্ট্যটি ব্যবহার করতে চান।

তবে, আপনি কেবল কোনও ডিরেক্টরি গাছের সাথে লিঙ্ক করতে পারবেন না বলে তিনি কেবল আংশিকভাবে সঠিক। ভিজুয়াল স্টুডিওর জিইউআই ব্যবহার করে লিঙ্কগুলি যুক্ত করার চেষ্টা করার সময় এটি সত্য হলেও, এমএসবাইল্ড এটি সমর্থন করে।

আপনি যদি ডিরেক্টরি কাঠামো সংরক্ষণ করতে চান, কেবল %(RecursiveDir)আপনার <link>নোডে ট্যাগ যুক্ত করুন :

<Content Include="..\..\MyContentFiles\**\*.*">
  <Link>%(RecursiveDir)%(Filename)%(Extension)</Link>
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>

এমএস বিল্ড সুপরিচিত আইটেম মেটাডেটা পৃষ্ঠাটি আপনি যে মেটাডেটা অ্যাক্সেস করতে পারবেন তার আরও বিশদে চলে গেছে।


4
1) ভাগ করা সম্পদ দোকান থেকে কোনও ফাইল মুছলে কী ঘটে? সলিউশন দির 2 থেকে এটি মুছে ফেলা হবে বলে মনে হচ্ছে না) রান সম্পূর্ণ হওয়ার পরে ভিজুয়াল স্টুডিওগুলি এই ফাইলগুলি $ (সমাধানডির) থেকে মুছে ফেলার কোনও উপায় আছে কি? এগুলি সেখানে রেখে অন্য দেবগণকে বিভ্রান্ত করতে পারে।
আদম

@ অ্যাডাম নীচে আমার উত্তর দেখুন
রবিন ভ্যান ডার Knaap

9
অল্প খাবার, জল নিয়ে মরুভূমিতে ক্র্যাশ হওয়ায় এবং সাহচর্যের প্রবল প্রয়োজন হওয়ায় আমি এই উত্তরটি সহায়ক বলে মনে করি। এই নির্দেশাবলী অনুসরণ করে, আমি একটি সম্পূর্ণ ক্রিয়ামূলক এআই তৈরি করতে সক্ষম হয়েছি যা এখন এমন সমস্ত মানুষের প্রয়োজনকে প্রতিস্থাপন করেছে যা একবার আমাকে এখানে প্রান্তরে ফেলেছিল। ধন্যবাদ মান্দার্ক!
গভীরতা

4
@ বিজয় আমার সম্পাদনাটি দেখুন, আপনার প্রয়োজন <Content Include="..\..\MyContentFiles\**\*.*">- \*.*পথের শেষে নোটটি নোট করুন ।
সিএডি ব্ল্যাক

4
VS2017 (15.8.6) এ .NET কোর প্রকল্পের জন্য কাজ করছেন না।
zwcloud

29

মান্দার্কের উত্তরটি সরাসরি সমাধানে সামগ্রী ফাইলগুলিকে যুক্ত করে এবং সেগুলি সমাধান এক্সপ্লোরারটিতে প্রদর্শিত হবে। যখনই কোনও ফাইল মূল ডিরেক্টরিতে যুক্ত বা মুছে ফেলা হয় তখন ভিজ্যুয়াল স্টুডিওগুলি স্বয়ংক্রিয়ভাবে এটি বাছাই করে না। এছাড়াও, যখনই কোনও ফাইল মুছে ফেলা হয় বা সমাধান এক্সপ্লোরারটিতে যুক্ত করা হয়, তখন প্রকল্পের ফাইলটি পরিবর্তন করা হয় এবং সমস্ত ফাইলগুলি কেবল ফোল্ডারটি অন্তর্ভুক্ত না করে আলাদাভাবে অন্তর্ভুক্ত করা হয়।

এটি প্রতিরোধ করতে, আপনি একই কৌশলটি ব্যবহার করতে পারেন তবে এটি একটি পৃথক প্রকল্পের ফাইলে রেখে তারপরে আমদানি করতে পারেন।

প্রকল্প ফাইলটি (উদাহরণস্বরূপ অন্তর্ভুক্ত.প্রজ) এর মতো দেখায়:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Content Include="..\..\MyContentFiles\**">
  <Link>%(RecursiveDir)%(Filename)%(Extension)</Link>
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
</Project>

আপনার নিজস্ব প্রকল্পের ফাইলে, নিম্নলিখিত লাইনটি যুক্ত করুন

<Import Project="include.proj" />

ভিজ্যুয়াল স্টুডিও এই ফাইলটির সাথে বিশৃঙ্খলা করবে না এবং একটি বিল্ড চলাকালীন কেবল ফাইলগুলিকে সামগ্রী হিসাবে যুক্ত করে। মূল ডিরেক্টরিতে পরিবর্তনগুলি সর্বদা অন্তর্ভুক্ত থাকে। ফাইলগুলি আপনার সমাধান এক্সপ্লোরারে প্রদর্শিত হবে না, তবে আউটপুট ডিরেক্টরিতে অন্তর্ভুক্ত হবে।

এই কৌশলটি এখানে তুলেছেন : http://blogs.msdn.com/b/shawnhar/archive/2007/06/06/wildcard-content-using-msbuild.aspx


4
কিছু কারণে, এটি আমার কাছে একটি .proj ফাইল ব্যবহার করে কাজ করে বলে মনে হচ্ছে না তবে আমি এটি একটি .csproj ফাইল দিয়ে কাজ করতে সক্ষম হয়েছি।
স্ট্রিপলিং ওয়ারিয়র

6
সমাধান এক্সপ্লোরারে আইটেমগুলি প্রদর্শিত করার জন্য আপনি বিষয়বস্তু উপাদানটিতে <দৃশ্যমান> সত্য </ দৃশ্যমান> যুক্ত করতে পারেন।
মাইকেল বেকার

আমার ঠিক ছিল .Proj
জেসন ডুফায়ার

এটি আমার পক্ষে মোটেও কার্যকর হয়নি এবং আমি ধরে নিচ্ছি কারণ এটি তৈরি হওয়া প্রাক-ইভেন্টে আইটেম-টু-লিঙ্ক হওয়া নিজেরাই তৈরি হয়েছিল।
পল কে

4
VS2017 (15.8.6) এ .NET কোর প্রকল্পের জন্য কাজ করছেন না।
zwcloud

11

নিম্নলিখিত, যা আপনি আপনার প্রকল্পের ফাইলের নীচে যুক্ত করবেন, আপনার বিল্ড ইভেন্টের $(TargetDirectory)(সাধারণত $(MSBuildProjectDirectory)\bin\Debug) টার্গেট ডিরেক্টরিতে বিল্ট ইভেন্টের পরে ডিরেক্টরি কাঠামো রক্ষণাবেক্ষণ করে আপনার সামগ্রী ফাইলগুলি অনুলিপি করবে ।

<ItemGroup>
    <ExtraContent Include="$(MSBuildProjectDirectory)\..\..\MyContentFiles\**" />
</ItemGroup>

<Target Name="AfterBuild">
    <Copy 
        SourceFiles="@(ExtraContent)" 
        DestinationFiles="@(ExtraContent->'$(TargetDir)\%(RecursiveDir)%(Filename)%(Extension)')" 
        SkipUnchangedFiles="true" />
</Target>

এই ফাইলগুলি মাইকন্টেন্টফাইলস নামে একটি ডিরেক্টরিতে যাওয়ার প্রয়োজন হলে আপনি অনুলিপি করার আগে এটি যুক্ত করতে পারেন:

<MakeDir Directories="$(TargetDir)\MyContentFiles" Condition=" !Exists('$(TargetDir\MyContentFiles') " />

এবং পরিবর্তন

<Copy 
            SourceFiles="@(ExtraContent)" 
            DestinationFiles="@(ExtraContent->'$(TargetDir)\%(RecursiveDir)%(Filename)%(Extension)')" 
            SkipUnchangedFiles="true" />

প্রতি

<Copy 
            SourceFiles="@(ExtraContent)" 
            DestinationFiles="@(ExtraContent->'$(TargetDir)\MyContentFiles\%(RecursiveDir)%(Filename)%(Extension)')" 
            SkipUnchangedFiles="true" />

4
আপনার রূপান্তরগুলিতে একটি টাইপ-ও রয়েছে: @ (এক্সট্রা কনটেন্ট) -> '...') @ (এক্সট্রাকন্টেক্সট -> '...') হওয়া উচিত। নাহলে ভাল উত্তর!
alexdej

@ টড 1) মাইকন্টেন্টফাইলস স্টোর থেকে কোনও ফাইল মুছে ফেলা হলে কী হবে? সলিউশন দির 2 থেকে এটি মুছে ফেলা হবে বলে মনে হচ্ছে না) রান সম্পূর্ণ হওয়ার পরে ভিজুয়াল স্টুডিওগুলি এই ফাইলগুলি $ (সমাধানডির) থেকে মুছে ফেলার কোনও উপায় আছে কি? এগুলি সেখানে রেখে অন্য দেবগণকে বিভ্রান্ত করতে পারে।
আদম

এটি আমার প্রয়োজন ছিল। প্রকল্প এবং বিল্ডিং প্রক্রিয়া এখন প্রত্যাশার মতো কাজ করছে, তবে একবার প্রয়োগের পরে ফাইলগুলি প্রকাশিত হয় না। এর জন্য কোনও ইঙ্গিত?
জর্জি ডাব্লু।

4

আমি মনে করি

<Content Include="..\..\MyContentFiles\**\*.*">
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>

কেবলমাত্র যথেষ্ট, যেহেতু আপনি সেই ফোল্ডার এবং সাবফোল্ডারগুলিতে সমস্ত কিছু চান


3

.NET কোর প্রকল্পের জন্য একটি ফোল্ডারে ফাইল অন্তর্ভুক্ত করতে,

<!--Just files-->
<ItemGroup>
  <None Update="..\..\MyContentFiles\**\*.*">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </None>
</ItemGroup>
<!--Content files-->
<ItemGroup>
  <Content Include="..\..\MyContentFiles\**\*.*" Link="MyContentFiles\%(RecursiveDir)%(Filename)%(Extension)">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </Content>
</ItemGroup>

এবং আইটেমগুলির সম্পত্তি "আউটপুট ডিরেক্টরিতে অনুলিপি" হবে "নতুন হলে অনুলিপি করুন":
আরও নতুন করে কপি করুন


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