"স্থানীয় অনুলিপি" এবং প্রকল্পের রেফারেন্স সহ সেরা অনুশীলন কোনটি?


154

আমার কাছে একটি বড় সি # সলিউশন ফাইল (~ 100 প্রকল্প) রয়েছে এবং আমি বিল্ড টাইমগুলি উন্নত করার চেষ্টা করছি। আমি মনে করি যে "কপিরাইট লোকাল" আমাদের জন্য অনেক ক্ষেত্রেই অপচয়যোগ্য তবে আমি সেরা অনুশীলনগুলি নিয়ে ভাবছি।

আমাদের .sln, এ্যাসেম্বলি বি এর উপর নির্ভর করে আমাদের অ্যাপ্লিকেশন এ রয়েছে যা সমাবেশ সি এর উপর নির্ভর করে case আমাদের ক্ষেত্রে, কয়েক ডজন "বি" এবং মুষ্টিমেয় "সি" রয়েছে। এগুলি সমস্ত .sln এ অন্তর্ভুক্ত হওয়ায় আমরা প্রকল্পের রেফারেন্স ব্যবহার করছি। সমস্ত সমাবেশগুলি বর্তমানে $ (সলিউশনডির) / ডিবাগ (বা প্রকাশ) -এ তৈরি করে।

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

ফলোআপ:

প্রচুর প্রতিক্রিয়াগুলি বিল্ডটিকে ছোট ছোট .sln ফাইলগুলিতে ভাঙ্গার পরামর্শ দেয় ... উপরের উদাহরণে, আমি প্রথমে ফাউন্ডেশন ক্লাসগুলি "সি" তৈরি করব, তারপরে মডিউলগুলির বেশিরভাগ "বি" এবং তারপরে কয়েকটি অ্যাপ্লিকেশন, " একটি "। এই মডেলটিতে, আমার বি থেকে বি-প্রকল্পের রেফারেন্স থাকা দরকার, সেখানে আমি যে সমস্যাটি চালাচ্ছি তা হ'ল "ডিবাগ" বা "রিলিজ" ইঙ্গিতের পথে আবদ্ধ হয়ে যায় এবং আমি "বি" এর আমার রিলিজ বিল্ডগুলি তৈরি করে শেষ করি I "সি" এর ডিবাগ বিল্ডগুলির বিরুদ্ধে।

আপনারা যারা বিল্ড আপকে একাধিক .sln ফাইলগুলিতে বিভক্ত করেন, আপনি কীভাবে এই সমস্যাটি পরিচালনা করবেন?


9
আপনি সরাসরি প্রকল্প ফাইলটি সম্পাদনা করে আপনার ইঙ্গিত পথটিকে ডিবাগ বা রিলিজ ডিরেক্টরিটি উল্লেখ করতে পারেন। ডিবাগ বা রিলিজের জায়গায় $ (কনফিগারেশন) ব্যবহার করুন। উদাহরণস্বরূপ, <HintPath> .. \ আউটপুট \ $ (কনফিগারেশন) \ test.dll </HintPath> আপনার অনেকগুলি রেফারেন্স থাকাকালীন এ ব্যথা হয় (যদিও কারও পক্ষে অ্যাড-ইন লিখতে অসুবিধা হবে না) এটি পরিচালনা করুন)।
অতিবেগে

4
ভিজ্যুয়াল স্টুডিওতে 'কপিরাইট লোকাল' কি <Private>True</Private>সিএসপিজেজের মতো?
কর্নেল আতঙ্ক

তবে একটিকে .slnছোট করে ভাগ করা ভিএস-এর স্বয়ংক্রিয় আন্তঃনির্ভরতা গণনাটিকে ভেঙে দেয় <ProjectReference/>। আমি একাধিক ছোট ছোট থেকে .slnআরও একটি একক বড় .slnআমার কাছে চলে এসেছি কারণ ভিএস এর ফলে কম সমস্যার সৃষ্টি হয়… সুতরাং, সম্ভবত ফলোআপটি আসল প্রশ্নের একটি অপ্রয়োজনীয়-সেরা সমাধান ধরে নিচ্ছে? ;-)
বিনকি

শুধু আউট কৌতুহল. কেন জিনিস জটিল এবং 100+ প্রকল্প প্রথম স্থানে আছে? এই খারাপ নকশা বা কি?
দরকারী

@ কলোনেলপ্যানিক আমি জিইআইআই-তে সেই টগল পরিবর্তন করার সময় ডিস্কে অন্তত সেই জিনিসটি পরিবর্তিত হয়।
জিরো 3

উত্তর:


85

পূর্ববর্তী একটি প্রকল্পে আমি প্রকল্পের রেফারেন্স সহ একটি বড় সমাধানের সাথে কাজ করেছি এবং পাশাপাশি পারফরম্যান্স সমস্যায় পড়েছি। সমাধানটি তিনগুণ ছিল:

  1. সর্বদা অনুলিপি স্থানীয় সম্পত্তি সেট করুন মিথ্যা এবং একটি কাস্টম এমএসবিল্ড পদক্ষেপের মাধ্যমে এটি প্রয়োগ করুন

  2. প্রতিটি প্রকল্পের জন্য আউটপুট ডিরেক্টরি একই ডিরেক্টরিতে সেট করুন (সম্ভবত $ (সমাধানডায়ার) এর সাথে সম্পর্কিত)

  3. ফ্রেমওয়ার্কের সাথে প্রেরিত হওয়া ডিফল্ট সিএস লক্ষ্যমাত্রাগুলি বর্তমানে নির্মিত প্রকল্পের আউটপুট ডিরেক্টরিতে অনুলিপি করার জন্য রেফারেন্সের সেট গণনা করে। যেহেতু এটির জন্য 'রেফারেন্স' সম্পর্কের অধীনে একটি ট্রানজিট ক্লোজার গণনা করা দরকার এটি খুব ব্যয়বহুল হয়ে উঠতে পারে । এর জন্য আমার কর্মসূচীটি হ'ল আমদানির পরে প্রতিটি প্রকল্পে আমদানি করা GetCopyToOutputDirectoryItemsএকটি সাধারণ টার্গেট ফাইল (উদা। Common.targets) এর লক্ষ্যটিকে নতুন করে সংজ্ঞায়িত করা Microsoft.CSharp.targets। নিম্নলিখিত প্রকল্পগুলির মতো দেখতে প্রতিটি প্রকল্পের ফাইলের ফলাফল:

    <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <PropertyGroup>
        ... snip ...
      </ItemGroup>
      <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
      <Import Project="[relative path to Common.targets]" />
      <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
           Other similar extension points exist, see Microsoft.Common.targets.
      <Target Name="BeforeBuild">
      </Target>
      <Target Name="AfterBuild">
      </Target>
      -->
    </Project>

এটি আমাদের নির্ধারিত সময়টিকে একটি নির্দিষ্ট সময়ে কয়েক ঘন্টা (বেশিরভাগ স্মৃতির সীমাবদ্ধতার কারণে) থেকে কয়েক মিনিটের মধ্যে হ্রাস করে।

এর মধ্যে GetCopyToOutputDirectoryItemsথেকে 2,438–2,450 এবং 2,474–2,524 লাইনগুলি অনুলিপি করে নতুন সংজ্ঞাটি তৈরি করা যেতে পারে ।C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Microsoft.Common.targetsCommon.targets

সম্পূর্ণতার জন্য ফলস্বরূপ লক্ষ্য সংজ্ঞাটি তখন পরিণত হয়:

<!-- This is a modified version of the Microsoft.Common.targets
     version of this target it does not include transitively
     referenced projects. Since this leads to enormous memory
     consumption and is not needed since we use the single
     output directory strategy.
============================================================
                    GetCopyToOutputDirectoryItems

Get all project items that may need to be transferred to the
output directory.
============================================================ -->
<Target
    Name="GetCopyToOutputDirectoryItems"
    Outputs="@(AllItemsFullPathWithTargetPath)"
    DependsOnTargets="AssignTargetPaths;_SplitProjectReferencesByFileExistence">

    <!-- Get items from this project last so that they will be copied last. -->
    <CreateItem
        Include="@(ContentWithTargetPath->'%(FullPath)')"
        Condition="'%(ContentWithTargetPath.CopyToOutputDirectory)'=='Always' or '%(ContentWithTargetPath.CopyToOutputDirectory)'=='PreserveNewest'"
            >
        <Output TaskParameter="Include" ItemName="AllItemsFullPathWithTargetPath"/>
        <Output TaskParameter="Include" ItemName="_SourceItemsToCopyToOutputDirectoryAlways"
                Condition="'%(ContentWithTargetPath.CopyToOutputDirectory)'=='Always'"/>
        <Output TaskParameter="Include" ItemName="_SourceItemsToCopyToOutputDirectory"
                Condition="'%(ContentWithTargetPath.CopyToOutputDirectory)'=='PreserveNewest'"/>
    </CreateItem>

    <CreateItem
        Include="@(_EmbeddedResourceWithTargetPath->'%(FullPath)')"
        Condition="'%(_EmbeddedResourceWithTargetPath.CopyToOutputDirectory)'=='Always' or '%(_EmbeddedResourceWithTargetPath.CopyToOutputDirectory)'=='PreserveNewest'"
            >
        <Output TaskParameter="Include" ItemName="AllItemsFullPathWithTargetPath"/>
        <Output TaskParameter="Include" ItemName="_SourceItemsToCopyToOutputDirectoryAlways"
                Condition="'%(_EmbeddedResourceWithTargetPath.CopyToOutputDirectory)'=='Always'"/>
        <Output TaskParameter="Include" ItemName="_SourceItemsToCopyToOutputDirectory"
                Condition="'%(_EmbeddedResourceWithTargetPath.CopyToOutputDirectory)'=='PreserveNewest'"/>
    </CreateItem>

    <CreateItem
        Include="@(Compile->'%(FullPath)')"
        Condition="'%(Compile.CopyToOutputDirectory)'=='Always' or '%(Compile.CopyToOutputDirectory)'=='PreserveNewest'">
        <Output TaskParameter="Include" ItemName="_CompileItemsToCopy"/>
    </CreateItem>
    <AssignTargetPath Files="@(_CompileItemsToCopy)" RootFolder="$(MSBuildProjectDirectory)">
        <Output TaskParameter="AssignedFiles" ItemName="_CompileItemsToCopyWithTargetPath" />
    </AssignTargetPath>
    <CreateItem Include="@(_CompileItemsToCopyWithTargetPath)">
        <Output TaskParameter="Include" ItemName="AllItemsFullPathWithTargetPath"/>
        <Output TaskParameter="Include" ItemName="_SourceItemsToCopyToOutputDirectoryAlways"
                Condition="'%(_CompileItemsToCopyWithTargetPath.CopyToOutputDirectory)'=='Always'"/>
        <Output TaskParameter="Include" ItemName="_SourceItemsToCopyToOutputDirectory"
                Condition="'%(_CompileItemsToCopyWithTargetPath.CopyToOutputDirectory)'=='PreserveNewest'"/>
    </CreateItem>

    <CreateItem
        Include="@(_NoneWithTargetPath->'%(FullPath)')"
        Condition="'%(_NoneWithTargetPath.CopyToOutputDirectory)'=='Always' or '%(_NoneWithTargetPath.CopyToOutputDirectory)'=='PreserveNewest'"
            >
        <Output TaskParameter="Include" ItemName="AllItemsFullPathWithTargetPath"/>
        <Output TaskParameter="Include" ItemName="_SourceItemsToCopyToOutputDirectoryAlways"
                Condition="'%(_NoneWithTargetPath.CopyToOutputDirectory)'=='Always'"/>
        <Output TaskParameter="Include" ItemName="_SourceItemsToCopyToOutputDirectory"
                Condition="'%(_NoneWithTargetPath.CopyToOutputDirectory)'=='PreserveNewest'"/>
    </CreateItem>
</Target>

এই সমাধানের জায়গায় আমি এক হিসাবে একটি> 120 টির মতো প্রকল্পের পক্ষে কার্যক্ষম বলে মনে করেছি, এটির মূল সুবিধাটি হ'ল যে এখনও প্রকল্পগুলির বিল্ড অর্ডারটি আপনার সমাধানকে বিভক্ত করে হাতের না করে ভিএস দ্বারা নির্ধারণ করা যেতে পারে ।


আপনি যে পরিবর্তনগুলি করেছেন তা বর্ণনা করতে পারেন এবং কেন? দীর্ঘ দিন কোডিংয়ের পরে আমার চোখের চোটগুলি খুব ক্লান্ত হয়ে পড়েছে এটিকে নিজেই বিপরীত করার চেষ্টা করার জন্য :)
চার্লি ফুলগুলি

এটি আবার অনুলিপি করে আটকানোর চেষ্টা করার পদ্ধতি সম্পর্কে - তাই 99% ট্যাগের মতোই গণ্ডগোল।
জেডএক্সএক্স

@ চর্লি ফুল, @ জেডএক্সএক্স একটি বিবরণ হিসাবে টেক্সট সম্পাদনা করেছেন যাতে এক্সএমএলটি সুন্দরভাবে বিন্যাসে পাওয়া যায়নি।
বাস বোসিংক

1
মাইক্রোসফট.কমন.টরজেটস থেকে: গেটকপিটিওআউটপুট ডিরেক্টরী আইটেমগুলি এমন সমস্ত প্রকল্প আইটেম পান যা আউটপুট ডিরেক্টরিতে স্থানান্তরিত হতে পারে need এতে ট্রান্সজিটিভলি রেফারেন্সযুক্ত প্রকল্পগুলির লাগেজ আইটেম অন্তর্ভুক্ত। এটি প্রদর্শিত হবে যে এই লক্ষ্যটি সমস্ত রেফারেন্সড প্রকল্পগুলির জন্য সামগ্রীর আইটেমগুলির সম্পূর্ণ ট্রানজিটিভ ক্লোজারের গণনা করে; যাই হোক, এটা ব্যপার না.
ব্র্যানস ডিএস

2
এটি কেবলমাত্র তাত্ক্ষণিক শিশুদের থেকে নয় বরং শিশুদের বাচ্চাদের কাছ থেকে সামগ্রী সামগ্রী সংগ্রহ করে। এর কারণ হওয়ার কারণ হ'ল_প্লিটপ্রজেক্টরেইফারেন্সসাইফাইএক্সেস্টিভিত্তিক প্রজেক্টের রেফারেন্স উইথ কনফিগারেশনের তালিকাটি কেবলমাত্র বর্তমান প্রকল্পে জনবহুল এবং শিশুদের মধ্যে খালি রয়েছে। খালি তালিকার কারণে _MSBuildProjectReferencesExistance খালি হয়ে যায় এবং পুনরাবৃত্তি বন্ধ হয়। সুতরাং এটি কার্যকর নয় বলে মনে হয়।
ব্রান্স ডিএস

32

আমি আপনাকে সেই বিষয়ে প্যাট্রিক স্মাচিয়ার নিবন্ধগুলি পড়ার পরামর্শ দিচ্ছি:

সিসি নেট ভিএস প্রকল্পগুলি স্থানীয় রেফারেন্স অ্যাসেম্বলি বিকল্পটির উপর নির্ভর করে to [...] কেবলমাত্র এটিই সংকলনের সময় উল্লেখযোগ্যভাবে বৃদ্ধি পাবে না (এনউনিতের ক্ষেত্রে এক্স 3) নয়, এটি আপনার কর্মপরিবেশটিও গোলমাল করে। সর্বশেষে তবে শেষ পর্যন্ত, এটি করা সম্ভাব্য সমস্যার সংস্করণ দেওয়ার ঝুঁকিটি প্রবর্তন করে। বিটিডাব্লু, এনডিপেন্ড একটি সতর্কতা প্রকাশ করবে যদি এটি একই নাম সহ 2 টি ভিন্ন ডিরেক্টরিতে 2 টি অ্যাসেম্বলির সন্ধান করে তবে একই বিষয়বস্তু বা সংস্করণ নয়।

করণীয় হ'ল 2 ডিরেক্টরি $ রুটডির। \ বিন \ ডিবাগ এবং $ রুটডির \ \ বিন \ মুক্তির সংজ্ঞা দেওয়া এবং এই ভিজুয়ালস্টুডিও প্রকল্পগুলিকে এই ডিরেক্টরিগুলিতে সমাবেশগুলি নির্গত করতে কনফিগার করা। সমস্ত প্রকল্পের রেফারেন্সগুলিতে ডিবাগ ডিরেক্টরিতে সমাবেশগুলি উল্লেখ করা উচিত।

আপনি আপনার প্রকল্পের সংখ্যা হ্রাস করতে এবং আপনার সংকলনের সময়টি উন্নত করতে সহায়তা করতে এই নিবন্ধটি পড়তে পারেন।


1
আমি আশা করি আমি একাধিক উঁচুতে স্মাচিয়ার অনুশীলনগুলি সুপারিশ করতে পারতাম! প্রকল্পের সংখ্যা হ্রাস হ'ল মূল, সমাধান বিভাজন নয়।
অ্যান্টনি মাষ্ট্রেয়ান

23

নির্ভরতা গাছের শীর্ষে থাকা ব্যতীত প্রায় সমস্ত প্রকল্পের জন্য আমি অনুলিপি = স্থানীয় রাখার পরামর্শ দিই। এবং শীর্ষ সেটগুলির মধ্যে একটিতে সমস্ত উল্লেখের জন্য স্থানীয় = সত্যটি অনুলিপি করুন। আমি অনেক লোককে আউটপুট ডিরেক্টরি ভাগ করার পরামর্শ দিচ্ছি; আমি মনে করি এটি অভিজ্ঞতার ভিত্তিতে একটি ভয়ঙ্কর ধারণা। যদি আপনার প্রারম্ভিক প্রকল্পটি কোনও ডেল সম্পর্কিত রেফারেন্স ধরে রাখে যে অন্য কোনও প্রকল্প আপনাকে রেফারেন্স ধারণ করে তবে কোনও কোনও সময়ে অ্যাক্সেস-ভাগ করা লঙ্ঘনের অভিজ্ঞতা হবে এমনকি স্থানীয় = সমস্ত কিছুতে মিথ্যা অনুলিপি করা এবং আপনার বিল্ড ব্যর্থ হবে। এই সমস্যাটি খুব বিরক্তিকর এবং ট্র্যাক করা শক্ত। আমি সম্পূর্ণরূপে একটি ধারালো আউটপুট ডিরেক্টরি থেকে দূরে থাকার পরামর্শ দিচ্ছি এবং নির্ভরতা চেনের শীর্ষে প্রকল্পটি না রেখে সংশ্লিষ্ট ফোল্ডারে প্রয়োজনীয় সমাবেশগুলি লিখি write যদি আপনার "শীর্ষে" কোনও প্রকল্প না থাকে তবে তারপরে আমি সমস্ত কিছু সঠিক জায়গায় পেতে একটি বিল্ড-পরবর্তী অনুলিপি প্রস্তাব করব। এছাড়াও, আমি চেষ্টা করব এবং ডিবাগিংয়ের স্বাচ্ছন্দ্য মনে রাখব। যে কোনও এক্সি প্রজেক্ট আমি এখনও স্থানীয় অনুলিপি কপি রেখেছি তাই F5 ডিবাগিং অভিজ্ঞতা কাজ করবে।


2
আমার এই একই ধারণা ছিল এবং আমি এখানে অন্যভাবে একইভাবে চিন্তাভাবনা করে এমন অন্য কাউকে খুঁজে পাওয়ার আশা করছিলাম; তবে, আমি আগ্রহী যে কেন এই পোস্টে আরও বেশি উত্সাহ নেই। যারা দ্বিমত পোষণ করেন: আপনি কেন একমত নন?
বার্কস

না একই প্রকল্পটি দু'বার তৈরি না করা হলে তা ঘটতে পারে না, যদি এটি একবারে নির্মিত হয় এবং কোনও ফাইল অনুলিপি না করে তবে কেন সেটি ওভাররাইট করা \ অ্যাক্সেস \ ভাগ করে নেওয়া লঙ্ঘন পাবে?
পৌল

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

10

আপনি সঠিক. কপিরলোকাল আপনার বিল্ড সময়গুলি একেবারে মেরে ফেলবে। আপনার যদি কোনও বৃহত উত্স ট্রি থাকে তবে আপনার কপিরলোকল অক্ষম করা উচিত। দুর্ভাগ্যক্রমে এটি পরিষ্কার হিসাবে এটি অক্ষম করা উচিত যতটা সহজ নয়। MSBUILD থেকে .NET- র রেফারেন্সের জন্য কপিরাইটলোকল (প্রাইভেট) সেটিংস কীভাবে আমি ওভাররাইড করব এ কপিরাইট লোকাল অক্ষম করার বিষয়ে এই সঠিক প্রশ্নের উত্তর দিয়েছি । এটা দেখ. পাশাপাশি ভিজ্যুয়াল স্টুডিওতে বড় সমাধানের জন্য সেরা অনুশীলন (২০০৮)।

কপিরলোকালটিতে এটি দেখার মতো আরও কিছু তথ্য এখানে।

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

এমএসবিল্ড: নির্ভরযোগ্য বিল্ড তৈরির জন্য সেরা অনুশীলন, পার্ট 2 নিবন্ধে বৃহত উত্স গাছগুলি কীভাবে তৈরি করবেন সে সম্পর্কে আমি লিখেছি ।


8

আমার মতে, ১০০ টি প্রকল্পের সমাধান হওয়া একটি বড় ভুল। আপনি সম্ভবত সমাধানটিকে বৈধ লজিকাল ছোট ইউনিটে বিভক্ত করতে পারেন, এভাবে রক্ষণাবেক্ষণ এবং বিল্ড উভয়কেই সহজ করে।


1
ব্রুনো, দয়া করে উপরে আমার ফলোআপ প্রশ্নটি দেখুন - যদি আমরা ছোট .sln ফাইলগুলিতে বিভক্ত হই তবে আপনি কীভাবে ডিবাগ বনাম রিলিজ দিকটি পরিচালনা করবেন যা আমার রেফারেন্সের ইঙ্গিতের পথে আবদ্ধ হয়?
ডেভ মুর

1
আমি এই বিষয়টির সাথে একমত, আমি যে সমাধানটির সাথে কাজ করছি তার রয়েছে ~ 100 টি প্রকল্প, কেবলমাত্র কয়েক মুষ্টিমেয় 3 টিরও বেশি ক্লাস রয়েছে, সময়গুলি বিল্ড করা চমকপ্রদ এবং ফলস্বরূপ আমার পূর্বসূরীরা সমাধানটি 3 কে বিভক্ত করে যা পুরোপুরি বিরতি দেয় ' সমস্ত রেফারেন্স 'এবং রিফ্যাক্টরিং। পুরো জিনিসটি কয়েক মুহুর্তে কয়েক মিনিটের মতো প্রকল্পের মধ্যে ফিট হতে পারে!
জন এম

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

7

আমি অবাক হয়েছি কেউই হার্ডলিঙ্কগুলি ব্যবহারের কথা উল্লেখ করেনি। ফাইলগুলি অনুলিপি করার পরিবর্তে এটি মূল ফাইলটিতে একটি হার্ডলিঙ্ক তৈরি করে। এটি ডিস্কের স্থান বাঁচানোর পাশাপাশি বিল্ডকে দ্রুতগতিতে বাড়িয়ে তোলে। এটি নিম্নলিখিত বৈশিষ্ট্য সহ কমান্ড লাইনে সক্ষম করতে পারে:

; / P &: CreateHardLinksForAdditionalFilesIfPossible = সত্য; CreateHardLinksForCopyAdditionalFilesIfPossible = সত্য; CreateHardLinksForCopyFilesToOutputDirectoryIfPossible সত্য =; CreateHardLinksForCopyLocalIfPossible = সত্য; CreateHardLinksForPublishFilesIfPossible = সত্য

আপনি এটিকে কেন্দ্রীয় আমদানি ফাইলে যুক্ত করতে পারেন যাতে আপনার সমস্ত প্রকল্পগুলিও এই সুবিধা পেতে পারে।


5

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


4

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

সমাধানে যদি আপনার কয়েকটি প্রকল্প থাকে তবে বিল্ড প্রক্রিয়াটি আরও দ্রুত।

ভিজ্যুয়াল স্টুডিও ম্যাক্রো ব্যবহার করে বা "মেনু -> সরঞ্জাম -> বাহ্যিক সরঞ্জাম ..." দিয়ে আপনি "ম্যাট্রিক্স ডিরেক্টরিতে কপিরিকে সমাবেশ করুন" পদক্ষেপটি স্বয়ংক্রিয় করতে পারেন।


3

আপনার কপিরলোকাল মানগুলি পরিবর্তন করার দরকার নেই। আপনাকে যা করতে হবে তা হ'ল সমাধান এবং প্রিসেট all (ইউজকমনআউটপুট ডিরেক্টরী) সমস্ত প্রকল্পের জন্য একটি সাধারণ $ (আউটপুটপথ) পূর্বনির্ধারিত। এটি দেখুন: http://blogs.msdn.com/b/kirillosenkov/archive/2015/04/04/using-a-common-interedia- and-output-directory- for-your-solve.aspx


আমি নিশ্চিত না যে এটি ২০০৯ সালে ফিরে পাওয়া গিয়েছিল তবে এটি 2015 সালে খুব সুন্দরভাবে কাজ করবে বলে মনে হচ্ছে না Thanks ধন্যবাদ!
ডেভ মুর

2

কপিলোকল সেট করুন = মিথ্যা নির্মানের সময় কমিয়ে দেবে, তবে স্থাপনার সময় বিভিন্ন সমস্যার কারণ হতে পারে।

অনেক পরিস্থিতিতে আছে, যখন আপনার কপিরাইট লোকাল থাকতে হবে 'বাম থেকে সত্যে, যেমন

  • শীর্ষ স্তরের প্রকল্পগুলি,
  • দ্বিতীয় স্তরের নির্ভরতা,
  • প্রতিবিম্ব দ্বারা কল DLL

এসও প্রশ্নগুলিতে বর্ণিত সম্ভাব্য সমস্যাগুলি
" কপি- লোকালটি কখন সত্যে সেট করা উচিত এবং কখন তা করা উচিত নয়? ",
" ত্রুটি বার্তা 'অনুরোধ করা ধরণের এক বা একাধিক লোড করতে অক্ষম more আরও তথ্যের জন্য লোডারএক্সেপশন সম্পত্তি পুনরুদ্ধার করুন' ' "
এবং   হারুন-stainback এর উত্তর  এই প্রশ্নের জন্য।

কপিলোকল = মিথ্যা সেট করার সাথে আমার অভিজ্ঞতা সফল হয়নি। আমার ব্লগ পোস্টটি "স্থানীয় লোকের অনুলিপি করুন" প্রকল্পের উল্লেখগুলি মিথ্যা হিসাবে পরিবর্তন করবেন না, যদি না অনুজাগুলি না বুঝে। "

সমস্যাগুলি সমাধানের সময় কপিরাইট লোকাল = মিথ্যা সেট করার সুবিধাগুলি অতিরিক্ত ওজনের।


সেটিং CopyLocal=Falseনিশ্চিতভাবে কিছু সমস্যার কারণ ঘটবে, তবে সেগুলির সমাধান রয়েছে। এছাড়াও, আপনার নিজের ব্লগের ফর্ম্যাটিংটি ঠিক করা উচিত, এটি সবেমাত্র পাঠযোগ্য এবং সেখানে বলা হয়েছে যে "মোতায়েনের সময় সম্ভাব্য ত্রুটি সম্পর্কে <র্যান্ডম সংস্থার কাছ থেকে" আমাকে <র্যান্ডম পরামর্শদাতা "দ্বারা সতর্ক করেছিলেন" এটি কোনও যুক্তি নয়। আপনার বিকাশ দরকার।
সুজান ডুপোরন

@ জর্জেসডুপারন, সমস্যাগুলি সমাধানের সময় কপিরাইটলোকল = মিথ্যা সেট করার সুবিধাগুলি ওজনের বেশি solve পরামর্শদাতার রেফারেন্স একটি যুক্তি নয়, তবে ক্রেডিট, এবং আমার ব্লগ সমস্যাগুলি কী তা ব্যাখ্যা করে। আপনার প্রতিক্রিয়া পুনরায় জন্য ধন্যবাদ। ফর্ম্যাটিং, আমি এটি ঠিক করব।
মাইকেল ফ্রিজিম 19

1

আমি একটি সাধারণ ডিরেক্টরি তৈরি করার প্রবণতা রাখি (যেমন .. \ বিন), যাতে আমি ছোট পরীক্ষার সমাধান তৈরি করতে পারি।


1

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

<developmentMode developerInstallation="true" />

তৈরি করুন এবং প্রতিটি বিকাশকারীর ওয়ার্কস্টেশনে मशीन.config ফাইল সেট করুন in আপনাকে কেবলমাত্র যা করতে হবে তা হ'ল আপনার ফোল্ডারে কোনও নতুন সংস্করণ অনুলিপি করা যেখানে DEVPATH ভেরিয়েবল পয়েন্ট।

আপনার সমাধানটি যদি সম্ভব হয় তবে কয়েকটি ছোট সমাধানে ভাগ করুন।


আকর্ষণীয় ... ডিবাগ বনাম রিলিজ বিল্ডসের সাথে এটি কীভাবে কাজ করবে?
ডেভ মুর

আমি নিশ্চিত নই যে কোনও ডেভপথের মাধ্যমে ডিবাগ / রিলিজ অ্যাসেম্বলিগুলি লোড করার জন্য কোনও উপযুক্ত সমাধান বিদ্যমান কিনা, এটি কেবলমাত্র ভাগ করা অ্যাসেমব্লির জন্য ব্যবহার করার উদ্দেশ্যে, আমি নিয়মিত বিল্ডিংয়ের জন্য এটি প্রস্তাব দেব না। এ বিষয়টিও সচেতন থাকুন যে এই কৌশলটি ব্যবহার করার সময় অ্যাসেম্বলি সংস্করণ এবং জিএসি ওভাররাইড করা হয়।
আলেকসান্দার

1

এটি সেরা অভ্যাস নাও হতে পারে তবে আমি এইভাবেই কাজ করি।

আমি লক্ষ্য করেছি যে পরিচালিত সি ++ এর সমস্ত বাইনারিগুলি $ (সলিউশনডির) / 'ডিবাগঅররিলেজ' এ ফেলে দেয় d সুতরাং আমি আমার সমস্ত সি # প্রকল্পগুলি সেখানে ফেলে দিয়েছি। সমাধানের প্রকল্পগুলিতে সমস্ত উল্লেখের "স্থানীয় কপিরাইট" বন্ধ করে দিয়েছি। আমার ছোট 10 প্রকল্প সমাধানে আমি বিল্ড টাইম উন্নতি করেছি। এই সমাধানটি সি #, পরিচালিত সি ++, নেটিভ সি ++, সি # ওয়েবসার্ভিস এবং ইনস্টলার প্রকল্পগুলির মিশ্রণ।

হয়তো কিছু কিছু ভেঙে গেছে, তবে যেহেতু এটি কেবলমাত্র আমি কাজ করি তাই আমি তা লক্ষ্য করি না।

আমি কী ভাঙছি তা খুঁজে পাওয়া আকর্ষণীয় হবে।


0

সাধারণত, আপনি কেবল তখনই স্থানীয় কপি করতে পারেন যদি আপনি আপনার বন বনাম যে ডিএলএল ব্যবহার করে অন্য কোথাও (জিএসি, অন্যান্য প্রকল্প ইত্যাদি) ব্যবহার করে আপনার প্রকল্পটি চান using

আমি অন্যান্য লোকদের সাথে একমত হতে চাই যে আপনারও চেষ্টা করা উচিত, যদি সম্ভব হয় তবে, সমাধানটি ভেঙে ফেলার জন্য।

আপনি সেই এক সমাধানের মধ্যে নিজেকে আলাদা বিল্ড কনফিগারেশন তৈরি করতে কনফিগারেশন ম্যানেজার ব্যবহার করতে পারেন যা কেবলমাত্র প্রদত্ত প্রকল্পগুলির সেট তৈরি করবে।

এটি যদি 100 টি প্রকল্প একে অপরের উপর নির্ভর করে তবে এটি অদ্ভুত বলে মনে হবে, সুতরাং আপনার এটির বাইরে বেরিয়ে আসতে বা নিজেকে সহায়তা করার জন্য কনফিগারেশন ম্যানেজারটি ব্যবহার করতে সক্ষম হওয়া উচিত।


0

আপনার প্রকল্পগুলির রেফারেন্সগুলি ডেলগুলির ডিবাগ সংস্করণগুলিতে ইঙ্গিত করতে পারে। আপনার এমএসবিল্ড স্ক্রিপ্টের চেয়ে আপনি সেটটি সেট করতে পারেন /p:Configuration=Release, সুতরাং আপনার অ্যাপ্লিকেশন এবং সমস্ত স্যাটেলাইট অ্যাসেম্বলির একটি প্রকাশ সংস্করণ থাকবে।


1
ব্রুনো - হ্যাঁ, এটি প্রোজেক্ট রেফারেন্সের সাথে কাজ করে, যা প্রথমত 100 টি প্রকল্পের সমাধান দিয়ে আমরা ক্ষতবিক্ষত করেছিলাম reasons এটি পূর্ব-নির্মিত বিলম্বিত ডিবাগ রিলিজগুলিতে ব্রাউজ করে এমন উল্লেখগুলিতে কাজ করে না - আমি ডেবগ সমাবেশগুলির বিরুদ্ধে নির্মিত একটি রিলিজ অ্যাপ্লিকেশনটি দিয়ে আপ আপ করি - যা সমস্যা
ডেভ মুর

4
আপনার প্রজেক্ট ফাইলটি একটি পাঠ্য সম্পাদনায় সম্পাদনা করুন এবং আপনার হিন্টপ্যাথে $ (কনফিগারেশন) ব্যবহার করুন, যেমন <হিন্টপথ> .. \ আউটপুট \ $ (কনফিগারেশন) \ পরীক্ষা.ডিল </ হিন্টপথ>।
অতিবেগে

0

স্থানীয় অনুলিপি করে কোনও ডিএলএল রেফারেন্সের জন্য যদি আপনি কেন্দ্রীয় স্থান পেতে চান তবে আপনি যদি এটি না করেন তবে জিএসি ছাড়াই ব্যর্থ হবে।

http://nbaked.wordpress.com/2010/03/28/gac-alternative/


0

যদি জিএসি-র মধ্যে রেফারেন্সটি অন্তর্ভুক্ত না থাকে তবে আমাদের অবশ্যই কপি লোকাল সেট করতে হবে যাতে অ্যাপ্লিকেশনটি কাজ করতে পারে, যদি আমরা নিশ্চিত যে রেফারেন্সটি জিএসি-তে পূর্বেই ইনস্টল করা হবে তবে তা মিথ্যাতে সেট করা যেতে পারে।


0

ঠিক আছে, সমস্যাগুলি কীভাবে কার্যকর হয় তা আমি অবশ্যই জানি না, তবে আমার একটি বিল্ড সলিউশনের সাথে যোগাযোগ হয়েছিল যা নিজেকে তৈরি করতে সহায়তা করেছিল যে সমস্ত তৈরি ফাইল যেখানে প্রতীকী লিঙ্কগুলির সাহায্যে একটি র‌্যামডিস্ক লাগানো হয়েছিল ।

  • সি: \ সমাধান ফোল্ডার \ বিন -> রামডিস্ক আর: \ সমাধান ফোল্ডার \ বিন \
  • c: \ সমাধান ফোল্ডার \জেজ -> রামডিস্ক আর: \ সমাধান ফোল্ডার \ اعتراض \

  • আপনি অতিরিক্তভাবে ভিজ্যুয়াল স্টুডিওটিও বলতে পারবেন যে এটি কোনও টেম্প ডিরেক্টরিটি নির্মাণের জন্য ব্যবহার করতে পারে।

আসলে এটি যা করত তা ছিল না। তবে এটি সত্যিই আমার পারফরম্যান্স বোঝার জন্য আঘাত করেছে।
100% প্রসেসরের ব্যবহার এবং সমস্ত নির্ভরতা সহ 3 মিনিটের নিচে একটি বিশাল প্রকল্প।

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