ভিজ্যুয়াল স্টুডিও 2017 (। নেট কোর) এ অটো সংস্করণ


112

.NETCoreApp 1.1 (ভিজ্যুয়াল স্টুডিও 2017) এ অটো-ইনক্রিমেন্ট সংস্করণগুলির উপায় খুঁজতে চেষ্টা করার জন্য আমি কয়েক ঘন্টার আরও ভাল অংশ ব্যয় করেছি।

আমি জানি যে অ্যাসেম্বলিআইএনফোগুলি ফোল্ডারে গতিশীলভাবে তৈরি করা হচ্ছে: obj/Debug/netcoreapp1.1/

এটি পুরাতন পদ্ধতিটি গ্রহণ করে না: [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.*")]

আমি যদি প্যাকেজটিতে প্রকল্পটি সেট করি আমি সেখানে সংস্করণগুলি সেট করতে পারি তবে এটি એસেম্বলিআইএনফো ফাইলগুলি তৈরি করতে ব্যবহৃত হবে বলে মনে হয়।

আমার প্রশ্ন হ'ল, কেউ কীভাবে। নেট কোর (বা for বিষয়টির জন্য। নেটস স্ট্যান্ডার্ড) প্রকল্পগুলিতে সংস্করণ কীভাবে নিয়ন্ত্রণ করবেন তা নির্ধারণ করেছেন।


আপনি এটি দিয়ে কতটা পেরে গেছেন জানি না, তবে দেখে মনে হচ্ছে আমি প্রায় একই প্রশ্নটি অন্যভাবে জিজ্ঞাসা করেছি ( stackoverflow.com/a/43280282/685341 ) - সম্ভবত এই প্রশ্নের গৃহীত উত্তর আপনাকে সাহায্য করবে; আপনি কেবল আপনার বিল্ড স্ক্রিপ্টে /p:পতাকাটি পাস করতে পারেন dotnet msbuildএবং সংস্করণ, সংস্থা, কপিরাইট ... সমস্ত ভাল জিনিস সেট করতে পারেন।
জয়

2
তথ্যের জন্য ধন্যবাদ। এটি কেবল অতিরিক্ত বিকল্পগুলি খুলবে।
জেসন এইচ

পূর্বে * এসেম্বলি ভার্সনের
মাইকেল ফ্রেইজিম

4
বিধানসভা সংস্করণে ওয়াইল্ডকার্ড FWIW সমর্থিত নয় কারণ এই নতুন প্রকল্পের জন্য, সংকলকের "ডিটারিস্টিনিস্টিক" মোডটি ডিফল্টরূপে সক্রিয়। যেহেতু স্বতঃবৃদ্ধি স্থিরতা (একই ইনপুট> একই আউটপুট) ভাঙবে that মোডে এটি অনুমোদিত নয়। <Deterministic>False</Deterministic>এটি ব্যবহারের জন্য আপনি সিএসপিজেজে সেট করতে পারেন। (বা গণনা করার জন্য অন্য কোনও এমএস বিল্ডের যুক্তি ব্যবহার করুন <VersionPrefix>/ <Version>)
মার্টিন উলরিচ

উত্তর:


23

আমি সিএসপ্রোজ কনফিগারেশন ফর্ম্যাটটি ব্যবহার করে ভিএস ২০১7 এ নেট কোর অ্যাপের জন্য একটি সংস্করণ বর্ধক খুঁজছি।

আমি ডটনেট বাম্প নামে একটি প্রকল্প পেয়েছি যা এই প্রকল্প.জসন ফর্ম্যাটের জন্য কাজ করেছে তবে .csproj ফর্ম্যাটের সমাধান খুঁজে পেতে লড়াই করেছে। লেখক ডটনেট বাম্প আসলে .csproj ফর্ম্যাটের সমাধান নিয়ে এসেছিলেন এবং একে এমএসবাম্প বলা হয়।

এর জন্য এখানে গিটহাবে একটি প্রকল্প রয়েছে:

https://github.com/BalassaMarton/MSBump

যেখানে আপনি কোডটি দেখতে পাচ্ছেন এবং এটি নুগেটে উপলব্ধ। নুগেটে কেবল এমএসবাম্প অনুসন্ধান করুন।


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

আমি এটি এখন এমএসবিল্ডকে সমর্থন করি যেখানে এর আগে ভিজ্যুয়াল স্টুডিওর প্রয়োজন ছিল required
রাভেট্রোল

2
হ্যাঁ, এবং এটি মাল্টি-টার্গেটিং প্রকল্পগুলিকে সমর্থন করে।
মার্টন বালাসা

4
গিট ভার্সিয়নিং ব্যবহার বিবেচনা করুন। আপনার সিআই পরিবেশে এটি চালানোর উপযুক্ত হতে পারে। github.com/AArnott/Nerdbank.GitVersioning
হেনরিক

1
প্রতিটি বিল্ডে এমএসবাম্প ইনক্রিমেন্ট সংস্করণ আপনি কোনও পরিবর্তন না করলেও, এটি দীর্ঘমেয়াদে অনেক সমস্যার সৃষ্টি করে। এবং কখনও কখনও সংস্করণগুলি সিঙ্কের বাইরে চলে যায় এবং একটি সংস্করণ অন্যটির পিছনে থাকে।
কনরাড

68

<Deterministic>False</Deterministic><PropertyGroup>.Csproj এর একটি বিভাগের ভিতরে যুক্ত করুন 

অ্যাসেম্বলি ভার্সন * তৈরির কাজটি বর্ণিত হয়েছে "[এসেম্বলি ভার্সনে] ওয়াইল্ডকার্ডের জন্য বিভ্রান্তিকর ত্রুটি বার্তা। নেট নেট # 22660" তে বর্ণিত হয়েছে

ওয়াইল্ডকার্ডগুলি কেবল তখনই নির্মিত হয় যদি বিল্ডটি ডিটারমিনিস্টিক না হয়, যা নেট কোর প্রকল্পগুলির জন্য ডিফল্ট। <Deterministic>False</Deterministic> সিএসপিজেজে যুক্ত  করা সমস্যার সমাধান করে।

নেট কোর বিকাশকারীরা http://blog.paranoidcoding.com/2016/04/05/deterministic-builds-in-roslyn.html এবং সংকলকগুলিতে বর্ণিত ডিটারিস্টেমিক বিল্ডসকে উপকারী বিবেচনা করার কারণগুলি : একই ইনপুটগুলি একই আউটপুট জেনারেট করে # 372

তবে আপনি যদি টিমসিটি, টিএফএস বা অন্যান্য সিআই / সিডি সরঞ্জাম ব্যবহার করছেন তবে সম্ভবত সংস্করণ নম্বরটি তাদের দ্বারা নিয়ন্ত্রিত এবং বর্ধিত রাখা এবং প্যারামিটার হিসাবে তৈরি করা ভাল (যেমন এটি অন্যান্য উত্তরে প্রস্তাবিত হয়েছিল), উদাহরণস্বরূপ

msbuild /t:build /p:Version=YourVersionNumber /p:AssemblyVersion=YourVersionNumber

নিউগেট প্যাকেজগুলির জন্য প্যাকেজ নম্বর

msbuild /t:pack /p:Version=YourVersionNumber   

ধন্যবাদ! আমি জানতাম ট্রেজার রুম খোলার জন্য একটি লুকানো লিভার ছিল! আমি একটি পুরানো প্রকল্প নতুন। নেট এসডিকে স্থানান্তরিত করছি এবং স্বয়ংক্রিয় সংস্করণ বৃদ্ধির সমাধানগুলি খুঁজে পাওয়ার ঝামেলা ছাড়াই আমি সত্যিই এই দ্রুত করতে চেয়েছিলাম। আসলে, পুরানো উপায়গুলির সাথে আরও সুসংগতভাবে আমার ক্ষেত্রে আরও ভাল।
Ivaylo স্লাভভ

এটি সেরা উত্তর আইএমও। এটি বিল্ড টুলিংকে সঠিকভাবে কাজ করার অনুমতি দেয়। কমপক্ষে আমি এখন বিল্ডটিতে নম্বরটি ফিড করতে একটি বাহ্যিক প্রক্রিয়া ব্যবহার করতে পারি।
মাইকেল ইয়ানি

দয়া করে আপনার উত্তরটি আরও কিছুটা প্রসারিত করুন: প্রস্তাবিত সংযোজনটি .csproj এর <PerertyGroup> বিভাগে যেতে হবে। এবং অবশ্যই এই দুর্দান্ত উত্তরের জন্য ধন্যবাদ!
জেরার্ডভি

1
@gerardv, সম্পন্ন, কিন্তু আপনি নিজের দ্বারা সম্পাদনাগুলি উন্নতি করতে পারি না stackoverflow.com/help/editing
মাইকেল Freidgeim

62

যদি আপনি ভিজ্যুয়াল স্টুডিও টিম পরিষেবাদি / টিএফএস বা কিছু অন্যান্য সিআই বিল্ড প্রক্রিয়া ব্যবহার করে থাকেন তবে অন্তর্নির্মিত সংস্করণটি ব্যবহার করা যায়, আপনি এমএসবিল্ডের Conditionবৈশিষ্ট্যটি ব্যবহার করতে পারেন , উদাহরণস্বরূপ:

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <Version Condition=" '$(BUILD_BUILDNUMBER)' == '' ">0.0.1-local</Version>
    <Version Condition=" '$(BUILD_BUILDNUMBER)' != '' ">$(BUILD_BUILDNUMBER)</Version>
    <TargetFramework>netcoreapp1.1</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <Folder Include="wwwroot\" />
  </ItemGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.0.0" />
    <PackageReference Include="Microsoft.AspNetCore" Version="1.1.2" />
    <PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="1.1.2" />
  </ItemGroup>

</Project>

এটি .NET কোর সংকলককে BUILD_BUILDNUMBERপরিবেশের পরিবর্তনশীল উপস্থিত থাকলে যা ব্যবহার করতে হবে তা বলবে বা আপনি 0.0.1-localযদি নিজের স্থানীয় মেশিনে কোনও বিল্ড করছেন তবে ফ্যালব্যাক ।


ভাল লাগল, আমি এই পদ্ধতির পছন্দ করি কারণ এই শর্তাবলগুলি বাইনারিগুলির মধ্যে অ্যাসেম্বলি সেটটি সনাক্ত করে এবং viভিরমেন্ট ভেরিয়েবলগুলি কেবল বিল্ড সার্ভারে সেট করা যায়।
jbooker

টিএফএস ২০১০ তে কাজ করছে বলে মনে হচ্ছে না, তবে আশা করি আমরা শীঘ্রই এটিকে সরিয়ে নিচ্ছি!
মার্ক অ্যাডামসন

কোনও খারাপ সমাধান নয়, যদিও সমাধানটিতে প্রচুর প্রকল্প রয়েছে তবে কিছুটা কাজ হতে পারে।
tofutim

ভাল সমাধান। আমি যদিও বিল্ড ব্যতিক্রম পেয়েছি। এটি ঠিক করার জন্য আমাকে কনফিগারটি কিছুটা পরিবর্তন করতে হয়েছিল। stackoverflow.com/a/59858009/106227
স্টু হার্পার

এটি নেট কোর 2.1.2 এবং টিএফএস2017U3
ড্যাভ জনসন

16

আমি এমন সমাধান নিয়ে এসেছি যা তারকা (*) - এসেম্বলি ভার্সন ("1.0। ") * এর সাথে পুরানো এসেম্বলি ভার্সন অ্যাট্রিবিউটের মতো প্রায় একই কাজ করেছিল worked

মান AssemblyVersion এবং AssemblyFileVersion MSBuild প্রকল্পে হয় .csproj ফাইল (নেই AssemblyInfo.cs ) সম্পত্তি হিসেবে FileVersion (উত্পন্ন AssemblyFileVersionAttribute ) এবং AssemblyVersion (উত্পন্ন AssemblyVersionAttribute )। এমএস বিল্ড প্রক্রিয়াতে আমরা সংস্করণ নম্বর উত্পন্ন করতে আমাদের কাস্টম এমএসবিল্ড টাস্কটি ব্যবহার করি এবং তারপরে আমরা এই ফাইল ভার্সন এবং এসেম্বলি ভার্সনের বৈশিষ্ট্যগুলিকে টাস্ক থেকে নতুন মান সহ ওভাররাইড করি ।

সুতরাং প্রথম আমরা আমাদের কাস্টম MSBuild কার্য তৈরি GetCurrentBuildVersion :

public class GetCurrentBuildVersion : Task
{
    [Output]
    public string Version { get; set; }
 
    public string BaseVersion { get; set; }
 
    public override bool Execute()
    {
        var originalVersion = System.Version.Parse(this.BaseVersion ?? "1.0.0");
 
        this.Version = GetCurrentBuildVersionString(originalVersion);
 
        return true;
    }
 
    private static string GetCurrentBuildVersionString(Version baseVersion)
    {
        DateTime d = DateTime.Now;
        return new Version(baseVersion.Major, baseVersion.Minor,
            (DateTime.Today - new DateTime(2000, 1, 1)).Days,
            ((int)new TimeSpan(d.Hour, d.Minute, d.Second).TotalSeconds) / 2).ToString();
    }
}

টাস্ক ক্লাস মাইক্রোসফ্টের কাছ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত U NuGet প্যাকেজ। এটি ইনপুটটিতে বেসভেরিশন সম্পত্তি (alচ্ছিক) নেয় এবং সংস্করণ আউটপুট সম্পত্তিতে উত্পন্ন সংস্করণটি দেয়। সংস্করণ নম্বর পাওয়ার যুক্তিটি NET স্বয়ংক্রিয় সংস্করণ হিসাবে একই (বিল্ড নম্বরটি 1/1/2000 থেকে দিন গণনা এবং মধ্যরাত থেকে রিভিশনটি অর্ধ সেকেন্ড)।

এই এমএসবিল্ড টাস্কটি তৈরি করতে, আমরা এই ক্লাসের সাথে .NET স্ট্যান্ডার্ড 1.3 ক্লাসের লাইব্রেরি প্রকল্পের প্রকারটি ব্যবহার করি ।

.csproj ফাইলটি এর মতো দেখতে পারে:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netstandard1.3</TargetFramework>
    <AssemblyName>DC.Build.Tasks</AssemblyName>
    <RootNamespace>DC.Build.Tasks</RootNamespace>
    <PackageId>DC.Build.Tasks</PackageId>
    <AssemblyTitle>DC.Build.Tasks</AssemblyTitle>
  </PropertyGroup>
 
  <ItemGroup>
    <PackageReference Include="Microsoft.Build.Framework" Version="15.1.1012" />
    <PackageReference Include="Microsoft.Build.Utilities.Core" Version="15.1.1012" />
  </ItemGroup>
</Project>

এই টাস্ক প্রকল্পটি আমার গিটহাব হোলজন / ডিসি.বিল্ড.টাস্কগুলিতেও উপলব্ধ

এখন আমরা এই কার্যটি ব্যবহার করতে এমএসবিল্ড সেটআপ করি এবং ফাইল ভার্সন এবং এসেম্বলি ভার্সন বৈশিষ্ট্য সেট করি । .Csproj ফাইলে এটি দেখতে এমন দেখাচ্ছে:

<Project Sdk="Microsoft.NET.Sdk">
  <UsingTask TaskName="GetCurrentBuildVersion" AssemblyFile="$(MSBuildThisFileFullPath)\..\..\DC.Build.Tasks.dll" />
 
  <PropertyGroup>
    ...
    <AssemblyVersion>1.0.0.0</AssemblyVersion>
    <FileVersion>1.0.0.0</FileVersion>
  </PropertyGroup>
 
  ...
 
  <Target Name="BeforeBuildActionsProject1" BeforeTargets="BeforeBuild">
    <GetCurrentBuildVersion BaseVersion="$(FileVersion)">
      <Output TaskParameter="Version" PropertyName="FileVersion" />
    </GetCurrentBuildVersion>
    <PropertyGroup>
      <AssemblyVersion>$(FileVersion)</AssemblyVersion>
    </PropertyGroup>
  </Target>
 
</Project>

এখানে গুরুত্বপূর্ণ জিনিস:

  • উল্লেখ করেছে UsingTask থেকে GetCurrentBuildVersion টাস্ক আমদানি DC.Build.Tasks.dll । এটি অনুমান করে যে এই dll ফাইলটি আপনার .csproj ফাইল থেকে মূল ডিরেক্টরিতে অবস্থিত।
  • আমাদের উইন্ডোইলডাকশনপ্রজেক্ট 1 টার্গেট যা কলটি টাস্ককে কল করে তাতে আমাদের প্রতি প্রকল্পের ক্ষেত্রে অনন্য নাম থাকতে হবে যদি আমাদের সমাধানে আরও প্রকল্প থাকে যা গেটকোর্নবিল্ড ভার্সন টাস্ককে ডাকে।

এই সমাধানটির সুবিধাটি হ'ল এটি কেবল বিল্ড সার্ভারে বিল্ডগুলি থেকে নয়, ডটনেট বিল্ড বা ভিজ্যুয়াল স্টুডিও থেকে ম্যানুয়াল বিল্ডগুলিতেও কাজ করে ।


4
কোডটি স্বয়ংক্রিয় বিল্ড মেশিনে চালিত হলে আমি বিশেষত পদ্ধতির DateTime.UtcNowপরিবর্তে ব্যবহারের পরামর্শ দেব । আপনার কম্পিউটার যখন দিনের আলোর সঞ্চয়ের সময় থেকে / স্যুইচ করে তখন এগুলি সকাল 2 টা বা 3 টায় চলতে পারে। সঙ্গে যে দৃশ্যকল্প মধ্যে আপনি সংস্করণ পরিপ্রেক্ষিতে পিছন যাচ্ছেন। স্বীকার করা, এটি একটি কর্নার কেস এবং আমি স্বীকারও করি যে আমি পিক আছি। :-) এছাড়াও, যদি আপনি সমস্ত বিল্ড মেশিনে একই টাইমজোনটি কনফিগার করেন এবং দিবালোকের সঞ্চয়ী সময়ের সাথে সামঞ্জস্য না করেন তবে সমস্যাটিও সরে যায়। DateTime.NowGetCurrentBuildVersionString()DateTime.Now
ম্যানফ্রেড

এর জন্য কি এখনও কোনও নিউগেট প্যাকেজ রয়েছে?
জোনাথন অ্যালেন

@ জোনাথন অ্যালেন না, নুগেট প্যাকেজের জন্য আমার কোনও পরিকল্পনা নেই, কারণ প্রতিটি প্রকল্পের আলাদা আলাদা নাম রয়েছে। আপনি github.com/holajan/DC.Build.Tasks/tree/master/dist ফোল্ডারে সংকলিত বিল্ড টাস্ক এসেম্বলিটি ডাউনলোড করতে পারেন
HolaJan

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

15

আপনি বর্তমান তারিখের উপর ভিত্তি করে সংস্করণ প্রত্যয় সেট করতে একটি এমএসবিল্ড সম্পত্তি ফাংশন ব্যবহার করতে পারেন:

<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
  <VersionSuffix>pre$([System.DateTime]::UtcNow.ToString(yyyyMMdd-HHmm))</VersionSuffix>
</PropertyGroup>

এটি এই নামের সাথে একটি প্যাকেজ আউটপুট দেবে: PackageName.1.0.0-pre20180807-1711.nupkg

এমএসবাইল্ড প্রপার্টি ফাংশন সম্পর্কে আরও বিশদ: https://docs.microsoft.com/en-us/visualstudio/msbuild/property-funitions

Versionসমাহার থেকে গঠিত হয় VersionPrefixএবং VersionSuffix, অথবা যদি VersionSuffixফাঁকা, VersionPrefixশুধুমাত্র।

<PropertyGroup>
  <VersionPrefix>1.0.0</VersionPrefix>
</PropertyGroup>

এটি সত্যিই সহজ
জেরি নিকসন

12

আমি উপরের উত্তরটি গ্রহণ করেছি কারণ @ জিগি সঠিক (এখনকার হিসাবে) তবে আমি বিরক্ত হয়ে নিম্নলিখিত পাওয়ারশেল স্ক্রিপ্টগুলি নিয়ে এসেছি।

প্রথমে আমার সমাধান ফোল্ডারে স্ক্রিপ্টটি রয়েছে (আপডেটবিল্ড ভার্সন.পিএস 1):

#Get Path to csproj
$path = "$PSScriptRoot\src\ProjectFolder\ProjectName.csproj"

#Read csproj (XML)
$xml = [xml](Get-Content $path)

#Retrieve Version Nodes
$assemblyVersion = $xml.Project.PropertyGroup.AssemblyVersion
$fileVersion = $xml.Project.PropertyGroup.FileVersion

#Split the Version Numbers
$avMajor, $avMinor, $avBuild  = $assemblyVersion.Split(".")
$fvMajor, $fvMinor, $fvBuild = $fileVersion.Split(".")

#Increment Revision
$avBuild = [Convert]::ToInt32($avBuild,10)+1
$fvBuild = [Convert]::ToInt32($fvBuild,10)+1

#Put new version back into csproj (XML)
$xml.Project.PropertyGroup.AssemblyVersion = "$avMajor.$avMinor.$avBuild"
$xml.Project.PropertyGroup.FileVersion = "$fvMajor.$fvMinor.$fvBuild"

#Save csproj (XML)
$xml.Save($path)

আমি এটি সিএসপোজ ফাইলটিতে যুক্ত করেছি:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <AssemblyVersion>0.0.1</AssemblyVersion>
    <FileVersion>0.0.1</FileVersion>
    <PreBuildEvent>powershell.exe NonInteractive ExecutionPolicy Unrestricted -command "& {$(SolutionDir)UpdateBuildVersion.ps1}"</PreBuildEvent>
  </PropertyGroup>
</Project>

এমনকি প্রিবেলডেন্ট হিসাবে সেট হওয়ার পরেও, আসল সংস্করণ সংখ্যাগুলি আপডেট না হওয়া পর্যন্ত ফাইলটি মেমরিতে লোড না হওয়া পর্যন্ত সংস্করণ নম্বরটি পরবর্তী বিল্ড হওয়া পর্যন্ত প্রতিবিম্বিত হবে না। আসলে, আপনি এটি পোস্টবিল্ড ইভেন্টে পরিবর্তন করতে পারেন এবং এটির একই প্রভাব থাকবে it

আমি নিম্নলিখিত দুটি স্ক্রিপ্টও তৈরি করেছি: (আপডেটমিনোয়ারভিশন.পিএস 1)

#Get Path to csproj
$path = "$PSScriptRoot\src\ProjectFolder\ProjectName.csproj"

#Read csproj (XML)
$xml = [xml](Get-Content $path)

#Retrieve Version Nodes
$assemblyVersion = $xml.Project.PropertyGroup.AssemblyVersion
$fileVersion = $xml.Project.PropertyGroup.FileVersion

#Split the Version Numbers
$avMajor, $avMinor, $avBuild  = $assemblyVersion.Split(".")
$fvMajor, $fvMinor, $fvBuild = $fileVersion.Split(".")

#Increment Minor Version - Will reset all sub nodes
$avMinor = [Convert]::ToInt32($avMinor,10)+1
$fvMinor = [Convert]::ToInt32($fvMinor,10)+1
$avBuild = 0
$fvBuild = 0

#Put new version back into csproj (XML)
$xml.Project.PropertyGroup.AssemblyVersion = "$avMajor.$avMinor.$avBuild"
$xml.Project.PropertyGroup.FileVersion = "$fvMajor.$fvMinor.$fvBuild"

#Save csproj (XML)
$xml.Save($path)

(UpdateMajorVersion.ps1)

#Get Path to csproj
$path = "$PSScriptRoot\src\ProjectFolder\ProjectName.csproj"

#Read csproj (XML)
$xml = [xml](Get-Content $path)

#Retrieve Version Nodes
$assemblyVersion = $xml.Project.PropertyGroup.AssemblyVersion
$fileVersion = $xml.Project.PropertyGroup.FileVersion

#Split the Version Numbers
$avMajor, $avMinor, $avBuild  = $assemblyVersion.Split(".")
$fvMajor, $fvMinor, $fvBuild = $fileVersion.Split(".")

#Increment Major Version - Will reset all sub nodes
$avMajor = [Convert]::ToInt32($avMajor,10)+1
$fvMajor = [Convert]::ToInt32($fvMajor,10)+1
$avMinor = 0
$fvMinor = 0
$avBuild = 0
$fvBuild = 0

#Put new version back into csproj (XML)
$xml.Project.PropertyGroup.AssemblyVersion = "$avMajor.$avMinor.$avBuild"
$xml.Project.PropertyGroup.FileVersion = "$fvMajor.$fvMinor.$fvBuild"

#Save csproj (XML)
$xml.Save($path)

10

ডটনেট বিল্ড /p:AschoolVersion=1.2.3.4

আমি এর প্রতিক্রিয়া জানিয়েছিলাম: ".NET কোর (বা N বিষয়টির জন্য নেট নেট স্ট্যান্ডার্ড) প্রকল্পগুলিতে কীভাবে সংস্করণটি নিয়ন্ত্রণ করতে হয় সে সম্পর্কে কেউ জানতে পেরেছিলেন।" আমি এই প্রশ্নটি একটি সিআই বিল্ডের প্রসঙ্গে এই সমস্যাটি সমাধান করার চেষ্টা করেছি। আমি সমাবেশের সংস্করণটি সিআই বিল্ড নম্বরে সেট করতে চেয়েছিলাম।


1
শিরোনামটি "ভিজ্যুয়াল স্টুডিও 2017 (। নেট কোর) এ অটো সংস্করণ" বলছে। ম্যানুয়ালি এটিকে কোথায় বিল্ডিং করা "ভিজ্যুয়াল স্টুডিও 2017" এর সাথে সামঞ্জস্য হয়?
জে.সি.কেডেল

4
আমি এর প্রতিক্রিয়া জানিয়েছিলাম: ".NET কোর (বা N বিষয়টির জন্য নেট নেট স্ট্যান্ডার্ড) প্রকল্পগুলিতে কীভাবে সংস্করণটি নিয়ন্ত্রণ করতে হয় সে সম্পর্কে কেউ জানতে পেরেছিলেন।" আমি এই প্রশ্নটি একটি সিআই বিল্ডের প্রসঙ্গে এই সমস্যাটি সমাধান করার চেষ্টা করেছি। আমি সমাবেশের সংস্করণটি সিআই বিল্ড নম্বরে সেট করতে চেয়েছিলাম। দুঃখিত যদি আপনি মনে করেন এটি হাতের প্রশ্নের সাথে প্রাসঙ্গিক নয়।
ক্রিস

এটি আমার জন্য একটি সহায়ক উপাদান। ধন্যবাদ আমি এটি সিআই সমাধানের অংশ হিসাবে ব্যবহার করব
মার্ক অ্যাডামসন

1
@ ক্রিসমিসকেনজি: আপনার অভিপ্রায়টি পরিষ্কার করার জন্য আপনার মন্তব্যে আপনার মন্তব্যে অন্তর্ভুক্ত করা উচিত
মাইকেল ফ্রিজিম

** এটি নেটস্ট্যান্ডার্ড প্রকল্পগুলিতে আমার পক্ষে কাজ করে না যখন এসেম্বলিআইএনএফ.সি.এস নির্দিষ্ট করা হয়নি এবং সংস্করণটি সিএসপিজেজে আছে ...
tofutim

9

এই মানগুলি এখন .csprojফাইলে সেট করা আছে :

<PropertyGroup>
    <TargetFramework>netcoreapp1.1</TargetFramework>
    <AssemblyVersion>1.0.6.0</AssemblyVersion>
    <FileVersion>1.0.6.0</FileVersion>
    <Version>1.0.1</Version>
</PropertyGroup>

আপনি যদি প্রকল্প সেটিংসে প্যাকেজ ট্যাবে যান তবে এই একই মানগুলি আপনি দেখতে পাচ্ছেন । যদিও আমি মনে করি না যে আপনি *সংস্করণটি স্বয়ংস্বন্ধে ব্যবহার করতে পারবেন , আপনি যা করতে পারেন তা হ'ল একটি প্রসেসিং-পরবর্তী পদক্ষেপ প্রবর্তন করা যা আপনার জন্য সংস্করণগুলিকে প্রতিস্থাপন করে (যেমন আপনার অবিচ্ছিন্ন একীকরণের অংশ হিসাবে)।


6
আমি ভয় পেয়েছিলাম যে এই উত্তর হবে। আমি এটি বাড়ানোর জন্য প্রাক-বিল্ড পদক্ষেপ করতে পারি কিনা তা আমি দেখতে পাব।
জেসন এইচ

3
অন্য থ্রেডে নির্দেশিত হিসাবে, নতুন সিএসপিজেজ ফর্ম্যাট আপনাকে অ্যাসেমব্লিনফো ফাইলটির স্বয়ংক্রিয় প্রজন্ম বন্ধ করতে এবং আপনার নিজের নির্দিষ্ট করার জন্য অনুমতি দেয়। আমি এখানে নাটেমকাস্টারের জবাবের পরামর্শ অনুসরণ করেছি এবং একটি স্ট্যান্ডার্ড এসেম্বলিআইএনফো.সি.এস ফাইল ব্যবহার করেছি: stackoverflow.com/questions/42138418/…
জেমস এবি

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

1
@ লুকপুপলেট এখানে একই। খুবই হতাশাজনক!
শিমি ওয়েটজ্যান্ডলার

@LukePuplett: দেখুন [ "ত্রুটির বার্তা ওয়াইল্ডকার্ড জন্য AssemblyVersion মধ্যে নেট উপর বিভ্রান্তিকর কোর # 22660"] ( github.com/dotnet/roslyn/issues/22660 ), কারণ তারা বিবেচনা নির্ণায়ক উপকারী জৈব ফাংশন বর্ণিত blog.paranoidcoding.com / ২০১ / / 04/05 /… এবং সংকলকগুলি নির্বিচারে হওয়া উচিত: একই ইনপুটগুলি একই ফলাফল দেয় # 372 < github.com/dotnet/roslyn/issues/372 >
মাইকেল ফ্রেইজিম

5

আমি .csproj .NET কোর সংস্করণের স্ট্রিংগুলি এখানে সেট করার জন্য একটি সাধারণ সিএলআই সরঞ্জাম তৈরি করেছি । আপনি যদি সিআই তৈরির সময় স্বয়ংক্রিয় সংস্করণ বাম্পিংয়ের জন্য গিটভার্সনের মতো সরঞ্জামগুলির সাথে এটি একত্রিত করতে পারেন, যদি এটি পরে থাকেন।


@ জেসনএইচ ধন্যবাদ, আপনার যদি এতে কোন সমস্যা থাকে তবে আমাকে জানান।
Tagc

damশ্বর্য প্রতিভা। এটা ভালবাসা!
পিএমএস 1969

4

ট্যাগগুলি ব্যবহার করে / জিআইটির কার্যকারিতা বর্ণনা করে আপনার নেট নেট /। নেট আপনার জিআইটি সেটআপের উপর ভিত্তি করে যে কোনও প্রকল্পই করুন।

আমি একটি Prebuild.targets.xML ফাইল ব্যবহার করছি যা প্রকল্পের মূল ফোল্ডারে অবস্থিত এবং সিএসপিজেজ ফাইলের মতো অন্তর্ভুক্ত:

<Project Sdk="Microsoft.NET.Sdk">
  <Import Project="PreBuild.targets.xml" />
  ...
  <PropertyGroup>
    <GenerateAssemblyInfo>false</GenerateAssemblyInfo>

স্বয়ংক্রিয় সমাবেশ তথ্য জেনারেশন অক্ষম করতে "জেনারেটএজেম্বিআইএনফো" ট্যাগটি ব্যবহার করুন।

তারপরে Prebuild.targets.xml একটি কমনএসোপলইনফোর.সি ফাইল তৈরি করবে যেখানে আপনি আপনার জিআইটি সংস্করণের উপর নির্ভর করে যে সংস্করণ ট্যাগগুলি চান তা অন্তর্ভুক্ত করতে পারবেন

দ্রষ্টব্য: আমি Prebuilds.targets.xML অন্য কোথাও খুঁজে পেয়েছি, সুতরাং এটি পরিষ্কার করার জন্য মাথা ঘামান না)

Prebuild.targets.xML ফাইল:

    <?xml version="1.0" encoding="utf-8" ?>
    <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

      <UsingTask
        TaskName="GetVersion"
        TaskFactory="CodeTaskFactory"
        AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll" >
        <ParameterGroup>
          <VersionString ParameterType="System.String" Required="true" />
          <Version ParameterType="System.String" Output="true" />
          <Commit ParameterType="System.String" Output="true" />
          <VersionSuffix ParameterType="System.String" Output="true" />
        </ParameterGroup>
        <Task>
          <!--<Reference Include="" />-->
          <Using Namespace="System"/>
          <Using Namespace="System.IO"/>
          <Using Namespace="System.Text.RegularExpressions" />
          <Code Type="Fragment" Language="cs">
            <![CDATA[
              var match = Regex.Match(VersionString, @"^(?<major>\d+)\.(?<minor>\d+)(\.?(?<patch>\d+))?-(?<revision>\d+)-(?<commit>[a-z0-9-]+)$");
              int major, minor, patch, revision;
              Int32.TryParse(match.Groups["major"].Value, out major);
              Int32.TryParse(match.Groups["minor"].Value, out minor);
              Int32.TryParse(match.Groups["patch"].Value, out patch);
              Int32.TryParse(match.Groups["revision"].Value, out revision);
              _Version = new Version(major, minor, patch, revision).ToString();
              _Commit = match.Groups["commit"].Value;
            ]]>
          </Code>
        </Task>
      </UsingTask>

      <UsingTask
        TaskName="GitExistsInPath"
        TaskFactory="CodeTaskFactory"
        AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll" >
        <ParameterGroup>
          <Exists ParameterType="System.Boolean" Output="true" />
        </ParameterGroup>
        <Task>
          <!--<Reference Include="" />-->
          <Using Namespace="System"/>
          <Using Namespace="System.IO"/>
          <Using Namespace="System.Text.RegularExpressions" />
          <Code Type="Fragment" Language="cs">
            <![CDATA[
            var values = Environment.GetEnvironmentVariable("PATH");
            foreach (var path in values.Split(';')) {
                var exeFullPath = Path.Combine(path, "git.exe");
                if (File.Exists(exeFullPath)) {
                    Exists = true;
                    return true;
                }
                var cmdFullPath = Path.Combine(path, "git.cmd");
                if (File.Exists(cmdFullPath)) {
                    Exists = true;
                    return true;
            }
            }
            Exists = false;
            ]]>
          </Code>
        </Task>
      </UsingTask>

      <Target Name="CreateCommonVersionInfo" BeforeTargets="CoreCompile">
        <Message Importance="high" Text="CreateCommonVersionInfo" />

        <GitExistsInPath>
          <Output TaskParameter="Exists" PropertyName="GitExists"/>
        </GitExistsInPath>
        <Message Importance="High" Text="git not found!" Condition="!$(GitExists)"/>

        <Exec Command="git describe --tags --long --dirty > $(ProjectDir)version.txt" Outputs="$(ProjectDir)version.txt" WorkingDirectory="$(SolutionDir)" IgnoreExitCode="true" Condition="$(GitExists)">
          <Output TaskParameter="ExitCode" PropertyName="ExitCode" />
        </Exec>
        <Message Importance="high" Text="Calling git failed with exit code $(ExitCode)" Condition="$(GitExists) And '$(ExitCode)'!='0'" />

        <ReadLinesFromFile File="$(ProjectDir)version.txt" Condition="$(GitExists) And '$(ExitCode)'=='0'">
          <Output TaskParameter="Lines" ItemName="OutputLines"/>
        </ReadLinesFromFile>
        <Message Importance="High" Text="Tags: @(OutputLines)" Condition="$(GitExists) And '$(ExitCode)'=='0'"/>

        <Delete Condition="Exists('$(ProjectDir)version.txt')" Files="$(ProjectDir)version.txt"/>

        <GetVersion VersionString="@(OutputLines)" Condition="$(GitExists) And '$(ExitCode)'=='0'">
          <Output TaskParameter="Version" PropertyName="VersionString"/>
          <Output TaskParameter="Commit" PropertyName="Commit"/>
        </GetVersion>

        <PropertyGroup>
          <VersionString Condition="'$(VersionString)'==''">0.0.0.0</VersionString>
        </PropertyGroup>

        <Message Importance="High" Text="Creating CommonVersionInfo.cs with version $(VersionString) $(Commit)" />

        <WriteLinesToFile Overwrite="true" File="$(ProjectDir)CommonAssemblyInfo.cs" Encoding="UTF-8" Lines='using System.Reflection%3B

    // full version: $(VersionString)-$(Commit)

    [assembly: AssemblyVersion("$(VersionString)")]
    [assembly: AssemblyInformationalVersion("$(VersionString)")] 
    [assembly: AssemblyFileVersion("$(VersionString)")]' />

      </Target>
    </Project>

সম্পাদনা: আপনি যদি এমএসবিল্ড ব্যবহার করে নির্মাণ করছেন

 $(SolutionDir)

আপনার সমস্যার কারণ হতে পারে, ব্যবহার করুন

 $(ProjectDir)

পরিবর্তে


নিস! ভার্সনসফিক্স কি সেট হয়ে যায় বা ব্যবহার করা শেষ করে? দেখে মনে হচ্ছে না
মার্ক অ্যাডামসন

4

আপনি সিএসপোজ ফাইলের মধ্যে নীচে করতে পারেন। আমি গণিত বের করিনি। আমি স্ট্যাকওভারফ্লোতে অন্য কোথাও খুঁজে পেয়েছি। তবে এটি কাজ করে এবং আপনাকে 1.0 এর সাথে সামঞ্জস্যপূর্ণ কিছু দেবে * * সংস্করণের জন্য।

<PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <FileVersion>1.0.$([System.DateTime]::UtcNow.Date.Subtract($([System.DateTime]::Parse("2000-01-01"))).TotalDays).$([System.Math]::Floor($([MSBuild]::Divide($([System.DateTime]::UtcNow.TimeOfDay.TotalSeconds), 1.32))))</FileVersion>
    <Version>1.0.$([System.DateTime]::UtcNow.Date.Subtract($([System.DateTime]::Parse("2000-01-01"))).TotalDays)</Version>
</PropertyGroup>

3

ভিজ্যুয়াল স্টুডিওর জন্য স্বয়ংক্রিয় সংস্করণ এক্সটেনশানটি এখন একটি সাধারণ ইউজার ইন্টারফেসে নেট নেট এবং। নেট স্ট্যান্ডার্ড স্বতঃসংশোধন সমর্থন করে।

https://marketplace.visualstudio.com/items?itemName=PrecisionInfinity.AutomaticVersions


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

3

@ জোয়েলস এবং আমাকে সঠিক দিকে নির্দেশ করার জন্য ধন্যবাদ।

ডিওওপস বিল্ড দৌড়ানোর সময় আমাকে তার উত্তরটি কিছুটা পরিবর্তন করতে হয়েছিল, আমি নিম্নলিখিত ব্যতিক্রম পেয়েছি

The specified version string does not conform to the recommended format - major.minor.build.revision

মেজর.মিনোর.বিল্ড বিভাগের শেষে আমাকে B (BUILD_BUILDNUMBER) যুক্ত করতে হয়েছিল। আসল সংস্করণটি অনুলিপি করতে, আমি একটি সংস্করণ-উপসর্গও ব্যবহার করি:

<PropertyGroup>
    <VersionPrefix>1.0.3</VersionPrefix>
    <Version Condition=" '$(BUILD_BUILDNUMBER)' == '' ">$(VersionPrefix)-local</Version>
    <Version Condition=" '$(BUILD_BUILDNUMBER)' != '' ">$(VersionPrefix)-$(BUILD_BUILDNUMBER)</Version>
</PropertyGroup>

আমার ঠিক একই সমস্যা ছিল এবং আপনার উত্তর এটি ঠিক করে দিয়েছে। ধন্যবাদ.
অংশগ্রাহকের সাথে দেখা

2

আমরা এর জন্য বিশেষ পরামিতি ব্যবহার করতে পারি dotnet publish -- version-suffix 1.2.3

ফাইল সংস্করণের জন্য:

<AssemblyVersion Condition=" '$(VersionSuffix)' == '' ">0.0.1.0</AssemblyVersion>
<AssemblyVersion Condition=" '$(VersionSuffix)' != '' ">$(VersionSuffix)</AssemblyVersion>

সংস্করণের জন্য:

<Version Condition=" '$(VersionSuffix)' == '' ">0.0.1</Version>
<Version Condition=" '$(VersionSuffix)' != '' ">$(VersionSuffix)</Version>

https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-publish?tabs=netcore21

--version-suffix <VERSION_SUFFIX>     Defines the value for the $(VersionSuffix) property in the project.

1

আমি মনে করি @ জোয়েলস্যান্ডের এই উত্তরটি ভিএসটিএসে চলমান ডটনেট কোরের সংস্করণ নম্বর নির্ধারণের সঠিক উত্তর

এই উত্তরের জন্য আরও তথ্য যুক্ত করতে,

BUILD_BUILDNUMBERআসলে একটি পূর্বনির্ধারিত পরিবর্তনশীল

দেখা যাচ্ছে সেখানে পূর্বনির্ধারিত ভেরিয়েবলের 2 টি সংস্করণ রয়েছে।

একটি বিল্ড.এক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্স।

আপনি কেবল Environment Variable Nameসিপ্রিজে ব্যবহার করতে পারেন ।


build.xxxxকোনও পাইপলাইনের মধ্যে রেফারেন্সের জন্য সামনের প্রান্তে ব্যবহার করা হয় না এবং BUILD_XXXXএকই মান তবে পিএসে পরিবর্তনশীল উল্লেখ করার জন্য সামান্য পরিবর্তিত বাক্য গঠন সহ প্রয়োজন হয়?
dst3p
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.