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'
Я не могу ответить на все Ваши вопросы, поскольку у меня нет опыта с 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 шагами:
Существуют задачи, такие как 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'" />
Ваш другой вопрос того, как обновить номер версии только, когда исходный код изменился, очень зависит от Вашего, как Ваш процесс сборки взаимодействует с Вашим управлением исходным кодом. Обычно, регистрация в изменениях исходного файла должна инициировать Непрерывную сборку Интеграции. Это - то для использования для обновления числа соответствующей версии.
Я написал одно индивидуальное задание, вы можете сослаться на приведенный ниже код. Он создаст утилиту, в которую вы можете передать информацию о сборке, путь 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");
}
}
}
}