হালনাগাদ:
আমি প্রাথমিকভাবে এই প্রশ্নের উত্তর দেওয়ার পরে বিষয়গুলি বিকশিত হয়েছে। Microsoft.NET.Sdk(অর্থাত আপনি একটি SDK ধাঁচের প্রকল্পের ব্যবহার করা আবশ্যক) এখন যোগ করার জন্য সমর্থন ভাল nuget প্যাকেজ মেটাডেটা হিসেবে যেমন সমাবেশ তথ্য সংস্করণ উভয় হ্যাশ কমিট, যদি কিছু শর্ত পূরণ করা হয়:
<SourceRevisionId>সম্পত্তি সংজ্ঞায়িত করা উচিত নয়। এটির মতো লক্ষ্য যুক্ত করে এটি করা যেতে পারে:
<Target Name="InitializeSourceControlInformation" BeforeTargets="AddSourceRevisionToInformationalVersion">
<Exec
Command="git describe --long --always --dirty --exclude=* --abbrev=8"
ConsoleToMSBuild="True"
IgnoreExitCode="False"
>
<Output PropertyName="SourceRevisionId" TaskParameter="ConsoleOutput"/>
</Exec>
</Target>
এই লক্ষ্যটি একটি কমান্ড কার্যকর করে যা SourceRevisionIdসংক্ষিপ্ত (8 অক্ষর) হ্যাশ হিসাবে সেট হবে । বিডিআরজেটস এর ফলে সমাবেশ সম্পর্কিত তথ্য সংস্করণ তৈরি হওয়ার আগেই এটি চালিত হয়।
নুগেট প্যাকেজ মেটাডেটাতে হ্যাশ অন্তর্ভুক্ত করার জন্য <RepositoryUrl>অবশ্যই সংজ্ঞা দেওয়া উচিত।
<SourceControlInformationFeatureSupported>বৈশিষ্ট্য অবশ্যই হওয়া উচিত true, এটি উত্স প্যাক টাস্কটি উত্সরেভিশনআইডিটিও বাছাই করে।
আমি এমএসবিল্ডজিটহ্যাশ প্যাকেজটি ব্যবহার করা থেকে লোকদের দূরে সরিয়ে দেব, যেহেতু এই নতুন কৌশলটি ক্লিনার এবং সবচেয়ে সুসংগত।
মূল:
আমি একটি সাধারণ নুগেট প্যাকেজ তৈরি করেছি যা আপনি আপনার প্রকল্পে অন্তর্ভুক্ত করতে পারেন যা এটি আপনার জন্য যত্ন নেবে: https://www.nuget.org/packages/MSBuildGitHash/
এই নুগেট প্যাকেজটি একটি "খাঁটি" এমএসবিল্ড সমাধান প্রয়োগ করে। আপনি যদি কোনও ন্যুগেট প্যাকেজের উপর নির্ভর না করে থাকেন তবে আপনি কেবলমাত্র এই লক্ষ্যগুলি আপনার সিএসপোজ ফাইলটিতে অনুলিপি করতে পারেন এবং এটিতে কাস্টম অ্যাসেম্বলি বৈশিষ্ট্য হিসাবে গিট হ্যাশ অন্তর্ভুক্ত করা উচিত:
<Target Name="GetGitHash" BeforeTargets="WriteGitHash" Condition="'$(BuildHash)' == ''">
<PropertyGroup>
<!-- temp file for the git version (lives in "obj" folder)-->
<VerFile>$(IntermediateOutputPath)gitver</VerFile>
</PropertyGroup>
<!-- write the hash to the temp file.-->
<Exec Command="git -C $(ProjectDir) describe --long --always --dirty > $(VerFile)" />
<!-- read the version into the GitVersion itemGroup-->
<ReadLinesFromFile File="$(VerFile)">
<Output TaskParameter="Lines" ItemName="GitVersion" />
</ReadLinesFromFile>
<!-- Set the BuildHash property to contain the GitVersion, if it wasn't already set.-->
<PropertyGroup>
<BuildHash>@(GitVersion)</BuildHash>
</PropertyGroup>
</Target>
<Target Name="WriteGitHash" BeforeTargets="CoreCompile">
<!-- names the obj/.../CustomAssemblyInfo.cs file -->
<PropertyGroup>
<CustomAssemblyInfoFile>$(IntermediateOutputPath)CustomAssemblyInfo.cs</CustomAssemblyInfoFile>
</PropertyGroup>
<!-- includes the CustomAssemblyInfo for compilation into your project -->
<ItemGroup>
<Compile Include="$(CustomAssemblyInfoFile)" />
</ItemGroup>
<!-- defines the AssemblyMetadata attribute that will be written -->
<ItemGroup>
<AssemblyAttributes Include="AssemblyMetadata">
<_Parameter1>GitHash</_Parameter1>
<_Parameter2>$(BuildHash)</_Parameter2>
</AssemblyAttributes>
</ItemGroup>
<!-- writes the attribute to the customAssemblyInfo file -->
<WriteCodeFragment Language="C#" OutputFile="$(CustomAssemblyInfoFile)" AssemblyAttributes="@(AssemblyAttributes)" />
</Target>
এখানে দুটি লক্ষ্যমাত্রা রয়েছে। প্রথমটি, "গেটজিটহ্যাশ" গিট হ্যাশটি বিল্ডহ্যাশ নামে একটি এমএসবিল্ড সম্পত্তিটিতে লোড করে, কেবলমাত্র বিল্ডহ্যাশ সংজ্ঞায়িত না হলে এটি এটি করে। আপনি যদি পছন্দ করেন তবে এটি আপনাকে কমান্ড লাইনে এমএসবিল্ডের কাছে পাঠাতে দেয়। আপনি এমএসবিল্ডের কাছে এটি পাস করতে পারেন:
MSBuild.exe myproj.csproj /p:BuildHash=MYHASHVAL
দ্বিতীয় টার্গেট, "রাইটিংগিটিহ্যাশ" "কাস্টমআস্যাব্যাসাইলআইএনফো সিএস" নামে অস্থায়ী "আপত্তি" ফোল্ডারে একটি ফাইলে হ্যাশ মান লিখবে। এই ফাইলটিতে এমন একটি লাইন থাকবে যা দেখে মনে হচ্ছে:
[assembly: AssemblyMetadata("GitHash", "MYHASHVAL")]
এই কাস্টমআস্যাবিলিজআইএনফো ফাইলগুলি আপনার সমাবেশে সংকলিত হবে, যাতে আপনি AssemblyMetadataরানটাইমটিতে সন্ধানের জন্য প্রতিবিম্বটি ব্যবহার করতে পারেন । AssemblyInfoক্লাসটি একই সমাবেশে অন্তর্ভুক্ত করা হলে এটি কীভাবে করা যায় তা নিম্নলিখিত কোডটি দেখায় ।
using System.Linq;
using System.Reflection;
public static class AssemblyInfo
{
public static string GetGitHash()
{
var asm = typeof(AssemblyInfo).Assembly;
var attrs = asm.GetCustomAttributes<AssemblyMetadataAttribute>();
return attrs.FirstOrDefault(a => a.Key == "GitHash")?.Value;
}
}
এই নকশার কিছু সুবিধা হ'ল এটি আপনার প্রকল্প ফোল্ডারে কোনও ফাইল স্পর্শ করে না, সমস্ত রূপান্তরিত ফাইলগুলি "আপত্তি" ফোল্ডারের অধীনে। আপনার প্রকল্পটি ভিজ্যুয়াল স্টুডিওর মধ্যে থেকে বা কমান্ড লাইন থেকেও অনুরূপভাবে তৈরি করবে। এটি আপনার প্রকল্পের জন্য সহজেই কাস্টমাইজ করা যায় এবং এটি আপনার সিএসপোজ ফাইলের সাথে সোর্স নিয়ন্ত্রিত হবে।