ভিজ্যুয়াল স্টুডিও: ফোল্ডারের কাঠামোটি অনুলিপি না করে কীভাবে "আউটপুট ডিরেক্টরিতে অনুলিপি করবেন"?


111

আমার প্রকল্প ফোল্ডারের \ lib ফোল্ডারে আমার কাছে কয়েকটি dll ফাইল রয়েছে। Dll এর সম্পত্তি পৃষ্ঠাতে, আমি "সামগ্রী তৈরি করুন" হিসাবে "বিল্ড অ্যাকশন" এবং "সর্বদা অনুলিপি করুন" হিসাবে "আউটপুট ডিরেক্টরিতে অনুলিপি" নির্বাচন করেছি।

বিল্ড করার পরে আমি আসলে dll অনুলিপি করছিলাম তবে সেগুলি inside বিন \ রিলিজ \ lib এর ভিতরে রয়েছে এবং \ বিন \ রিলিজে নয়।

পোস্ট-বিল্ড স্ক্রিপ্ট না লিখে বা ন্যান্ট ইত্যাদি অবলম্বন না করে ll বিন \ রিলিজ (এবং \ বিন \ রিলিজ \ লিব না) এর জন্য dll ফাইলগুলি অনুলিপি করার কোনও উপায় আছে কি?

উত্তর:


255

পরিবর্তে টার্গেট পাথটি <Content>ব্যবহার <ContentWithTargetPath>এবং নির্দিষ্ট করার পরিবর্তে :

<ItemGroup>
  <ContentWithTargetPath Include="lib\some_file.dat">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    <TargetPath>some_file.dat</TargetPath>
  </ContentWithTargetPath>
<ItemGroup>

মনে রাখবেন যে এই এন্ট্রিটি ভিজ্যুয়াল স্টুডিও (2012, 2015, 2017) থেকে দৃশ্যমান নাও হতে পারে, তবে একবার সিএসপিজে ম্যানুয়ালি যুক্ত হয়ে গেলে এটি ভিজ্যুয়াল স্টুডিওতে উপস্থিত হবে। যদিও লক্ষ্যের পথটি ইউআইয়ের মাধ্যমে সম্পাদনাযোগ্য হবে না।


2
আমি ভিএস 2015 তে কন্টেন্টউইথটারাজেটকে বিল্ড অ্যাকশন বিকল্প হিসাবে দেখছি না it এটি যুক্ত করার কোনও উপায় আছে কি?
কিম

1
একবার আমি .csproj ফাইলে ম্যানুয়ালি এন্ট্রি যুক্ত করলে এটি আইডিইতে একটি বিকল্প হিসাবে উপস্থিত হয়। তবে আমি এখনও আইডিই থেকে টার্গেট পাথ সম্পাদনা করতে পারি না।
কিম

9
আমার একমাত্র উদ্বেগটি হ'ল এটি এমএসবাইল্ড /। নেট / ভিজ্যুয়াল স্টুডিও / যাই হোক না কেন, ভিএস ২০১৫ ইউআই এই বিকল্পটি বা টার্গেটপথ সম্পত্তি দেখায় না তাই ভবিষ্যতের সংস্করণগুলির সাথে অসমর্থিত হয়ে উঠবে।
মারিওডিএস 31'16

1
এটি আমার পক্ষে কাজ করে। অন্য কোনও উত্তর আমার পক্ষে কাজ করে না। এই উত্তর হওয়া উচিত।
গানওয়ান্ডারার

1
নোট করুন ContentWithTargetPathব্রেক ব্রেক ইনক্রিমেন্টাল সংকলন ব্যবহার করে (ভিএস 2017 15.9.9 তে পরীক্ষা করা হয়েছে)
ম্যাডস

26

এগুলিকে রাখুন $(ProjectDir)\Lib, তবে আপনার .csproj এর মূলটিতে " লিঙ্ক হিসাবে " ফাইলগুলি যুক্ত করুন । এখন তারা বিন \ ডিবাগ (বা অন্য যে কোনও আউটপুট ফোল্ডার) লিবিয় না হয়ে অনুলিপি করা হবে।

সম্পাদনা: কন্টেন্ট উইথট্রেটপথ যখন ভিএস / এমএসবিল্ড আমি ব্যবহার করছিলাম সেগুলির সংস্করণগুলিতে উপলভ্য ছিল না তখন এই উত্তরটি ফেরত পাঠানো হয়েছিল। এই উত্তরটি এখানে রেখে সেই লোকদের জন্য যাদের ভিএস-এর একটি পুরানো সংস্করণ ব্যবহার করতে হতে পারে for এই সম্পর্কে মন্তব্য বন্ধ করুন, আমরা সবাই জানি এখন আরও ভাল উপায় আছে।


4
ধন্যবাদ আনথনলাইন। আমি আপনার পদক্ষেপগুলি চেষ্টা করেছিলাম কিন্তু তাতে কোনও লাভ হয়নি। হতে পারে আমি কিছু ভুল করছি। আমি যা করছি তা এখানে, দয়া করে যদি আপনি কিছু ভুল বলে মনে করেন তবে এটি সংশোধন করুন: ১. প্রকল্পগুলি থেকে lls ঘড়িগুলি বাদ দিন তবে তাদের পছন্দসই হতে দিন project. প্রকল্পে ডান ক্লিক করুন এবং "বিদ্যমান আইটেমগুলি যুক্ত করুন"। ডিবিএলগুলি লাইব থেকে নির্বাচন করুন এবং তাদের "লিঙ্ক হিসাবে" যুক্ত করুন lls. ডলসটিতে ডান ক্লিক করুন এবং আবার "অনুলিপি ডিরেক্টরিতে অনুলিপি করুন" নির্বাচন করুন। 4. পরিষ্কার এবং পুনর্নির্মাণ। ফলাফল: আমি আবার সেই
ঘরগুলি

1
দয়া করে আপনার সমাধান ফোল্ডারের এটির কনফিগার করার পরে একটি স্ক্রিনশট পোস্ট করুন
এনি

3
যদি আমি প্রকল্পের
গাছটিতে

1
@ নায়ারগডস এর মতো আমিও অভিজ্ঞতা অর্জন করছি যে আপনি প্রকল্পের গাছটিতে ইতিমধ্যে থাকা কোনও ফাইলের লিঙ্ক যুক্ত করতে পারবেন না যাতে এই উত্তরটি সমস্যার সমাধান করে না।
টোর Østergaard

1
এটি কি সলিউশন এক্সপ্লোরার-এ প্রকল্প ডিরেক্টরিটির মূলকে প্লাবন করে না? এ জাতীয় অনেকগুলি ফাইলের সাথে এটি সমস্যা হতে পারে। সাধারণত কোনও প্রকল্প ডিরেক্টরিটির মূলটিতে ইতিমধ্যে অনেকগুলি মুশকিল রয়েছে।
অ্যালেক্স 34758

10

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

(দ্রষ্টব্য যে এই পোস্টটি সরাসরি এই প্রশ্নের উত্তর দেয় না কারণ এটি ফোল্ডার এবং প্রকল্পের কাঠামো সংরক্ষণ করে না, তবে আমি এই পদ্ধতিকে দরকারী বলে মনে করেছি কারণ আমি আমার প্রকল্পটি আমার ক্ষেত্রে পুনর্গঠন করতে সক্ষম হয়েছি এবং কারণ আমি এর কিছু এড়াতে চেয়েছিলাম অন্যান্য পদ্ধতির ডাউনসাইডগুলি এখানে)

ধাপ

  • আপনার ডান ক্লিক করুন Solution -> Add -> New Project -> Shared Project
  • এই প্রকল্পে ডিএলএল যুক্ত করুন (এই প্রকল্পের মূল ডিরেক্টরিতে, "লিবিব" সাব-ফোল্ডারে নয়)
  • (চেক করুন ডিএলএল ফাইলের বৈশিষ্ট্যগুলি সঠিকভাবে সেট করা আছে, যেমন Build Action: Contentএবং Copy to Output Directory: Copy Always)
  • মূল প্রকল্পটির ডান ক্লিক করুন References -> Add Reference -> Shared Projects
  • আপনি পূর্বে তৈরি ভাগ করা প্রকল্প নির্বাচন করুন

সেটআপটি দেখতে এমন দেখাচ্ছে:

সমাধান-এক্সপ্লোরার-স্ক্রিনশট


2
প্রকল্পটি নিরবিচ্ছিন্ন রাখতে এখন পর্যন্ত সহজ এবং মার্জিত সমাধান।
রবি গণেশ

আমি এটি ইউএপি এবং * .bin ফাইলগুলির সাথে কাজ করতে পারি না।
ম্যাটিও

7

প্রকল্পের রেফারেন্স হিসাবে dll-ফাইলগুলি যুক্ত করুন এবং রেফারেন্স সেটটিতে "স্থানীয় কপি করুন" সত্য হিসাবে সেট করুন।


1
ধন্যবাদ এরিক এটি একটি ডেল বাদে পুরোপুরি কাজ করে যা আমি উল্লেখ হিসাবে যুক্ত করতে সক্ষম নই am রেফারেন্স হিসাবে যুক্ত করার সময় আমি যে ত্রুটি পেয়েছি তা '' libay32.dll '' র একটি রেফারেন্স যোগ করা যায়নি। দয়া করে নিশ্চিত হয়ে নিন যে ফাইলটি অ্যাক্সেসযোগ্য এবং এটি একটি বৈধ সমাবেশ বা সিওএম উপাদান।
ওহডিয়ার

7
@ ম্যানথনি: প্রকল্পের রেফারেন্স হিসাবে কেবল নেট নেট এসেম্বলি বা সিওএম ইন্টারপ অ্যাসেমব্লিকে যোগ করা যেতে পারে; নেটিভ ডিএলএল হতে পারে না। L বিন \ রিলিজে ডিএলএল অনুলিপি করার জন্য আপনাকে অন্য কোনও উপায় খুঁজে বের করতে হবে।
মাইকেল লিউ

ধন্যবাদ এরিক এবং মাইকেল এবং অ্যান্থনলাইন। দুঃখিত, আপনার উত্তর এবং মন্তব্যগুলিকে উচ্চারণ করতে পারে না কারণ আমার কাছে প্রয়োজনীয় খ্যাতি পয়েন্ট নেই।
ওহডিয়ার

1
নিয়ন্ত্রণহীন ডিএলএল-এর জন্য আপনার নীচের প্রস্তাবিত পদ্ধতিটি ব্যবহার করতে হবে।
আনি

4

আপনার যদি Libs ডিরেক্টরি থেকে মূল ফোল্ডার VS2017 ফাইলগুলি অনুলিপি করতে হয়:

<ItemGroup Condition="'$(Platform)' == 'x64'">
    <None Include="Libs\x64\**" Link="\%(Filename)%(Extension)" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>
<ItemGroup Condition="'$(Platform)' == 'x86'">
    <None Include="Libs\x86\**" Link="\%(Filename)%(Extension)" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>

Libs (RecursiveDir) ফোল্ডার সহ অন্য যে কোনও ফোল্ডারে

<ItemGroup Condition="'$(Platform)' == 'x86'">
    <None Include="Libs\x86\**" Link="mycustomfolder\%(RecursiveDir)%(Filename)%(Extension)" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>

3

এটি ভিজুয়ালস্টুডিও 2015 তে মনে হচ্ছে যে আপনি যে ডলগুলি 'লিঙ্কের সাথে যুক্ত করছেন' যদি একই প্রকল্পের সাবফোল্ডারে থাকে - সেগুলি স্বয়ংক্রিয়ভাবে একটি ফোল্ডার স্থাপন করা হবে, এবং আউটপুটটিও আপনি যেমন দেখলেন একটি ফোল্ডারে স্থাপন করা হবে।

যদি ডিএলসগুলি অন্য কোনও প্রকল্পে বা ডিরেক্টরিতে ডিরেক্টরিতে কোনও প্রকল্পের সাবফোল্ডারে না থাকে তবে আপনি 'একটি লিঙ্ক দিয়ে যুক্ত' করতে পারেন এবং সেগুলি মূল ডিরেক্টরিতে রেখে দেওয়া হবে fine


ভিএস ২০১২-তে একই। এটি তাদের একটি লিঙ্ক তৈরি করতে অস্বীকার করে এবং কেবল তাদের সামগ্রী হিসাবে যুক্ত করে। শেষ পর্যন্ত, দুঃখের সাথে সবচেয়ে সহজ সমাধান বলে মনে হচ্ছে এগুলি প্রকল্পের মূলের মধ্যে ফেলে দেওয়া হচ্ছে।
নাইরেগডস

0

বিকল্প পদ্ধতিটি কেবল আইটেমগুলিকে টাইপ হিসাবে রেখে দেওয়া None। সমাধান এক্সপ্লোরারটিতে আপনি যেটিকে স্থাপন করতে চান এবং তার উপর Contentসম্পত্তি সেট করতে চান তার উপর ক্লিক করুন True

দ্রষ্টব্য: আমি VS2019 এ এটি করেছি এবং জিনিসগুলি সংস্করণ থেকে সংস্করণে পরিবর্তিত হতে পারে।

এটি কাজ করতে, এখন আপনার প্রকল্পে ডান ক্লিক করুন এবং "আনলোড প্রকল্প" নির্বাচন করুন। তারপরে আনলোড হওয়া প্রকল্পে ডান ক্লিক করুন এবং "সম্পাদনা করুন প্রকল্প_নাম.ভিসিএক্সপ্রজ" নির্বাচন করুন।

সম্পাদকটিতে, ফাইলের নীচে সমস্ত দিকে যান এবং পিছনের </Project>ট্যাগের ঠিক সামনে এই লক্ষ্যটি sert োকান:

  <Target Name="CopyContent" AfterTargets="Build">
    <Copy SourceFiles="@(None)" Condition="'%(None.DeploymentContent)' == 'true'" DestinationFolder="$(OutputPath)" ContinueOnError="true" />
  </Target>

এখন আনলোড হওয়া প্রকল্পে ডান ক্লিক করুন এবং "পুনঃলোড প্রকল্প" নির্বাচন করুন। আপনাকে অনুরোধ জানানো হলে সংরক্ষণ এবং বন্ধ করতে নির্বাচন করুন।

আমি এগুলিও সেট করে রেখেছি OutputDirectory:

$(SolutionDir)bin\$(Configuration)\$(Platform)\

এবং IntermediateDirectoryযাও:

$(SolutionDir)obj\$(Configuration)\$(ProjectName)\$(Platform)\

প্রকল্পের বৈশিষ্ট্যগুলির সাধারণ পৃষ্ঠায়। এটি আউটপুটটিকে "বিন" ফোল্ডারে রাখে এবং মধ্যস্থতাগুলি আপনার সমাধানের মূলের একটি "আপত্তি" ফোল্ডারে রাখে।

দ্রষ্টব্য: $(SolutionDir)আপনি কমান্ড লাইন থেকে এমএসবিল্ড চালানোর সময় সংজ্ঞাটি দেওয়া হয় না। আপনি যে ফোল্ডারটি .sln ফাইলটি getDirectoryNameOfFileAbove ব্যবহার করে থাকেন সেখানে সেটি নির্ধারণ করতে একটি কৌশল আছে। (পাঠকের অনুশীলন হিসাবে ছেড়ে দেওয়া হয়েছে)। এছাড়াও, 2019 এর মতো দেখে মনে হচ্ছে তারা যেভাবেই কমান্ড লাইনে এটি সঠিকভাবে পরিচালনা করছে। হ্যাঁ :)$(SolutionDir) একটি trailing ব্যাকস্ল্যাশ, অত পরে কেউ ধারণ করে। প্রত্যেকের ফলাফলের অবশ্যই একটি পিছনের ব্যাকস্ল্যাশ থাকতে হবে।

এখন, যদি আপনার প্রো বা তার বেশি থাকে তবে দয়া করে প্রতিবার কোনও প্রকল্প তৈরি করার সময় এটি করবেন না। সেটা খোঁড়া হবে। পরিবর্তে, একবার আপনার প্রকল্পের সেটআপটি আপনার পছন্দ মতভাবেই নির্বাচন করুন Project -> Export Template। আপনি এটির একটি নাম দিন এবং পরের বার আপনি ঠিক সেইর মতো কোনও প্রকল্প তৈরি করতে চান, নতুন প্রকল্পের কথোপকথনে কেবল সেই নামটি চয়ন করুন। (পুরানো সংস্করণে, আমি মনে করি এটি ছিল Files -> Export Teamplate...))


-1

ভিজ্যুয়াল স্টুডিও 2010 / সি # প্রকল্পে আমার একই সমস্যা ছিল।

সমাবেশগুলির জন্য (যেমন। নেট ইন্টারফেস থাকা) সলিউশন এক্সপ্লোরারটিতে আপনার প্রকল্পের অধীনে ফোল্ডার "রেফারেন্স" ব্যবহার করুন। এটিতে ডান ক্লিক করুন, "বিদ্যমান আইটেম যুক্ত করুন" চয়ন করুন এবং আপনার .dll সমাবেশটি সনাক্ত করুন।

সাধারণ .dll ফাইলগুলি একটি সাবফোল্ডারে ("mentioned lib" হিসাবে উপরে উল্লিখিত ছিল) এবং বৈশিষ্ট্যগুলিতে নির্বাচন করা যেতে পারে:

  • বিল্ড অ্যাকশন = "হেল্পফায়ালস"
  • আউটপুট ডিরেক্টরিতে অনুলিপি করুন = "নতুন হলে"

এটি আমার পক্ষে ঠিক যেমনটি পছন্দসইভাবে কাজ করেছিল - নির্মাণের সময় .DLL গুলি "\ lib" সাবফোল্ডার ছাড়াই আউটপুট ডিরেক্টরিতে অনুলিপি করে।

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