Как я могу использовать MSBuild для получения информации о версии обновления только, когда блок изменился?

u'áíóús' является строкой текста . То, что вы видите в REPL, - это каноническое представление этого объекта:

>>> print u'áíóús'
áíóús
>>> print repr(u'áíóús')
u'\xe1\xed\xf3\xfas'

Такие вещи, как \xe1, связаны с шестнадцатеричными ординалами каждого символа:

[111 ]

Только последний символ был в диапазоне ascii, то есть ординалы в range(128), так что только последний символ "s" отчетливо виден в Python 2.x:

>>> chr(0x73)
's'

'áíóús' является строкой из байтов . То, что вы видите напечатанным, является кодировкой тех же текстовых символов, а ваш эмулятор терминала принимает кодировку:

>>> 'áíóús'
'\xc3\xa1\xc3\xad\xc3\xb3\xc3\xbas'
>>> u'áíóús'.encode('utf-8')
'\xc3\xa1\xc3\xad\xc3\xb3\xc3\xbas'

8
задан Jared 21 October 2008 в 19:53
поделиться

2 ответа

Я не могу ответить на все Ваши вопросы, поскольку у меня нет опыта с TFS.

Но я могу рекомендовать лучшему подходу использовать для обновления Ваших файлов AssemblyInfo.cs, чем использование задачи AssemblyInfo. Та задача, кажется, просто воссоздает стандартный файл AssemblyInfo с нуля и теряет любые пользовательские части, которые Вы, возможно, добавили.

По этой причине я предлагаю, чтобы Вы изучили задачу FileUpdate из проекта Задач Сообщества MSBuild. Это может искать определенное содержание в файле и заменить его, как это:

<FileUpdate 
Files="$(WebDir)\Properties\AssemblyInfo.cs"
Regex="(\d+)\.(\d+)\.(\d+)\.(\d+)"
ReplacementText="$(Major).$(ServicePack).$(Build).$(Revision)" 
Condition="'$(Configuration)' == 'Release'"
/>

Существует несколько способов, которыми можно управлять постепенным увеличением номера сборки. Поскольку я только хочу, чтобы номер сборки увеличил, если сборка абсолютно успешна, я использую метод с 2 шагами:

  • считайте число из текстового файла (единственной вещью в файле является число), и добавьте 1, не изменяя файл;
  • поскольку заключительный шаг в процессе сборки, если все успешно выполнилось, сохраняет увеличенное число назад к текстовому файлу.

Существуют задачи, такие как ReadLinesFromFile, который может помочь Вам с этим, но я нашел самым легким записать небольшую пользовательскую задачу:

using System;
using System.IO;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;

namespace CredibleCustomBuildTasks
{
    public class IncrementTask : Task
    {
        [Required]
        public bool SaveChange { get; set; }

        [Required]
        public string IncrementFileName { get; set; }

        [Output]
        public int Increment { get; set; }

        public override bool Execute()
        {
            if (File.Exists(IncrementFileName))
            {
                string lines = File.ReadAllText(IncrementFileName);
                int result;
                if(Int32.TryParse(lines, out result))
                {
                    Increment = result + 1;
                }
                else
                {
                    Log.LogError("Unable to parse integer in '{0}' (contents of {1})");
                    return false;
                }
            }
            else
            {
                Increment = 1;
            }

            if (SaveChange)
            {
                File.Delete(IncrementFileName);
                File.WriteAllText(IncrementFileName, Increment.ToString());
            }
            return true;
        }
    }
}

Я использую это перед FileUpdateTask для получения следующего номера сборки:

<IncrementTask 
IncrementFileName="$(BuildNumberFile)" 
SaveChange="false">
  <Output TaskParameter="Increment" PropertyName="Build" />
</IncrementTask>

и как мой заключительный шаг (перед уведомлением других) в сборке:

<IncrementTask 
IncrementFileName="$(BuildNumberFile)" 
SaveChange="true"
Condition="'$(Configuration)' == 'Release'" />

Ваш другой вопрос того, как обновить номер версии только, когда исходный код изменился, очень зависит от Вашего, как Ваш процесс сборки взаимодействует с Вашим управлением исходным кодом. Обычно, регистрация в изменениях исходного файла должна инициировать Непрерывную сборку Интеграции. Это - то для использования для обновления числа соответствующей версии.

10
ответ дан 5 December 2019 в 17:43
поделиться

Я написал одно индивидуальное задание, вы можете сослаться на приведенный ниже код. Он создаст утилиту, в которую вы можете передать информацию о сборке, путь Major, minor и номер сборки. вы можете изменить его, чтобы получить номер редакции. Так как в моем случае эта задача была выполнена разработчиком, я использовал поиск и замену всей строки.

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

namespace UpdateVersion
{
    class SetVersion
    {
        static void Main(string[] args)
        {
            String FilePath = args[0];
            String MajVersion=args[1];
            String MinVersion = args[2];
            String BuildNumber = args[3];
            string RevisionNumber = null;

            StreamReader Reader = File.OpenText(FilePath);
            string contents = Reader.ReadToEnd();
            Reader.Close();

            MatchCollection match = Regex.Matches(contents, @"\[assembly: AssemblyVersion\("".*""\)\]", RegexOptions.IgnoreCase);
            if (match[0].Value != null)
            {
                string strRevisionNumber = match[0].Value;

                RevisionNumber = strRevisionNumber.Substring(strRevisionNumber.LastIndexOf(".") + 1, (strRevisionNumber.LastIndexOf("\"")-1) - strRevisionNumber.LastIndexOf("."));

                String replaceWithText = String.Format("[assembly: AssemblyVersion(\"{0}.{1}.{2}.{3}\")]", MajVersion, MinVersion, BuildNumber, RevisionNumber);
                string newText = Regex.Replace(contents, @"\[assembly: AssemblyVersion\("".*""\)\]", replaceWithText);

                StreamWriter writer = new StreamWriter(FilePath, false);
                writer.Write(newText);
                writer.Close();
            }
            else
            {
                Console.WriteLine("No matching values found");
            }
        }
    }
}
0
ответ дан 5 December 2019 в 17:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: