একটি। নেট dll এ এম্বেড গিট কমিট হ্যাশ


107

আমি গিটকে আমার সংস্করণ নিয়ন্ত্রণ হিসাবে ব্যবহার করে একটি সি # অ্যাপ্লিকেশন তৈরি করছি।

আমি যখন আমার অ্যাপ্লিকেশনটি তৈরি করব তখন এক্সিকিউটেবলের মধ্যে শেষ প্রতিশ্রুতিবদ্ধ হ্যাশটি স্বয়ংক্রিয়ভাবে এম্বেড করার কোনও উপায় আছে?

উদাহরণস্বরূপ, কনসোলটিতে কমিট হ্যাশ মুদ্রণ করা দেখতে এরকম কিছু দেখাচ্ছে:

class PrintCommitHash
{
    private String lastCommitHash = ?? // What do I put here?
    static void Main(string[] args)
    {
        // Display the version number:
        System.Console.WriteLine(lastCommitHash );
    }
}

দ্রষ্টব্য যে এটি রানটাইম নয়, নির্মাণের সময় করতে হবে , কারণ আমার মোতায়েন এক্সিকিউটেবলের গিট রেপো অ্যাক্সেসযোগ্য হবে না।

সি ++ এর জন্য সম্পর্কিত একটি প্রশ্ন এখানে পাওয়া যাবে

সম্পাদনা

প্রতি @ mattanja অনুরোধ, আমি Git হুক স্ক্রিপ্ট আমি আমার প্রকল্পে ব্যবহার পোস্টিং করছি। সেটআপ:

  • হুকগুলি লিনাক্স শেল স্ক্রিপ্ট, যা নীচে স্থাপন করা হয়: path_to_project g .git \ হুক
  • আপনি যদি এমএসজিগিট ব্যবহার করেন তবে হুক ফোল্ডারে ইতিমধ্যে কিছু নমুনা স্ক্রিপ্ট রয়েছে। তাদের গিট কল করতে, স্ক্রিপ্টের নাম থেকে '.স্যাম্পল' এক্সটেনশনটি সরিয়ে দিন।
  • হুক স্ক্রিপ্টগুলির নামগুলি ইভেন্টটির সাথে মেলে যা তাদের ডাকে। আমার ক্ষেত্রে, আমি পোস্ট-কমিট এবং পোস্ট-মার্জটি সংশোধন করেছি
  • আমার এসেম্বলিআইএনফো ফাইলগুলি সরাসরি প্রকল্পের পথের অধীনে ( .git ফোল্ডারের সমান স্তর )। এটিতে 23 টি লাইন রয়েছে এবং আমি 24 তমটি তৈরি করতে গিট ব্যবহার করি।

আমার লিনাক্স-শেলিংটি কিছুটা মরিচা হয়ে উঠার সাথে সাথে স্ক্রিপ্টটি অস্থায়ী ফাইলটিতে এসেম্বলিআইনফো.কমের প্রথম 23-লাইনগুলি পড়ে , গিট হ্যাশটিকে শেষ লাইনে প্রতিধ্বনিত করে, এবং ফাইলটিকে এসেম্বলিআইএনফো- সি-তে পুনরায় নামকরণ করে । আমি নিশ্চিত যে এটি করার আরও ভাল উপায় আছে:

#!/bin/sh
cmt=$(git rev-list --max-count=1 HEAD)
head -23 AssemblyInfo.cs > AssemblyInfo.cs.tmp
echo [assembly: AssemblyFileVersion\(\"$cmt\"\)] >> AssemblyInfo.cs.tmp
mv AssemblyInfo.cs.tmp AssemblyInfo.cs

আশাকরি এটা সাহায্য করবে.

উত্তর:


64

সংস্করণগুলি ট্র্যাক করতে আমরা গিটে ট্যাগ ব্যবহার করি।

git tag -a v13.3.1 -m "version 13.3.1"

আপনি এই মাধ্যমে গিট থেকে হ্যাশ সহ সংস্করণটি পেতে পারেন:

git describe --long

আমাদের বিল্ড প্রক্রিয়াটি গিট হ্যাশকে এসেম্বলিআইএনফো সিএস ফাইলের অ্যাসেম্বলি ইনফরমেশনাল ভার্শন বৈশিষ্ট্যটিতে রাখে:

[assembly: AssemblyInformationalVersion("13.3.1.74-g5224f3b")]

একবার সঙ্কলন করার পরে, আপনি উইন্ডোজ এক্সপ্লোরার থেকে সংস্করণটি দেখতে পারেন:

এখানে চিত্র বর্ণনা লিখুন

আপনি প্রোগ্রামের মাধ্যমে এটিও পেতে পারেন:

var build = ((AssemblyInformationalVersionAttribute)Assembly
  .GetAssembly(typeof(YOURTYPE))
  .GetCustomAttributes(typeof(AssemblyInformationalVersionAttribute), false)[0])
  .InformationalVersion;

যেখানে আপনার বাছাইটি হ'ল বিধানসভায় যে কোনও ধরণের যা বিধানসভা সম্পর্কিত তথ্য সংস্করণ বৈশিষ্ট্যযুক্ত।


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

4
আমরা আমাদের বিল্ডটি স্বয়ংক্রিয় করতে রুবি (রেক) ব্যবহার করি। আমাদের রেক বিল্ড টাস্কগুলির মধ্যে একটি সাধারণ অ্যাসোসিয়েশনআইএনফো ফাইলগুলি আপডেট করে যা সমাধানে সমস্ত প্রকল্পে ব্যবহৃত হয়। টাস্কটি অ্যালব্যাকোর ব্যবহার করে কমনএস্প্যাশনআইএনফো ফাইলগুলি উত্পন্ন করে - github.com/derickbailey/Albacore অ্যাসেম্বলইনফোর মানগুলির মধ্যে একটি যে টাস্ক সেট করে তা হ'ল এসেম্বলি ইনফরমেশনাল ভার্শন
হ্যান্ডক্র্যাফটসম্যান

4
@ জন যিশু - অলস ব্যাজারের পরামর্শ অনুসারে, আপনি কমিট / মার্জ ইত্যাদির পরে এসেম্বলিআইএনফো কোডগুলি পরিবর্তন করতে গিট হুক ব্যবহার করতে পারেন (এটি আমি শেষ করেছিলাম)) দেখুন kernel.org/pub/software/scm/git/docs/githooks.html
bavaza

শুধু এফওয়াইআই, অ্যালব্যাকোর
kornman00

5
নিম্নলিখিত প্রকল্প https://github.com/jeromerg/NGitVersionGlobalAssemblyInfo.* সি # এবং সি ++ প্রকল্পের জন্য সংকলন সময়ে ফাইল উত্পন্ন করার জন্য একটি সম্পূর্ণ সমাধান সরবরাহ করে : ডিফল্টরূপে, উত্পন্ন সমাবেশে সংস্করণটি রয়েছে: কমিট হ্যাশ, একটি পতাকা স্থানীয় পরিবর্তনের ইঙ্গিত দেয় এবং একটি সংগ্রহ থেকে সংগ্রহের পরিমাণকে বর্তমান প্রতিশ্রুতি থেকে শুরু করে commit
jeromerg

78

আপনি এক্সিকিউটেবলের মধ্যে একটি version.txt ফাইল এম্বেড করতে পারেন এবং তারপরে এক্সিকিউটেবলের বাইরে version.txt পড়তে পারেন । Version.txt ফাইল তৈরি করতে , ব্যবহার করুনgit describe --long

পদক্ষেপ এখানে:

গিট কল করতে একটি বিল্ড ইভেন্ট ব্যবহার করুন

  • প্রকল্পে ডান ক্লিক করুন এবং বৈশিষ্ট্য নির্বাচন করুন

  • ইভেন্টগুলি তৈরিতে, প্রাক-বিল্ড ইভেন্ট যুক্ত করুন (উদ্ধৃতিগুলি লক্ষ্য করুন):

    "সি: \ প্রোগ্রাম ফাইলগুলি \ গিট \ বিন \ git.exe" --long> "$ (প্রজেক্টডির) \ version.txt" বর্ণনা করে

    এটি আপনার প্রকল্প ডিরেক্টরিতে একটি version.txt ফাইল তৈরি করবে ।

এক্সিকিউটেবলের মধ্যে version.txt এম্বেড করুন

  • প্রকল্পে ডান ক্লিক করুন এবং বিদ্যমান আইটেম যোগ করুন নির্বাচন করুন
  • যোগ version.txt ফাইল (আপনি সকল ফাইল দেখুন ফাইলটি চয়নকারী ফিল্টার পরিবর্তন)
  • Version.txt যুক্ত হওয়ার পরে , সমাধান এক্সপ্লোরারে এটিতে ডান ক্লিক করুন এবং বৈশিষ্ট্যগুলি নির্বাচন করুন
  • এম্বেডেড রিসোর্সে বিল্ড অ্যাকশনটি পরিবর্তন করুন
  • সর্বদা অনুলিপি করতে আউটপুট ডিরেক্টরিতে অনুলিপি করুন
  • যোগ version.txt আপনার টু .gitignore ফাইল

এম্বেড থাকা পাঠ্য ফাইলের সংস্করণ স্ট্রিং পড়ুন

এম্বেড থাকা পাঠ্য ফাইলের সংস্করণ স্ট্রিংটি পড়তে এখানে কয়েকটি নমুনা কোড রয়েছে:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Reflection;

namespace TryGitDescribe
{
    class Program
    {
        static void Main(string[] args)
        {
            string gitVersion= String.Empty;
            using (Stream stream = Assembly.GetExecutingAssembly()
                    .GetManifestResourceStream("TryGitDescribe." + "version.txt"))
            using (StreamReader reader = new StreamReader(stream))
            {
                gitVersion= reader.ReadToEnd();
            }

            Console.WriteLine("Version: {0}", gitVersion);
            Console.WriteLine("Hit any key to continue");
            Console.ReadKey();
        }
    }
}

9
এই পদ্ধতির যুক্তিসঙ্গতভাবে ভাল কাজ করে। যদিও আমি "গিট রেভ-পার্স - শর্ট হেড" ব্যবহার করেছি।
ব্রায়ান রিয়েটার

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

7
আমি ব্যবহার করি git describe --dirty, যা বিকাশকারীরা যখন নোংরা কাজের গাছের সাথে কাজ করছে তখন একটি পতাকা যুক্ত করে।
পৌলমনিকো

4
@ ট্যামসজেলেই প্রকল্পটির নাম স্থান ট্রাইজিটডেসক্রাইব। ভার্সন.টিএসটিএক্স ফাইল এক্সিকিউটেবল / অ্যাসেম্বলিটি আর্টিক্টে এম্বেড হওয়ার পরে, নামটি বের করার জন্য আপনার নাম স্থানটি আগেই চাপতে হবে।
জন যিশু

4
সম্পূর্ণ সমাধানের জন্য আপনাকে ধন্যবাদ। আমার ক্ষেত্রে আমি GetEntryAssemblyসমাবেশ পেতে ব্যবহৃত । GetName().Nameনামটি হার্ডকোডিং এড়াতে আপনি যে কোনও ক্ষেত্রে কল করতে পারেন ।
নভোচারী

56

হালনাগাদ:

আমি প্রাথমিকভাবে এই প্রশ্নের উত্তর দেওয়ার পরে বিষয়গুলি বিকশিত হয়েছে। Microsoft.NET.Sdk(অর্থাত আপনি একটি SDK ধাঁচের প্রকল্পের ব্যবহার করা আবশ্যক) এখন যোগ করার জন্য সমর্থন ভাল nuget প্যাকেজ মেটাডেটা হিসেবে যেমন সমাবেশ তথ্য সংস্করণ উভয় হ্যাশ কমিট, যদি কিছু শর্ত পূরণ করা হয়:

  1. <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 অক্ষর) হ্যাশ হিসাবে সেট হবে । বিডিআরজেটস এর ফলে সমাবেশ সম্পর্কিত তথ্য সংস্করণ তৈরি হওয়ার আগেই এটি চালিত হয়।

  1. নুগেট প্যাকেজ মেটাডেটাতে হ্যাশ অন্তর্ভুক্ত করার জন্য <RepositoryUrl>অবশ্যই সংজ্ঞা দেওয়া উচিত।

  2. <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 &gt; $(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
{
    /// <summary> Gets the git hash value from the assembly
    /// or null if it cannot be found. </summary>
    public static string GetGitHash()
    {
        var asm = typeof(AssemblyInfo).Assembly;
        var attrs = asm.GetCustomAttributes<AssemblyMetadataAttribute>();
        return attrs.FirstOrDefault(a => a.Key == "GitHash")?.Value;
    }
}

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


4
এটি পুরোপুরি কাজ করে। আমি nuget প্যাকেজ ইনস্টল এবং Git হ্যাশ ব্যবহার বৈঠাচালনা আউট করতে সক্ষম হন Assembly.GetExecutingAssembly(), তাহলে সমাবেশ পরীক্ষা CustomAttributes
গ্যাভিন এইচ

4
এটি যদি আমার প্রশ্ন হত তবে আমি এই উত্তরটি গ্রহণ করতাম। দুর্দান্ত জিনিস।
ড্রয় নোকস

4
@ গ্যাভিনএইচ, আপনি কীভাবে পেলেন GitHash? আমি সেই মানটি দেখতে পাচ্ছি তবে নাম অনুসারে কাস্টম অ্যাট্রিবিউট পাওয়ার জন্য কি কোনও শুদ্ধ পদ্ধতি আছে? মনে হচ্ছে আমাকে দীর্ঘ লিখতে হবে যেখানে CustomAttributesধন্যবাদ জিজ্ঞাসা করুন query
ওকান কোসিগিত

4
@ উদ্যানমাইজারের "ইউজমার্জ / সিঙ্গেলঅ্যাস্পাবলনেম" কী তা আমার কোনও ধারণা নেই, তাই আমি আপনাকে সহায়তা করতে পারি না। Github.com/MarkPflug/MSBuildGitHash এ একটি সমস্যা তৈরি করুন এবং আমি এটি একবার দেখে নিতে পারি (এটি কোনও প্রতিশ্রুতি নয়)।
MarkPflug

4
আধুনিক উত্তরের জন্য ধন্যবাদ - এটি করার জন্য সত্যিই পরিষ্কার উপায়। ভবিষ্যতের যে কোনও পাঠকের কাছে আমার একই সমস্যা রয়েছে: আমার এটি কাজ করার জন্য (এসডিকে প্রকল্পের পদ্ধতির জন্য), আমারও IncludeSourceRevisionInInformationalVersionসম্পত্তিটির প্রয়োজন ছিল, এবং আমারও SourceRevisionIdইনিশিয়ালসোর্স কনট্রোল ইনফরমেশন লক্ষ্য নির্ধারণ করতে হয়নি, তবে একটিতে পৃথক লক্ষ্য সঙ্গে ঘোষিত BeforeTargets="InitializeSourceControlInformation"
glen3b

14

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

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

উদাহরণস্বরূপ যা আপনার গিট-হ্যাশটিকে আপনার সমাবেশে যুক্ত করবে ইনফরমেশন ভার্সনটি হ'ল: আপনার প্রকল্পের সেটিংসে:

এখানে চিত্র বর্ণনা লিখুন

আপনার প্রকল্পের অ্যাসেম্বলিআইএনফো। সিগুলিতে আপনি লাইনটি পরিবর্তন / যুক্ত করেছেন:

[সমাবেশ: সমাবেশ সম্পর্কিত তথ্য সংস্করণ ("1.1। min dmin: 2015}। sh chash: 6} {!} - {শাখা}")]]

প্রদর্শিত স্ক্রিনশটে আমি বাহ্যিক / বিন ফোল্ডারে নেটরভিশনটাইম.এক্সএতে চেক করেছি

বিল্ড করার পরে, আপনি যদি তারপর আপনার বাইনারিটিকে ডান ক্লিক করেন এবং বৈশিষ্ট্যে যান তবে আপনার নীচের মতো কিছু দেখতে হবে:

এখানে চিত্র বর্ণনা লিখুন

আশা করি এটি কাউকে সাহায্য করবে


আমার কাছে প্রতিশ্রুতিবদ্ধ হ্যাশটি সর্বদা 00000 হিসাবে শেষ হয় I আমি ভেবেছিলাম এটি ছিল কারণ আমার অনিবার্য পরিবর্তন হয়েছে তবে এখনও একই। কোন ধারণা কেন?
ভিক্টর

4
সমস্যাটি ছিল নেটরভিশনটি আমার গিটটি কার্যকর করার যোগ্য খুঁজে পাচ্ছিল না। কারণটি হ'ল আমরা SourceTree ব্যবহার করছি এবং গিটটি এর সাথে এম্বেড হয়। সমাধানটি হ'ল git.exe এবং libiconv-2.dll থেকে% USERPROFILE% \ অ্যাপডাটা \ লোকাল \ আটলাসিয়ান \ উত্সট্রি \ git_local \ বিন থেকে নেটরভিশন.এক্সেযুক্ত ফোল্ডারে copy আমাকে এর মতো ইভেন্টগুলিও সংশোধন করতে হয়েছিল: প্রাক-বিল্ড ইভেন্ট: সিডি $ (প্রজেক্টডির) লাইব্রেরিগুলি নেটরভিশনটুল.এক্সে / প্যাচ $ (প্রজেক্টডির) পোস্ট-বিল্ড ইভেন্ট: সিডি $ (প্রজেক্টডির) লাইব্রেরিগুলি নেটরিভিশনটুল.এক্সে / পুনরুদ্ধার $ (প্রকল্পের)
ভিক্টর

কেবলমাত্র ভবিষ্যতের রেফারেন্সের জন্য, প্রকল্পের রেপো ইউআরএল কিছু সময় আগে github.com/ygoe/NETRevisionTool এ পরিবর্তিত হয়েছে । শ্রেণিবদ্ধ.সফটওয়্যার / অ্যাপস / নেটরেভিশনটোলে আরও তথ্য পাওয়া যায় ।
ygoe

14

আমি মনে করি এই প্রশ্নটি একটি ধাপে ধাপে উত্তর দেওয়ার উপযুক্ত। এখানে কৌশলটি হ'ল প্রাক-বিল্ড ইভেন্টগুলি থেকে একটি পাওয়ারশেল স্ক্রিপ্ট চালানো যা কোনও টেম্পলেট ফাইল গ্রহণ করে এবং গিট ট্যাগ + কমিট গণনা তথ্য অন্তর্ভুক্ত সহ એસেম্বলিআইএনফো ফাইলগুলি উত্পন্ন করে।

পদক্ষেপ 1: আপনার আসল এসেম্বলিআইএনফো-এর উপর ভিত্তি করে এই প্রকল্পটি \ প্রোপার্টি ফোল্ডারে একটি असিবেলিআইফোন_টেম্পলেট.সি ফাইল ফাইল করুন তবে এতে রয়েছে:

[assembly: AssemblyVersion("$FILEVERSION$")]
[assembly: AssemblyFileVersion("$FILEVERSION$")]
[assembly: AssemblyInformationalVersion("$INFOVERSION$")]

পদক্ষেপ 2: ইনজেক্টজিটভিশন.পিএস 1 নামে একটি পাওয়ারশেল স্ক্রিপ্ট তৈরি করুন যার উত্স:

# InjectGitVersion.ps1
#
# Set the version in the projects AssemblyInfo.cs file
#


# Get version info from Git. example 1.2.3-45-g6789abc
$gitVersion = git describe --long --always;

# Parse Git version info into semantic pieces
$gitVersion -match '(.*)-(\d+)-[g](\w+)$';
$gitTag = $Matches[1];
$gitCount = $Matches[2];
$gitSHA1 = $Matches[3];

# Define file variables
$assemblyFile = $args[0] + "\Properties\AssemblyInfo.cs";
$templateFile =  $args[0] + "\Properties\AssemblyInfo_template.cs";

# Read template file, overwrite place holders with git version info
$newAssemblyContent = Get-Content $templateFile |
    %{$_ -replace '\$FILEVERSION\$', ($gitTag + "." + $gitCount) } |
    %{$_ -replace '\$INFOVERSION\$', ($gitTag + "." + $gitCount + "-" + $gitSHA1) };

# Write AssemblyInfo.cs file only if there are changes
If (-not (Test-Path $assemblyFile) -or ((Compare-Object (Get-Content $assemblyFile) $newAssemblyContent))) {
    echo "Injecting Git Version Info to AssemblyInfo.cs"
    $newAssemblyContent > $assemblyFile;       
}

পদক্ষেপ 3: একটি বিল্ডস্ক্রিপ্ট ফোল্ডারে আপনার সমাধান ডিরেক্টরিতে InjectGitVersion.ps1 ফাইলটি সংরক্ষণ করুন

পদক্ষেপ 4: প্রকল্পের প্রাক-বিল্ড ইভেন্টগুলিতে নিম্নলিখিত লাইনটি যুক্ত করুন

powershell -ExecutionPolicy ByPass -File  $(SolutionDir)\BuildScripts\InjectGitVersion.ps1 $(ProjectDir)

পদক্ষেপ 5: আপনার প্রকল্প তৈরি করুন।

পদক্ষেপ:: allyচ্ছিকভাবে, আপনার গিট উপেক্ষা ফাইলটিতে এসেম্বলিআইএনফো সি


এবং আপনার গিট ট্যাগগুলি ফাইল সংস্করণগুলির সাথে সামঞ্জস্য করার কথা মনে রাখবেন: যেমন 1.2.3। আপনার যদি আরও জটিল ট্যাগ থাকে তবে আপনাকে কেবল সামঞ্জস্যপূর্ণ অংশগুলি বের করতে হবে
আতিলিও জবসন

4
কোনও টেম্পলেট ব্যবহার করার পরিবর্তে এবং গিটিংগোরিংয়ের আসলটি স্থানে AssemblyInfo.csপরিবর্তন করতে পারে AssemblyInfo.cs, তৈরি করতে পারে , তারপরে AssemblyInfo.csশেষ প্রত্যাবর্তিত সংস্করণে গিট রিসেট করতে পারে। সুতরাং রেপোতে সর্বদা থাকত AssemblyInfo.cs, $..$কেবলমাত্র নির্মাণের সময় পরিবর্তিত।
কুবা ওয়াইরোস্টেক

এটি দুর্দান্ত কাজ করেছে। আমি git describe --match "v[0-9]*" --long --always --dirtyনির্দিষ্ট ট্যাগগুলিতে (একটি সংস্করণ নম্বরযুক্ত) ফিল্টার করে এবং কার্যকারী গাছটি পরিষ্কার ছিল কিনা তা বোঝাতে শেষ করেছিলাম ।
প্যাকোম্যান

আপনাকে পিএস স্ক্রিপ্টে আপনার রেজিএক্সও সংশোধন করতে হবে:$gitVersion -match '[v](.*)-(\d+)-[g](.+)$';
প্যাকোম্যান

4

এমএসবিল্ডের জন্য .NET রিভিশন টাস্ক এবং ভিজ্যুয়াল স্টুডিও 2019 এর সাথে কাজ করার মাধ্যমে এটি এখন খুব সহজ ।

কেবল ইনস্টল করুন NuGet প্যাকেজ Unclassified.NetRevisionTask , তারপর তথ্য আপনি চান কনফিগার AssemblyInfo.csবর্ণনা অনুযায়ী ফাইল GitHub ডকুমেন্টেশন

আপনি যদি কেবল সর্বশেষ প্রতিশ্রুতি (দৈর্ঘ্য = 8) এর হ্যাশ চান:

[assembly: AssemblyInformationalVersion("1.0-{chash:8}")]

আপনার প্রকল্প / সমাধান তৈরি করুন এবং আপনার এর মতো কিছু থাকবে:

এখানে চিত্র বর্ণনা লিখুন


NET.core অ্যাপ্লিকেশনটিতে ফর্ম্যাটটি কনফিগার করার জন্য README github.com/ygoe/NETRevisionTask/blob/master/README.mdPropertyGroup
sc911

3

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

এটি করার একটি উপায় AssemblyInfo.cs.tmplহ'ল SH GITSHA say যেমন আপনার SHA এর জন্য একটি স্থানধারক সহ একটি টেম্পলেট ফাইল তৈরি করা eg

[assembly: AssemblyDescription("$$GITSHA$$")]

আপনার প্রাক বিল্ড হুক এর পরে এই স্থানধারকটিকে প্রতিস্থাপন করতে হবে এবং সি # সংকলকটি বাছাইয়ের জন্য এসেম্বলিআইএনফো ফাইলগুলি আউটপুট করতে হবে।

এসভিএন-এর জন্য সাবডাব্লুসিআরসিভ ব্যবহার করে এটি কীভাবে করা যায় তা দেখতে এই উত্তরটি দেখুন । গিটের জন্য অনুরূপ কিছু করা কঠিন হবে না।

উল্লিখিত হিসাবে অন্যান্য উপায়গুলি হ'ল "মেক স্টেজ", যেমন একটি এমএসবিল্ড টাস্ক লিখুন যা অনুরূপ কিছু করে। তবুও অন্য উপায় হতে পারে কোনওভাবে ডিএলএল পোস্ট করার প্রক্রিয়া করা যেতে পারে (ইল্ডাস্ম + ইলस्म বলতে) তবে আমি মনে করি উপরে উল্লিখিত বিকল্পগুলি সম্ভবত সবচেয়ে সহজ।


@ উইন্ট নং, উত্পন্ন এসেম্বলিআইএনফো.কে গিটে যোগ করবেন না। পি: যদি আপনি না এটি একটি অ-মলিন নির্মান করছ করা অসম্ভব হবে
jokedst

3

সম্পূর্ণ স্বয়ংক্রিয় এবং নমনীয় পদ্ধতির চেকআউট https://github.com/Fody/Stamp এর জন্য । আমরা আমাদের গিট প্রকল্পগুলির জন্য এটির পাশাপাশি সফলভাবে এই সংস্করণটি ব্যবহার করেছি এসভিএন প্রকল্পগুলির জন্য )

আপডেট: স্ট্যাম্পের পর থেকে এটি পুরানো


4
স্ট্যাম্পের গিথুব পৃষ্ঠায় ody রক্তাক্ত এটি বলে: "এই প্রকল্পটি আর রক্ষণাবেক্ষণ করা হবে না।" এটি আমার প্রকল্পে অন্তর্ভুক্ত করে একটি CA0052 এবং CA0055 উত্থাপন করেছে
sc911

2

কমিট হ্যাশ দিয়ে সমস্ত অ্যাসেম্বলিনফো ফাইল আপডেট করতে আপনি পাওয়ারশেল ওয়ান-লাইনার ব্যবহার করতে পারেন।

$hash = git describe --long --always;gci **/AssemblyInfo.* -recurse | foreach { $content = (gc $_) -replace "\[assembly: Guid?.*", "$&`n[assembly: AssemblyMetadata(`"commithash`", `"$hash`")]" | sc $_ }

1
  1. আমি আশা করি আপনি বিল্ড-টাইমে বাহ্যিক প্রোগ্রামগুলি এবং ইন্টারসেপ্ট আউটপুটকে কল করতে জানেন know
  2. আমি আশা করি আপনি কীভাবে গিটের কার্যক্ষম ডিরেক্টরিতে যাবেন তা রূপান্তরিত ফাইলগুলিকে উপেক্ষা করবেন।

@ Learath2 দ্বারা উল্লিখিত হিসাবে, আউটপুট git rev-parse HEADআপনাকে প্লেইন হ্যাশ দেবে।

আপনি যদি গিট-সংগ্রহস্থলগুলিতে ট্যাগ ব্যবহার করেন (এবং আপনি ট্যাগ ব্যবহার করেন তবে এটি এর চেয়ে বেশি বর্ণনামূলক এবং পঠনযোগ্য নয় git rev-parse), আউটপুটটি প্রাপ্ত হতে পারে git describe(পরে সফলভাবে ব্যবহার করার পরেওgit checkout )

আপনি রেভ-পার্স কল করতে পারেন | এতে বর্ণনা করুন:


0

আমি স্বীকৃত উত্তর এবং একটি ছোট অ্যাডিশনের সংমিশ্রণটি ব্যবহার করছি। আমার অটোটি 4 এক্সটেনশন ইনস্টল আছে ( https://marketplace.visualstudio.com/items?itemName=BennorMcCarthy.AutoT4বিল্ড করার আগে টেমপ্লেটগুলি পুনরায় চালানোর জন্য )।

জিআইটি থেকে সংস্করণ পাচ্ছেন

আমি git -C $(ProjectDir) describe --long --always > "$(ProjectDir)git_version.txt"প্রকল্পের বৈশিষ্ট্য আমার প্রাক বিল্ড ইভেন্টে। Git_version.txt এবং VersionInfo.cs .gitignore এ যুক্ত করা বেশ ভাল ধারণা।

মেটাডেটা এম্বেডিং সংস্করণ

আমি VersionInfo.ttআমার প্রকল্পে একটি টেম্পলেট যুক্ত করেছি:

<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.IO" #>
<#@ output extension=".cs" #>

using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

<#
if (File.Exists(Host.ResolvePath("git_version.txt")))
{
    Write("[assembly: AssemblyInformationalVersion(\""+ File.ReadAllText(Host.ResolvePath("git_version.txt")).Trim() + "\")]");
}else{
    Write("// version file not found in " + Host.ResolvePath("git_version.txt"));
}

#>

এখন আমার কাছে "প্রোডাক্ট ভার্সন" এ আমার গিট ট্যাগ + হ্যাশ রয়েছে।


0

অন্য উত্তরটি উল্লেখ করে ( https://stackoverflow.com/a/44278482/4537127 ) আমি অটোটি 4 ছাড়াই VersionInfo.ttউত্পন্ন করার জন্য পাঠ্য টেমপ্লেটটিও ব্যবহার AssemblyInformationalVersionকরেছি।

(আমার সি # ডাব্লুপিএফ অ্যাপ্লিকেশনটিতে কমপক্ষে কাজ করে)

সমস্যাটি হ'ল প্রাক-বিল্ড ইভেন্টগুলি টেম্পলেট রূপান্তরের পরে পরিচালিত হয়েছিল, তাই ক্লোনিংয়ের পরেও git_version.txtফাইলটি ছিল না এবং বিল্ড ব্যর্থ হয়। রূপান্তর একবারে পাস করার জন্য ম্যানুয়ালি এটিকে তৈরি করার পরে, এটি রূপান্তরের পরে আপডেট হয়েছিল এবং সর্বদা এটির পিছনে একটি প্রতিশ্রুতি ছিল

আমাকে .csproj ফাইলটিতে দুটি সমন্বয় করতে হয়েছিল (এটি কমপক্ষে ভিজ্যুয়াল স্টুডিও সম্প্রদায় 2017 এর জন্য প্রযোজ্য)

1) পাঠ্য রূপান্তর লক্ষ্যগুলি আমদানি করুন এবং প্রতিটি বিল্ডে চলার জন্য টেমপ্লেট রূপান্তর করুন: (রেফ https://msdn.microsoft.com/en-us/library/ee847423.aspx )

<PropertyGroup>
    <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">15.0</VisualStudioVersion>
    <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
    <TransformOnBuild>true</TransformOnBuild>
    <TransformOutOfDateOnly>false</TransformOutOfDateOnly>
</PropertyGroup>

এবং তারপর <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

<Import Project="$(VSToolsPath)\TextTemplating\Microsoft.TextTemplating.targets" />

2) তৈরি করুন git describe টেমপ্লেট রূপান্তরের আগে রান (যাতে রূপান্তরিত হওয়ার পরে git_version.txtসেখানে থাকে VersionInfo.tt):

<Target Name="PreBuild" BeforeTargets="ExecuteTransformations">
  <Exec Command="git -C $(ProjectDir) describe --long --always --dirty &gt; $(ProjectDir)git_version.txt" />
</Target>

.. এবং সি # কোডটি পেতে AssemblyInformationalVersion (রেফ https://stackoverflow.com/a/7770189/4537127 )

public string AppGitHash
{
    get
    {
        AssemblyInformationalVersionAttribute attribute = (AssemblyInformationalVersionAttribute)Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyInformationalVersionAttribute), false).FirstOrDefault();

        return attribute.InformationalVersion;
    }
}

.. এবং উত্পন্ন ফাইলগুলি .gitignore এ যুক্ত করুন

VersionInfo.cs
git_version.txt

0

অন্য উপায়টি হ'ল প্রাক-বিল্ড পদক্ষেপ থেকে সংস্করণ.এস ফাইল তৈরি করা। আমি এটি একটি সামান্য প্রুফ অফ কনসেপ্ট প্রকল্পে অন্বেষণ করেছি যা এর বর্তমান প্রতিশ্রুতিবদ্ধ হ্যাশটি প্রিন্ট করে।

থা প্রকল্পটি https://github.com/sashoalm/GitCommitHashPrinter এ আপলোড করা হয়েছে

সংস্করণ ফাইলগুলি তৈরি করে এমন ব্যাচ কোডটি হ'ল:

@echo off

echo "Writing Version.cs file..."

@rem Pushd/popd are used to temporarily cd to where the BAT file is.
pushd $(ProjectDir)

@rem Verify that the command succeeds (i.e. Git is installed and we are in the repo).
git rev-parse HEAD || exit 1

@rem Syntax for storing a command's output into a variable (see https://stackoverflow.com/a/2340018/492336).
@rem 'git rev-parse HEAD' returns the commit hash.
for /f %%i in ('git rev-parse HEAD') do set commitHash=%%i

@rem Syntax for printing multiline text to a file (see https://stackoverflow.com/a/23530712/492336).
(
echo namespace GitCommitHashPrinter
echo {
echo     class Version
echo     {
echo         public static string CommitHash { get; set; } = "%commitHash%";
echo     }
echo }
)>"Version.cs"

popd    

0

স্থান

<Target Name="UpdateVersion" BeforeTargets="CoreCompile">
  <Exec Command="php &quot;$(SolutionDir)build.php&quot; $(SolutionDir) &quot;$(ProjectDir)Server.csproj&quot;" />
</Target>

ভিতরে YOUR_PROJECT_NAME.csproj

<?php

function between(string $string, string $after, string $before, int $offset = 0) : string{
    return substr($string, $pos = strpos($string, $after, $offset) + strlen($after),
        strpos($string, $before, $pos) - $pos);
}

$pipes = [];
$proc = proc_open("git rev-parse --short HEAD", [
    0 => ["pipe", "r"],
    1 => ["pipe", "w"],
    2 => ["pipe", "w"]
], $pipes, $argv[1]);

if(is_resource($proc)){
    $rev = stream_get_contents($pipes[1]);
    proc_close($proc);
}

$manifest = file_get_contents($argv[2]);
$version = between($manifest, "<Version>", "</Version>");
$ver = explode("-", $version)[0] . "-" . trim($rev);
file_put_contents($argv[2], str_replace($version, $ver, $manifest));

echo "New version generated: $ver" . PHP_EOL;

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