هل يمكنني زيادة إصدار إنشاء الملف تلقائيًا عند استخدام Visual Studio؟

StackOverflow https://stackoverflow.com/questions/356543

سؤال

كنت أتساءل فقط كيف يمكنني ذلك تلقائيا زيادة البنية (والإصدار؟) لملفاتي باستخدام Visual Studio (2005).

إذا بحثت عن خصائص القول C:\Windows\notepad.exe, ، تعرض علامة التبويب "إصدار" "إصدار الملف:5.1.2600.2180".أرغب في الحصول على هذه الأرقام الرائعة في إصدار dll الخاص بي أيضًا، وليس الإصدار 1.0.0.0، والذي دعونا نواجه الأمر ممل بعض الشيء.

لقد جربت بعض الأشياء، ولكن لا يبدو أن هذه وظيفة خارج الصندوق، أو ربما أبحث في المكان الخطأ (كالعادة).

أنا أعمل بشكل رئيسي مع مشاريع الويب ....

نظرت إلى كليهما:

  1. http://www.codeproject.com/KB/dotnet/Auto_Increment_Version.aspx
  2. http://www.codeproject.com/KB/dotnet/build_versioning.aspx

ولم أصدق أن بذل الكثير من الجهد لفعل شيء ما هو ممارسة معتادة.

يحرر:إنه لا يعمل في VS2005 بقدر ما أستطيع أن أقول (http://www.codeproject.com/KB/dotnet/AutoIncrementVersion.aspx)

هل كانت مفيدة؟

المحلول

في Visual Studio 2008، يعمل ما يلي.

ابحث عن ملف AssemblyInfo.cs وابحث عن هذين السطرين:

[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

يمكنك محاولة تغيير هذا إلى:

[assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyFileVersion("1.0.*")]

لكن هذا لن يعطيك النتيجة المرجوة، بل سينتهي بك الأمر بإصدار منتج من 1.0.* ونسخة ملف من 1.0.0.0.ليس ما تريد!

ومع ذلك، إذا قمت بإزالة السطر الثاني من هذه السطور ولم يعد لديك سوى:

[assembly: AssemblyVersion("1.0.*")]

بعد ذلك، سيقوم المترجم بتعيين إصدار الملف ليكون مساويًا لإصدار المنتج وستحصل على النتيجة المطلوبة من منتج متزايد تلقائيًا وإصدار ملف متزامنين.على سبيل المثال 1.0.3266.92689

نصائح أخرى

افتح ملف AssemblyInfo.cs وقم بالتغيير

// You can specify all the values or you can default the Build and Revision Numbers 
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

ل

[assembly: AssemblyVersion("1.0.*")]
//[assembly: AssemblyFileVersion("1.0.0.0")]

يمكنك القيام بذلك في IDE بالانتقال إلى المشروع -> الخصائص -> معلومات التجميع

ومع ذلك، فإن هذا سيسمح لك فقط بزيادة إصدار التجميع تلقائيًا وسيمنحك

إصدار ملف التجميع:غير مسموح باستخدام حرف البدل ("*") في هذا الحقل

مربع الرسالة إذا حاولت وضع علامة * في حقل إصدار الملف.

لذلك فقط افتح ملف Assemblyinfo.cs وقم بذلك يدويًا.

هناك خيار آخر لتغيير أرقام الإصدارات في كل إصدار وهو استخدام إصدار مهمة MSBuild.Community.Tasks.ما عليك سوى تنزيل برنامج التثبيت الخاص بهم، وتثبيته، ثم تعديل الكود التالي ولصقه بعد ذلك <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> في الخاص بك .csproj ملف:

<Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets" />
<Target Name="BeforeBuild">
    <Version VersionFile="Properties\version.txt" Major="1" Minor="0" BuildType="Automatic" StartDate="12/31/2009" RevisionType="BuildIncrement">
      <Output TaskParameter="Major" PropertyName="Major" />
      <Output TaskParameter="Minor" PropertyName="Minor" />
      <Output TaskParameter="Build" PropertyName="Build" />
      <Output TaskParameter="Revision" PropertyName="Revision" />
    </Version>
    <AssemblyInfo CodeLanguage="CS"
                  OutputFile="Properties\VersionInfo.cs"
                  AssemblyVersion="$(Major).$(Minor)"
                  AssemblyFileVersion="$(Major).$(Minor).$(Build).$(Revision)" />
</Target>

ملحوظة: قم بتكييف الخاصية StartDate مع الإعدادات المحلية الخاصة بك. وهي لا تستخدم حاليًا الثقافة الثابتة.

بالنسبة للإصدار الثالث في 14 يناير 2010، يؤدي هذا إلى إنشاء ملف VersionInfo.cs مع هذا المحتوى:

[assembly: AssemblyVersion("1.0")]
[assembly: AssemblyFileVersion("1.0.14.2")]

يجب بعد ذلك إضافة هذا الملف إلى المشروع (عبر إضافة عنصر موجود)، و ال AssemblyVersion و AssemblyFileVersion يجب إزالة الخطوط من AssemblyInfo.cs.

تم وصف الخوارزميات المختلفة لتغيير مكونات الإصدار في $(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.chm و خصائص الإصدار.

لقد توصلت إلى حل مشابه للمسيحيين ولكن دون الاعتماد على مهام مجتمع MSBuild، وهذا ليس خيارًا بالنسبة لي لأنني لا أرغب في تثبيت هذه المهام لجميع المطورين لدينا.

أقوم بإنشاء تعليمات برمجية وتجميعها إلى التجميع وأريد زيادة أرقام الإصدارات تلقائيًا.ومع ذلك، لا يمكنني استخدام خدعة VS 6.0.* AssemblyVersion لأنها تزيد أرقام البناء تلقائيًا كل يوم وتقطع التوافق مع التجميعات التي تستخدم رقم إصدار أقدم.بدلاً من ذلك، أريد الحصول على إصدار AssemblyVersion مشفر بشكل ثابت ولكن إصدار AssemblyFileVersion يتم زيادته تلقائيًا.لقد أنجزت ذلك عن طريق تحديد AssemblyVersion في AssemblyInfo.cs وإنشاء VersionInfo.cs في MSBuild مثل هذا،

  <PropertyGroup>
    <Year>$([System.DateTime]::Now.ToString("yy"))</Year>
    <Month>$([System.DateTime]::Now.ToString("MM"))</Month>
    <Date>$([System.DateTime]::Now.ToString("dd"))</Date>
    <Time>$([System.DateTime]::Now.ToString("HHmm"))</Time>
    <AssemblyFileVersionAttribute>[assembly:System.Reflection.AssemblyFileVersion("$(Year).$(Month).$(Date).$(Time)")]</AssemblyFileVersionAttribute>
  </PropertyGroup>
  <Target Name="BeforeBuild">
    <WriteLinesToFile File="Properties\VersionInfo.cs" Lines="$(AssemblyFileVersionAttribute)" Overwrite="true">
    </WriteLinesToFile>
  </Target>

سيؤدي هذا إلى إنشاء ملف VersionInfo.cs بسمة التجميع لـ AssemblyFileVersion حيث يتبع الإصدار مخطط YY.MM.DD.TTTT مع تاريخ الإنشاء.يجب عليك تضمين هذا الملف في مشروعك والبناء معه.

تحميل هذا زيادة إصدار البناء اضف الى.فهو يمنحك تحكمًا أكبر بكثير من الخيار *.

للحصول على أرقام الإصدار حاول

 System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
 System.Reflection.AssemblyName assemblyName = assembly.GetName();
 Version version = assemblyName.Version;

لتعيين رقم الإصدار، قم بإنشاء/تحرير AssemblyInfo.cs

 [assembly: AssemblyVersion("1.0.*")]
 [assembly: AssemblyFileVersion("1.0.*")]

كملاحظة جانبية أيضًا، الرقم الثالث هو عدد الأيام منذ 2/1/2000 والرقم الرابع هو نصف مقدار إجمالي الثواني في اليوم.لذا، إذا قمت بالتجميع في منتصف الليل، فيجب أن يكون صفرًا.

يوجد امتداد للاستوديو المرئي الإصدارات التلقائية الذي يدعم Visual Studio 2012، 2013، 2015 و 2017.

لقطات الشاشة enter image description here

enter image description here

تعيين * في رقم الإصدار في AssemblyInfo أو ضمن خصائص المشروع كما هو موضح في المنشورات الأخرى لا يعمل مع كافة إصدارات Visual Studio / .NET.

Afaik لم يعمل في VS 2005 (ولكن في VS 2003 و VS 2008).بالنسبة لـ VS 2005، يمكنك استخدام ما يلي: الزيادة التلقائية في إصدار Visual Studio 2005 ورقم المراجعة في وقت الترجمة.

ولكن انتبه إلى أن تغيير رقم الإصدار تلقائيًا لا يوصى به للتجميعات ذات الأسماء الواضحة.والسبب هو أنه يجب تحديث كافة المراجع لمثل هذا التجميع في كل مرة يتم فيها إعادة إنشاء التجميع المشار إليه نظرًا لأن مراجع التجميع ذات الأسماء القوية تكون دائمًا مرجعًا لإصدار تجميع محدد.تقوم Microsoft بنفسها بتغيير رقم إصدار مجموعات .NET Framework فقط في حالة حدوث تغييرات في الواجهات.(ملاحظة:ما زلت أبحث عن الرابط في MSDN حيث قرأت ذلك.)

للحصول على معلومات متزايدة (DateTime) في خاصية AssemblyFileVersion التي تتمتع بميزة عدم كسر أي تبعيات.


بناءً على حل Boog (لم ينجح معي، ربما بسبب VS2008؟)، يمكنك استخدام مجموعة من حدث ما قبل البناء لإنشاء ملف، وإضافة هذا الملف (بما في ذلك خصائص الإصدار الخاص به) ثم استخدام طريقة للقراءة تلك القيم مرة أخرى.إنه..

حدث ما قبل البناء:

echo [assembly:System.Reflection.AssemblyFileVersion("%date:~-4,4%.%date:~-7,2%%date:~-10,2%.%time:~0,2%%time:~3,2%.%time:~-5,2%")] > $(ProjectDir)Properties\VersionInfo.cs

قم بتضمين ملف VersionInfo.cs الناتج (مجلد الخصائص الفرعي) في مشروعك

رمز لاستعادة التاريخ (من السنوات إلى الثواني):

var version = assembly.GetName().Version;
var fileVersionString = System.Diagnostics.FileVersionInfo.GetVersionInfo(assembly.Location).FileVersion;
Version fileVersion = new Version(fileVersionString);
var buildDateTime = new DateTime(fileVersion.Major, fileVersion.Minor/100, fileVersion.Minor%100, fileVersion.Build/100, fileVersion.Build%100, fileVersion.Revision);

ليست مريحة جداً..أيضًا، لا أعرف ما إذا كان يؤدي إلى إنشاء الكثير من عمليات إعادة البناء (نظرًا لأن الملف يتغير دائمًا).

يمكنك جعل الأمر أكثر ذكاءً، على سبيل المثال، إذا قمت بتحديث ملف VersionInfo.cs فقط كل بضع دقائق/ساعات (باستخدام ملف مؤقت ثم نسخ/الكتابة فوق VersionInfo.cs الحقيقي إذا تم اكتشاف تغيير كبير بدرجة كافية).لقد فعلت هذا مرة واحدة بنجاح كبير.

اضبط رقم الإصدار على "1.0.*" وسيقوم تلقائيًا بملء الرقمين الأخيرين بالتاريخ (بالأيام من نقطة ما) والوقت (نصف الثواني من منتصف الليل)

إنه موجود في خصائص مشروعك تحت ينشر

http://screencast.com/t/Vj7rhqJO
(~ http://screencast.com/t/Vj7rhqJO)

كيك يدعم تصحيح ملفات AssemblyInfo.مع وجود الكعكة بين يديك، لديك طرق لا حصر لها لتنفيذ زيادة الإصدار التلقائي.

مثال بسيط على الإصدار المتزايد مثل برنامج التحويل البرمجي C#:

Setup(() =>
{
    // Executed BEFORE the first task.
    var datetimeNow = DateTime.Now;
    var daysPart = (datetimeNow - new DateTime(2000, 1, 1)).Days;
    var secondsPart = (long)datetimeNow.TimeOfDay.TotalSeconds/2;
    var assemblyInfo = new AssemblyInfoSettings
    {
        Version = "3.0.0.0",
        FileVersion = string.Format("3.0.{0}.{1}", daysPart, secondsPart)
    };
    CreateAssemblyInfo("MyProject/Properties/AssemblyInfo.cs", assemblyInfo);
});

هنا:

  • الإصدار - هو إصدار التجميع.أفضل الممارسات هي قفل رقم الإصدار الرئيسي وترك الأصفار المتبقية (مثل "1.0.0.0").
  • FileVersion - هو إصدار ملف التجميع.

لاحظ أنه يمكنك تصحيح ليس فقط الإصدارات ولكن وكذلك جميع المعلومات الضرورية الأخرى.

انتقل إلى المشروع | خصائص ثم معلومات التجميع ثم إصدار التجميع ووضع * في المربع الأخير أو الثاني إلى الأخير (لا يمكنك زيادة المكونات الرئيسية أو الثانوية تلقائيا).

استخدم مهمة AssemblyInfo من مهام مجتمع MSBuild (http://msbuildtasks.tigris.org/) المشروع، وقم بدمجه في ملف .csproj/.vbproj الخاص بك.

يحتوي على عدد من الخيارات، بما في ذلك خيار لربط رقم الإصدار بالتاريخ والوقت من اليوم.

مُستَحسَن.

اعتبارًا من الآن، بالنسبة لطلبي،

string ver = Application.ProductVersion;

عائدات ver = 1.0.3251.27860

القيمة 3251 هي عدد الأيام منذ 1/1/2000.أستخدمه لوضع تاريخ إنشاء الإصدار على شاشة البداية لتطبيقي.عند التعامل مع مستخدم، يمكنني أن أسأل عن تاريخ الإنشاء وهو أسهل في التواصل معه من رقم طويل.

(أنا رجل واحد يدعم شركة صغيرة.قد لا يناسبك هذا الأسلوب.)

يعمل تغيير AssemblyInfo في VS2012.يبدو غريبًا عدم وجود المزيد من الدعم لهذا في Visual Studio، وكنت تعتقد أن هذا كان جزءًا أساسيًا من عملية الإنشاء/الإصدار.

كيفية الحصول على النسخة {major}.{year}.1{date}.1{time}

هذا نوع من التجربة، لكني أحبه.مستوحاة من جيف أتوود @ CodingHorror (وصلة).

يصبح رقم الإصدار الناتج 1.2016.10709.11641 (يعني 2016-07-09 16:41)، مما يسمح بذلك

  • حشوة الرجل الفقير صفر (مع القيادة الغبية 1س)
  • يمكن قراءتها تقريبًا من قبل الإنسان محلي DateTime مضمن في رقم الإصدار
  • ترك الإصدار الرئيسي بمفرده لإجراء تغييرات جذرية كبيرة حقًا.

أضف عنصرًا جديدًا إلى مشروعك، وحدد عام -> قالب النص، وقم بتسميته بشيء من هذا القبيل CustomVersionNumber و(حيثما ينطبق ذلك) قم بالتعليق على AssemblyVersion و AssemblyFileVersion في Properties/AssemblyInfo.cs.

وبعد ذلك، عند حفظ هذا الملف، أو إنشاء المشروع، سيؤدي ذلك إلى إعادة إنشاء ملف .cs الملف الموجود كعنصر فرعي ضمن الملف الذي تم إنشاؤه .tt ملف.

<#@ template language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>

//
// This code was generated by a tool. Any changes made manually will be lost
// the next time this code is regenerated.
//

using System.Reflection;

<#
    var date = DateTime.Now;
    int major = 1;
    int minor = date.Year;
    int build = 10000 + int.Parse(date.ToString("MMdd"));
    int revision = 10000 + int.Parse(date.ToString("HHmm"));
#>

[assembly: AssemblyVersion("<#= $"{major}.{minor}.{build}.{revision}" #>")]
[assembly: AssemblyFileVersion("<#= $"{major}.{minor}.{build}.{revision}" #>")]

ربما، لهذه المهمة، يمكنك استخدام رمز مثل هذا:

    private bool IncreaseFileVersionBuild()
    {
        if (System.Diagnostics.Debugger.IsAttached)
        {
            try
            {
                var fi = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory).Parent.Parent.GetDirectories("Properties")[0].GetFiles("AssemblyInfo.cs")[0];
                var ve = System.Diagnostics.FileVersionInfo.GetVersionInfo(System.Reflection.Assembly.GetExecutingAssembly().Location);
                string ol = ve.FileMajorPart.ToString() + "." + ve.FileMinorPart.ToString() + "." + ve.FileBuildPart.ToString() + "." + ve.FilePrivatePart.ToString();
                string ne = ve.FileMajorPart.ToString() + "." + ve.FileMinorPart.ToString() + "." + (ve.FileBuildPart + 1).ToString() + "." + ve.FilePrivatePart.ToString();
                System.IO.File.WriteAllText(fi.FullName, System.IO.File.ReadAllText(fi.FullName).Replace("[assembly: AssemblyFileVersion(\"" + ol + "\")]", "[assembly: AssemblyFileVersion(\"" + ne + "\")]"));
                return true;
            }
            catch
            {
                return false;
            }
        }
        return false;
    }

ونسميها من تحميل النموذج.
باستخدام هذا الرمز يمكنك تحديث أي جزء من معلومات الملف في AssemblyInfo.cs (ولكن يجب عليك استخدام بنية الدليل "القياسية").

معلومات التجميعUtil.حر.مفتوح المصدر.

أنا أستخدم هذا النهج https://stackoverflow.com/a/827209/3975786 عن طريق وضع قالب T4 في "عناصر الحل" واستخدامه مع "إضافة كرابط" داخل كل مشروع.

ربما فات الأوان للإجابة هنا ولكن نأمل أن يحل ذلك مشكلة شخص ما المحمومة.

أوتوماتيكي طريقة لتغيير إصدار التجميع لجميع مشاريعك باستخدام برنامج PowerShell النصي. هذا المقال سوف يحل العديد من مشاكلك.

في كل مرة أقوم فيها بإنشاء، يقوم تلقائيًا بزيادة الرقم الأقل أهمية.

ليس لدي أي فكرة عن كيفية تحديث الآخرين، ولكن على الأقل يجب أن ترى ذلك بالفعل...

لقد قمت بإنشاء تطبيق لزيادة إصدار الملف تلقائيًا.

  1. تحميل طلب
  2. أضف السطر التالي إلى سطر أوامر حدث ما قبل الإنشاء

    C: emp\IncrementFileVersion.exe $(SolutionDir)\Properties\AssemblyInfo.cs

  3. بناء المشروع

لتبسيط الأمر، لا يرسل التطبيق سوى رسائل في حالة وجود خطأ، وللتأكد من أنه يعمل بشكل جيد، ستحتاج إلى التحقق من إصدار الملف في "معلومات التجميع"

ملحوظة :سيتعين عليك إعادة تحميل الحل في Visual studio لزر "معلومات التجميع" لملء الحقول، ولكن ملف الإخراج الخاص بك سيكون له الإصدار المحدث.

للحصول على الاقتراحات والطلبات يرجى مراسلتي عبر البريد الإلكتروني على telson_alva@yahoo.com

في فيجوال ستوديو 2019

ولم يكن كافيا بالنسبة لي أن أضيف

[assembly: AssemblyVersion("1.0.*")]

عند بنائه يلقي لي هذا الخطأ

سلسلة الإصدار المحددة لا تتوافق مع التنسيق المطلوب

حل

تم قبول التنسيق أخيرًا بعد أن قمت بتعيينه Deterministic ل False في project.csproj

<Deterministic>false</Deterministic>

يحرر:

لسبب ما الإعداد Deterministic ل False أفسدت ملف التكوين الخاص بي أثناء تحميله وحفظه في مواقع مختلفة.

الحل البديل:

أقوم بإعداد حدث ما بعد الإنشاء لزيادة رقم المراجعة:

البرنامج النصي الدفعي لحدث ما بعد الإنشاء

وهذا يستدعي برنامج بوويرشيل النصي المسمى autoincrement_version.ps1 تمرير كحجة مسار AssemblyInfo.cs

if $(ConfigurationName) == Release (
PowerShell -ExecutionPolicy RemoteSigned $(ProjectDir)autoincrement_version.ps1 '$(ProjectDir)My Project\AssemblyInfo.cs'
)

البرنامج النصي Poweshell

يقوم تلقائيًا بزيادة رقم المراجعة باستخدام Regex

param( [string]$file );
  $regex_revision = '(?<=Version\("(?:\d+\.)+)(\d+)(?="\))'
  $found = (Get-Content $file) | Select-String -Pattern $regex_revision
  $revision = $found.matches[0].value
  $new_revision = [int]$revision + 1
  (Get-Content $file) -replace $regex_revision, $new_revision | Set-Content $file -Encoding UTF8
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top