Мне нравится IDE, потому что он помещает большую функциональность в моих кончиках пальцев. Редактирование/Компиляция/видимость файлов в проекте является всеми вещами, которые я оцениваю в IDE. Я использую Visual Studio теперь, но в прежней жизни я использовал SlickEdit и нашел, что это сделало мой процесс разработки более оптимизированным чем тогда, когда я не использовал его.
Мне удалось решить эту проблему с помощью специальной задачи. DLL библиотеки классов выглядит так (некоторый код изменен / исключен для краткости):
using System;
using System.IO;
using System.Text.RegularExpressions;
using Microsoft.Build.Framework;
namespace GetAssemblyFileVersion
{
public class GetAssemblyFileVersion : ITask
{
[Required]
public string strFilePathAssemblyInfo { get; set; }
[Output]
public string strAssemblyFileVersion { get; set; }
public bool Execute()
{
StreamReader streamreaderAssemblyInfo = null;
Match matchVersion;
Group groupVersion;
string strLine;
strAssemblyFileVersion = String.Empty;
try
{
streamreaderAssemblyInfo = new StreamReader(strFilePathAssemblyInfo);
while ((strLine = streamreaderAssemblyInfo.ReadLine()) != null)
{
matchVersion = Regex.Match(strLine, @"(?:AssemblyFileVersion\("")(?<ver>(\d*)\.(\d*)(\.(\d*)(\.(\d*))?)?)(?:""\))", RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace | RegexOptions.Singleline | RegexOptions.ExplicitCapture);
if (matchVersion.Success)
{
groupVersion = matchVersion.Groups["ver"];
if ((groupVersion.Success) && (!String.IsNullOrEmpty(groupVersion.Value)))
{
strAssemblyFileVersion = groupVersion.Value;
break;
}
}
}
}
catch (Exception e)
{
BuildMessageEventArgs args = new BuildMessageEventArgs(e.Message, string.Empty, "GetAssemblyFileVersion", MessageImportance.High);
BuildEngine.LogMessageEvent(args);
}
finally { if (streamreaderAssemblyInfo != null) streamreaderAssemblyInfo.Close(); }
return (true);
}
public IBuildEngine BuildEngine { get; set; }
public ITaskHost HostObject { get; set; }
}
}
И в файле проекта:
<UsingTask AssemblyFile="GetAssemblyFileVersion.dll" TaskName="GetAssemblyFileVersion.GetAssemblyFileVersion" />
<Target Name="AfterCompile">
<GetAssemblyFileVersion strFilePathAssemblyInfo="$(SolutionDir)\AssemblyInfo.cs">
<Output TaskParameter="strAssemblyFileVersion" PropertyName="strAssemblyFileVersion" />
</GetAssemblyFileVersion>
<Message Text="AssemblyFileVersion = $(strAssemblyFileVersion)" />
</Target>
Я протестировал это, и он прочитает обновленную версию, если вы используете MSBuild.ExtensionPack .VersionNumber.targets для автоматического управления версиями.
Очевидно, это можно было бы легко расширить так, чтобы регулярное выражение передавалось из файла проекта в более универсальную настраиваемую задачу, чтобы получить любое совпадение в любом файле.
Необходимо внести одно дополнительное изменение, чтобы сделать обновление ApplicationVersion
для каждой сборки. InitialTargets = "AfterCompile"
необходимо добавить в <Проект ...
. Это было решено Чао Куо .
А как насчет копирования ассмелби и последующего выполнения задачи сборки на копии?
Саид Ибрагим Хашими