ভিজুয়াল স্টুডিওতে হিন্টপথ বনাম রেফারেন্সপথ


120

HintPathএকটি .csproj ফাইল এবং ReferencePathএকটি .csproj.userফাইল মধ্যে পার্থক্য কি ? আমরা এমন একটি সম্মেলনে প্রতিশ্রুতিবদ্ধ হওয়ার চেষ্টা করছি যেখানে নির্ভরতা ডিএলএলগুলি একটি "রিলিজ" এসএনএন রেপোতে রয়েছে এবং সমস্ত প্রকল্পগুলি একটি নির্দিষ্ট প্রকাশের দিকে নির্দেশ করে। যেহেতু বিভিন্ন বিকাশকারীদের আলাদা আলাদা ফোল্ডার কাঠামো রয়েছে, আপেক্ষিক উল্লেখগুলি কাজ করবে না, তাই আমরা একটি নিখুঁত রেফারেন্স তৈরি করতে নির্দিষ্ট বিকাশকারীদের রিলিজ ফোল্ডারে নির্দেশ করে একটি পরিবেশের পরিবর্তনশীল ব্যবহার করার জন্য একটি স্কিম নিয়ে এসেছি। সুতরাং একটি রেফারেন্স যুক্ত হওয়ার পরে, আমরা পরিবেশের ভেরিয়েবল ব্যবহার করে নিখুঁত পথে রেফারেন্সটি পরিবর্তন করতে প্রকল্প ফাইলটি ম্যানুয়ালি সম্পাদনা করি।

আমি লক্ষ্য করেছি যে এটি উভয় HintPathএবং উভয়ই দিয়ে করা যায় ReferencePath, তবে আমি তাদের মধ্যে কেবলমাত্র পার্থক্যটি দেখতে পেলাম তা HintPathহ'ল বিল্ড-টাইমে এবং ReferencePathযখন প্রকল্পটি আইডিইতে লোড হয় তখন সমাধান করা হয়। আমি এর সত্যতা নিশ্চিত না যে এর প্রভাবগুলি কী। আমি লক্ষ্য করেছি যে ভিএস কখনও কখনও .csproj.userআবার লিখতে থাকে এবং আমাকে আবারও লিখতে হয় ReferencePath, তবে আমি নিশ্চিত নই যে এটি কী ঘটায়।

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

উত্তর:


133

এই এমএসডিএন ব্লগ অনুসারে: https://blogs.msdn.microsoft.com/manishagarwal/2005/09/28/resolving-file-references-in-team-build-part-2/

বিল্ডিংয়ের সময় সমাবেশগুলির জন্য অনুসন্ধানের আদেশ রয়েছে। অনুসন্ধানের ক্রমটি নিম্নরূপ:

  • বর্তমান প্রকল্পের ফাইলগুলি - indicated {CandidateAsorsesFiles by দ্বারা নির্দেশিত}
  • U (রেফারেন্সপথ) বৈশিষ্ট্য যা .user / টার্গেট ফাইল থেকে আসে।
  • রেফারেন্স আইটেম দ্বারা নির্দেশিত% (হিন্টপথ) মেটাডেটা।
  • লক্ষ্য ফ্রেম ডিরেক্টরি।
  • নিবন্ধসমূহে ডিরেক্টরিগুলি পাওয়া যায় যা সমাবেশফোল্ডারেক্স নিবন্ধকরণ ব্যবহার করে।
  • Assembly {সমাবেশফোল্ডারস by দ্বারা নির্দেশিত অ্যাসেমবিলি ফোল্ডারগুলি নিবন্ধিত}
  • $ (আউটপুটপথ) বা $ (আউটডির)
  • GAC

সুতরাং, যদি সমাবেশ আকাঙ্ক্ষিত দ্বারা পাওয়া যায় HintPath কিন্তু একটি বিকল্প সমাবেশ ব্যবহার করে পাওয়া যাবে ReferencePath , এটা পছন্দ করা হবে ReferencePath 'ঘ সভার HintPath ' ঘ করুন।


2
ভিএস2019-এ তারা পরিবর্তিত হয়েছে তা বাদ দিয়ে - আমরা এখন বছরের পর বছর ধরে এই সেটআপটি ব্যবহার করে আসছি। আর না. সমাধান বিল্ড ডিএল ফাইলের চেয়ে এখন রিপোজিটরি ফাইলগুলির উচ্চ অগ্রাধিকার রয়েছে - চিত্রটি যান :(
খ্রিস্টান

@ ক্রিশ্চিয়ান: সংগ্রহস্থল ফাইলগুলি কী কী? আপনার এ সম্পর্কে আরও তথ্য আছে?
পরীক্ষা করা

আমি পরীক্ষার পরে আমি বাহ্যিক রেফারেন্স পাথগুলি সম্পর্কে কথা বলছি, আপনি ভিএস-এর আপনার প্রকল্প সেটআপে সেট করতে পারেন। দুর্ভাগ্যক্রমে প্রকল্পের পরিবেশের জন্য এই ক্রেজি গুরুত্বপূর্ণ সেটিংটি (আমাদের তিনটি আলাদা পরিবেশ রয়েছে), প্রকল্পের সেটিংসে সংরক্ষণ করা যায় না; সুতরাং আপনাকে এটিকে স্পষ্টভাবে কমান্ড লাইন সংকলন স্ক্রিপ্টে প্যারামিটার হিসাবে যুক্ত করতে হবে।
খ্রিস্টান

31

Microsoft.Common.targets ফাইলটি দেখুন

প্রশ্নের উত্তরটি Microsoft.Common.targetsআপনার টার্গেট ফ্রেমওয়ার্ক সংস্করণের জন্য ফাইলটিতে রয়েছে ।

নেট ফ্রেমওয়ার্ক সংস্করণ 4.0 (এবং 4.5!) এর জন্য এসেম্বলি সন্ধানপথস-এলিমেন্টটি এভাবে সংজ্ঞায়িত করা হয়েছে:

    <!--
    The SearchPaths property is set to find assemblies in the following order:

        (1) Files from current project - indicated by {CandidateAssemblyFiles}
        (2) $(ReferencePath) - the reference path property, which comes from the .USER file.
        (3) The hintpath from the referenced item itself, indicated by {HintPathFromItem}.
        (4) The directory of MSBuild's "target" runtime from GetFrameworkPath.
            The "target" runtime folder is the folder of the runtime that MSBuild is a part of.
        (5) Registered assembly folders, indicated by {Registry:*,*,*}
        (6) Legacy registered assembly folders, indicated by {AssemblyFolders}
        (7) Resolve to the GAC.
        (8) Treat the reference's Include as if it were a real file name.
        (9) Look in the application's output folder (like bin\debug)
    -->
<AssemblySearchPaths Condition=" '$(AssemblySearchPaths)' == ''">
  {CandidateAssemblyFiles};
  $(ReferencePath);
  {HintPathFromItem};
  {TargetFrameworkDirectory};
  {Registry:$(FrameworkRegistryBase),$(TargetFrameworkVersion),$(AssemblyFoldersSuffix)$(AssemblyFoldersExConditions)};
  {AssemblyFolders};
  {GAC};
  {RawFileName};
  $(OutDir)
</AssemblySearchPaths>

। নেট ফ্রেমওয়ার্ক 3.5 এর জন্য সংজ্ঞাটি একই, তবে মন্তব্যটি ভুল। ২.০ সংজ্ঞাটি কিছুটা আলাদা, এটি $ (আউটডায়ার) এর পরিবর্তে $ (আউটপুটপথ) ব্যবহার করে।

আমার মেশিনে আমার কাছে মাইক্রোসফ্ট.কমন.টারজেটস ফাইলটির নিম্নলিখিত সংস্করণ রয়েছে:

C:\Windows\Microsoft.NET\Framework\v2.0.50727\Microsoft.Common.targets
C:\Windows\Microsoft.NET\Framework\v3.5\Microsoft.Common.targets
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets

C:\Windows\Microsoft.NET\Framework64\v2.0.50727\Microsoft.Common.targets
C:\Windows\Microsoft.NET\Framework64\v3.5\Microsoft.Common.targets
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Microsoft.Common.targets

এটি উইন্ডোজ 7 এ ইনস্টল করা ভিজ্যুয়াল স্টুডিও 2008, 2010 এবং 2013 এর সাথে।

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


আমার একই সমস্যা রয়েছে, এই ক্ষেত্রে, আমি dll ফাইলগুলি কোথায় রাখব? ফ্রেমওয়ার্ক বা ফ্রেমওয়ার্ক 64? stackoverflow.com/questions/45945579/…
চেতন সচদেব

5

আমার নিজের অভিজ্ঞতাটি হ'ল দুটি ধরণের সমাবেশ সংক্রান্ত রেফারেন্সগুলির মধ্যে একটির কাছে থাকা ভাল:

  • বর্তমান বিল্ড ডিরেক্টরিতে একটি 'স্থানীয়' সমাবেশ
  • জিএসি-তে একটি সমাবেশ

খুব সহজেই নষ্ট হয়ে যেতে পারে বা বিরক্তিকর রক্ষণাবেক্ষণের প্রয়োজনীয়তা রাখার জন্য আমি অন্যান্য পদ্ধতিগুলি (আপনার বর্ণনার মতোই) পেয়েছি।

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

এটি এখনও পর্যন্ত আমার কোনও সমস্যা দেয়নি। যদিও আমি নিশ্চিত যে এমন পরিস্থিতি কাজ করবে না যেখানে কোনও সমস্যা হবে না, তবে যে কোনও সমস্যার স্বাভাবিক উত্তর "ওহ, কেবল এটি জিএসি!" হয়েছে! 8 ডি

আশা করি এইটি কাজ করবে!


1

যদিও এটি একটি পুরানো নথি, তবে এটি আমাকে 'মেশিনপথ' অন্য মেশিনে উপেক্ষা করার সমস্যা সমাধানে সহায়তা করেছে। কারণ কারণ রেফারেন্সড ডিএলএল পাশাপাশি উত্স নিয়ন্ত্রণে থাকাও প্রয়োজন:

https://msdn.microsoft.com/en-us/library/ee817675.aspx#tdlg_ch4_includeoutersystemassemblieswithprojects

উদ্ধৃতাংশ:

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