বিল্ড আউটপুটে নুগেট রেফারেন্সগুলি অনুলিপি করার জন্য আমি নেট নেট প্রকল্পগুলি কীভাবে পাব?


114

আমি .NET কোর সহ একটি প্লাগইন সিস্টেম লেখার চেষ্টা করছি, এবং আমার একটি প্রয়োজনীয়তা হ'ল ইনস্টলের জন্য ব্যবহারকারীর উপর নির্ভরতা সহ প্লাগইন ডিএলএল বিতরণ করতে সক্ষম হব।

তবে, আমি কীভাবে আমার নিউগেট নির্ভরতাগুলি বিল্ড আর্টিক্ট হিসাবে অন্তর্ভুক্ত করব এবং dotnet publishহ্যাক হিসাবে ব্যবহার না করে বিল্ড ফোল্ডারে তাদের আউটপুট আনতে পারি তা আমি বুঝতে পারি না । .Csproj ফাইল (প্রকল্প ফাইল) এ আমি এটি নির্দিষ্ট করার কোনও উপায় আছে কি?


4
কেন dotnet publishহ্যাক ব্যবহার করা হবে? পোষ্ট বিল্ড স্ক্রিপ্ট হিসাবে আপনার সিএসপোজ ফাইলটিতে কমান্ডটি অন্তর্ভুক্ত করুন।
অস্টিন ড্রেনস্কি

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

এবং <CopyToOutputDirectory>Always</CopyToOutputDirectory>প্রতিটি সিলেএসএসে আপনি যে সমস্ত ঘড়িতে সরে যেতে চান সেগুলি চালিত করে না? সম্ভবত একটি <link>নোড সঙ্গে মিলিত ?
অস্টিন ড্রেনস্কি

7
<PackageReference/>সমর্থন করে না <CopyToOutputDirectory>
ছায়রান

4
"সমগ্র ফ্রেমওয়ার্ক" যদিও .. NuGet থেকে আসে এবং যদি আপনি বিল্ড আউটপুট সব NuGet সমাহারগুলি অনুলিপি করা পছন্দ, আপনি তাদের সব .. পাবেন
মার্টিন Ullrich

উত্তর:


183

<PropertyGroup>বিল্ড আউটপুটে নুগেট অ্যাসেম্বলিগুলি অনুলিপি করার জন্য আপনি এটি আপনার সিএসপোজ ফাইলের অভ্যন্তরে যুক্ত করতে পারেন :

<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>

তবে নোট করুন যে বিল্ড আউটপুট ( bin/Release/netcoreapp*/*) বহনযোগ্য এবং বিতরণযোগ্য নয়, এর আউটপুট dotnet publish। তবে আপনার ক্ষেত্রে, বিল্ড আউটপুটে অ্যাসেম্বলিগুলি অনুলিপি করা পরীক্ষার উদ্দেশ্যে সম্ভবত খুব কার্যকর। তবে মনে রাখবেন যে আপনি DependencyContextস্থানীয় ডিরেক্টরি গণনা করার পরিবর্তে অ্যাপ্লিকেশন নির্ভরতা গ্রাফের অংশ, ডিএলএল এবং তাদের অবস্থানগুলি সমাধান করতে এপিআই ব্যবহার করতে পারেন ।


7
এটি কেবল নুগেটের ঘরের নয়, সমস্ত ঘরের অনুলিপি তৈরি করে
মোহাম্মদ দায়ান

4
কোর 2 আমি সমস্ত মাইক্রোসফ্ট ডিএলএল পেয়ে যাচ্ছি। নিশ্চিত না কেন তবে আমি কেবল নিউগেট পাচ্ছিলাম তবে তারপরে এটি করা বন্ধ হয়ে গেল? বিরক্তিকর
পাইটর কুলা

4
@ মার্টিনআলরিচ আপনি কি এখানে বিস্তারিত বলতে পারবেন DependencyContext? অ্যাপ্লিকেশন ডিরেক্টরিতে নেই এমন কোনও ডিএলএল খুঁজে পেতে আমি কীভাবে এটি ব্যবহার করতে পারি? যাইহোক কোথায়?
ygoe

4
আমার জন্য কাজ করে asp.net কোর System.ValueTuple.dll অনুলিপি না
আলী Yousefi

4
। নেট ফ্রেমওয়ার্ক প্রকল্পের জন্য অ্যালয়াউসফি সিস্টেম.ভ্যালুয়েটআপল এখনকার নেট ফ্রেমওয়ার্ক সংস্করণগুলিতে নিউগেট থেকে আর আসা উচিত নয়
মার্টিন উলরিচ

10

আপনি বিল্ডে মডিউল স্থাপনাকে স্বয়ংক্রিয় করতে পোস্ট বিল্ডইভেন্ট ব্যবহার করতে পারেন।

বিল্ড ফোল্ডারে নিউগেট অ্যাসেমব্লিগুলি পেতে আপনার মডিউলের সিএসপিজেজে অ্যাড করুন

<PropertyGroup>
    <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
</PropertyGroup>

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

<ItemGroup>
    <ModuleFiles
      Include="$(TargetDir)*.dll"
      Exclude="$(TargetDir)System*.dll;$(TargetDir)Microsoft*.dll"
      DestinationPath="$(SolutionDir)src\MyProject\Modules\MyModule\%(Filename)%(Extension)">
    </ModuleFiles>
</ItemGroup>

আপনার বিল্ড ফোল্ডারটি ডিফল্টরূপে পুনরায় সেট করুন এবং পোস্ট বিল্ডইভেন্ট যুক্ত করুন

<Target Name="PublishModule" AfterTargets="PostBuildEvent" Inputs="@(ModuleFiles)" Outputs="@(ModuleFiles->'%(DestinationPath)')">
    <WriteLinesToFile File="$(SolutionDir)src\[YOURAPP]\app_offline.htm" />
    <Copy SourceFiles="@(ModuleFiles)" DestinationFiles="@(ModuleFiles->'%(DestinationPath)')" />
    <Delete Files="$(SolutionDir)src\[YOURAPP]\app_offline.htm" />
</Target>

অ্যাপ্লিকেশনটিকে ত্রুটিযুক্ত ফাইল এড়ানোর জন্য যদি ইতিমধ্যে এটি চালিত হয় তবে আমি অ্যাপ্লিকেশনটিকে পুনরায় ব্যবহার করতে অ্যাপ_অফলাইন অন্তর্ভুক্ত করছি।


আমার প্রকল্পে আমার "মাইক্রোসফ্ট.এক্সটেনশনস.লগিং.লগ 4 নেট.এপ নেট নেট" নুগেট লাইব্রেরির উপর নির্ভরতা রয়েছে, এবং এটি নেটকোরের অংশ নয়, সুতরাং এই পদ্ধতির কাজ হবে না
sad_robot

4

যুক্ত হচ্ছে

<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>

কাজ করেনি, তবে ফ্রেমওয়ার্ক .csproj ফাইলটিতে এটি যুক্ত করুন:

<RestoreProjectStyle>PackageReference</RestoreProjectStyle>

করেছিল.


আমি। নেট ফ্রেমওয়ার্ক 4.7.2 প্রকল্পের মধ্যে থেকে নেট স্ট্যান্ডার্ড 2.0 গ্রন্থাগারগুলি উল্লেখ করার সময় এটি আমার পক্ষে ভাল কাজ করেছিল। অন্য কিছুই এটি স্থির করেনি।
গ্রুংডোন্ডোলা 7'19

3

আমি এটিকে সহজ উপায়ে "সমাধান" (চারপাশের তৈরি কাজ) করেছি।

পোস্ট বিল্ড ইন

dotnet publish "$(ProjectFileName)" --no-build -o pub
xcopy "$(ProjectDir)pub\3rdPartyProvider.*.dll" "$(OutDir)"

pub আপনি যে ফোল্ডারটি চান তা প্রকাশিত স্টাফগুলি মঞ্চায়নের জন্য যেতে হয়

দ্রষ্টব্য: আপনার কোন সংস্করণ dotnet.exeব্যবহার করা হয়েছে তার উপর নির্ভর করে কমান্ডটি --no-buildউপলভ্য নয়।

উদাহরণস্বরূপ, v2.0.3 এ উপলব্ধ নয়; এবং v2.1.402 এ উপলব্ধ। আমি জানি VS2017 আপডেট 4 এর v2.0.3 ছিল। এবং আপডেট 8 এর 2.1.x রয়েছে

হালনাগাদ:

উপরের সেটআপটি বেসিক ডিবাগ পরিবেশে কাজ করবে তবে এটি বিল্ড সার্ভার / উত্পাদন পরিবেশে রাখার জন্য আরও বেশি প্রয়োজন। এই বিশেষ উদাহরণে আমাকে সমাধান করতে হয়েছিল, আমরা বিল্ড Release|x64এবং Release|x86পৃথকভাবে। সুতরাং আমি উভয় জন্য জবাবদিহি। তবে পোস্ট বিল্ড dotnet publishকমান্ডকে সমর্থন করার জন্য , আমি প্রথম RuntimeIdentifierপ্রজেক্ট ফাইলটিতে যুক্ত করেছি।

<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
  <OutputPath>..\..\lib\</OutputPath>
  <RuntimeIdentifier>win-x64</RuntimeIdentifier>
</PropertyGroup>

<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x86'">
  <OutputPath>..\..\lib\</OutputPath>
  <RuntimeIdentifier>win-x86</RuntimeIdentifier>
</PropertyGroup>

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

সম্পূর্ণ পোস্ট বিল্ড

if not exist "$(ProjectDir)obj\$(ConfigurationName)" mkdir "$(ProjectDir)obj\$(ConfigurationName)"
xcopy  "$(ProjectDir)obj\$(PlatformName)\$(ConfigurationName)" "$(ProjectDir)obj\$(ConfigurationName)" /E /R /Y

if $(ConfigurationName) == Release (
    dotnet publish "$(ProjectFileName)" --runtime win-$(PlatformName) --no-build -c $(ConfigurationName) -o pub --no-restore --no-dependencies
) else (
    dotnet publish "$(ProjectFileName)" --no-build -c $(ConfigurationName) -o pub --no-restore --no-dependencies
)

xcopy "$(ProjectDir)pub\my3rdPartyCompany.*.dll" "$(OutDir)" /Y /R

ব্যাখ্যা: ডটনেট প্রকাশের সন্ধান করছে obj\Debugবা obj\Release। বিল্ড চলাকালীন আমাদের এটি নেই কারণ বিল্ড তৈরি করে obj\x64\Releaseবা তৈরি করে obj\x86\Release। 1 এবং 2 লাইনটি এই সমস্যাটি প্রশমিত করে। লাইন 3 এ আমি dotnet.exeনির্দিষ্ট কনফিগারেশন এবং লক্ষ্য রানটাইম ব্যবহার করতে বলি । অন্যথায়, যখন এটি ডিবাগ মোড হয়, আমি রানটাইম স্টাফ এবং সতর্কতাগুলির বিষয়ে চিন্তা করি না। এবং শেষ লাইনে আমি কেবল আমার dlls নিয়ে কপি করে আউটপুট ফোল্ডারে রাখি। কাজ শেষ.


"ডটনেট প্রকাশ" কমান্ডের জন্য "-সি রিলিজ" প্যারামিটারের প্রয়োজন যদি প্রকল্পের কোনও ডিবাগ কনফিগারেশন না থাকে (যেমন আমার ক্ষেত্রে)। সুতরাং আমি এই ব্যাচটি পোস্ট-বিল্ড ইভেন্ট হিসাবে ব্যবহার করেছি: dotnet publish "$(ProjectFileName)" -c Release --no-build -o bin\pub xcopy "$(ProjectDir)pub\PostSharp.dll" "$(OutDir)"
এক্সট্রো

0

উপরের উত্তরের সাথে একযোগে: পোস্ট-বিল্ড ইভেন্ট কমান্ড লাইনে: ভিজ্যুয়াল স্টুডিওতে আমি এই কাজটি দুর্দান্ত করেছি । এটি dlls (সিস্টেম *। Dll এবং মাইক্রোসফ্ট .dll) * এর একটি নির্বাচনের উপরে লুপ করে এবং তারপরে নির্দিষ্ট dlls মুছতে ছাড়তে পারে। System.Data.SqlClient.dll এবং System.Runtime.Loader.dll

for %%f in ($(OutDir)System*.dll $(OutDir)Microsoft*.dll) do if not %%f == $(OutDir)System.Data.SqlClient.dll if not %%f == $(OutDir)System.Runtime.Loader.dll del %%f
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.