none
Автоматический счётчик версии сборки ASP.NET MVC приложения и его вывод в представлении

    Вопрос

  • Собственно, кто-нибудь может подсказать как активировать автоматический счётчик версии ASP.NET MVC приложения и как его вывести в представлении?
    18 марта 2017 г. 4:49

Ответы

  • Вы имели ввиду AssemblyFileVersion наверное? Если так, то достаточно усановить AssemblyVersion("1.0.*") а вот строку AssemblyFileVersion убрать из AssemblyInfo.cs.


    Сделаем содержимое сообщества лучше, вместе!

    20 марта 2017 г. 17:27
    Модератор

Все ответы

  • Номер версии сборки вашего приложения или версии сборок Microsoft, попробуйте описать более развёрнуто?

    Сделаем содержимое сообщества лучше, вместе!

    18 марта 2017 г. 8:21
    Модератор
  • Работа над сайтом ведётся в Visual Studio, в том числе наполнение статическим содержимым, путём создания представлений, Экшенов и Контроллеров.

    Задача - вывести актуальную версию сайта, по факту хотелось бы иметь привязку к дате WebDeploy, учитывая, что перед этим собирается Release-сборка.

    Если в AssemblyInfo прописать:

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

    И вывести в требуемом представлении:

    System.Reflection.Assembly.GetAssembly(typeof(Startup)).GetName().Version.ToString()

    то мы сможем видеть последнюю дату актуализации C# кода, модификации представлений в этом случае не учитываются. А как учесть актуализацию файловой версии представления или всего сайта?

    18 марта 2017 г. 9:30
  • Вот код который я всегда использую, он позволяет получать дату когда проект собирался. Передаёте туда объект сборки и всё готово.

    internal class MetadataProvider
        {
            internal static DateTime GetLinkerTime(Assembly assembly, TimeZoneInfo target = null)
            {
                var filePath = assembly.Location;
                const int peHeaderOffset = 60;
                const int linkerTimestampOffset = 8;
    
                var buffer = new byte[2048];
    
                using (var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
                    stream.Read(buffer, 0, 2048);
    
                var offset = BitConverter.ToInt32(buffer, peHeaderOffset);
                var secondsSince1970 = BitConverter.ToInt32(buffer, offset + linkerTimestampOffset);
                var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
    
                var linkTimeUtc = epoch.AddSeconds(secondsSince1970);
    
                var tz = target ?? TimeZoneInfo.Local;
                var localTime = TimeZoneInfo.ConvertTimeFromUtc(linkTimeUtc, tz);
    
                return localTime;
            }
        }

    С представлениями и другими файлами немного сложнее. Если нужно вести их строгий учёт, то лучше компилировать их вместе со сборкой (их можно встраивать туда ка ресурсы), тогда всё встанет на свои места. Отдельно их контролировать сложно, но можно использовать таблицу хешей с номером версии сборки. Рассчитываете хеши для каждого представления/файла и храните эту информацию. Но вариант со влечением файлов намного лучше.


    Сделаем содержимое сообщества лучше, вместе!

    18 марта 2017 г. 9:48
    Модератор
  • Благодарю за код, но проще отказаться от такого. И камень будет лететь в Микрософт, что нет подобного функционала относительно версионности веб-приложения.

    А для чего сделана версионность файлов, которая прописывается руками, без возможности "*", инкремента?

    18 марта 2017 г. 14:58
  • Как раз AssemblyFileVersion характиризует изменение при сборке вашего проекта/сборки, обычно его увеличивают после каждого билда. Напротив, если вы меняете версию сборки (AssemblyVersion), то все те сборки в которых используется ваша сборка вынуждены тоже меняться/перекомпилироваться. Это происходит в основном если вы меняете открытый интерфейс вашего кода (открытые члены классов. интерфейсов и т.п.). А вот когда нет изменений в открытой части кода (публичный API не меняется), то тогда меняется номер файла (AssemblyFileVersion). Скажем вы пофиксили багу или оптимизировали код. Получается при каждом билде правильнее будет менять постоянно AssemblyFileVersion, а AssemblyVersion в зависимости от типа изменений.

    Сделаем содержимое сообщества лучше, вместе!

    18 марта 2017 г. 15:39
    Модератор
  • Так, теперь понятно что для чего. Осталось как-то заставить систему выставлять AssemblyVersion при каждой компиляции.
    20 марта 2017 г. 4:05
  • Вы имели ввиду AssemblyFileVersion наверное? Если так, то достаточно усановить AssemblyVersion("1.0.*") а вот строку AssemblyFileVersion убрать из AssemblyInfo.cs.


    Сделаем содержимое сообщества лучше, вместе!

    20 марта 2017 г. 17:27
    Модератор
  • Да, теперь окончательно всё встало на свои места. Для автоматической актуализации версии файла следует удалять AssemblyFileVersion.

    28 марта 2017 г. 12:40