Другой, дружественный к PCL подход заключается в использовании встроенной задачи MSBuild для замены времени сборки в строку, возвращаемую свойством приложения. Мы успешно используем этот подход в приложении с проектами Xamarin.Forms, Xamarin.Android и Xamarin.iOS.
EDIT:
Упрощается путем перемещения всей логики в файл SetBuildDate.targets
и использования Regex
вместо простой замены строки, так что файл может быть изменен каждой сборкой без «перезагрузки».
Определение встроенной задачи MSBuild (для этого примера сохранено в файле SetBuildDate.targets, локальном для проекта Xamarin.Forms):
<Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003' ToolsVersion="12.0">
<UsingTask TaskName="SetBuildDate" TaskFactory="CodeTaskFactory"
AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v12.0.dll">
<ParameterGroup>
<FilePath ParameterType="System.String" Required="true" />
</ParameterGroup>
<Task>
<Code Type="Fragment" Language="cs"><![CDATA[
DateTime now = DateTime.UtcNow;
string buildDate = now.ToString("F");
string replacement = string.Format("BuildDate => \"{0}\"", buildDate);
string pattern = @"BuildDate => ""([^""]*)""";
string content = File.ReadAllText(FilePath);
System.Text.RegularExpressions.Regex rgx = new System.Text.RegularExpressions.Regex(pattern);
content = rgx.Replace(content, replacement);
File.WriteAllText(FilePath, content);
File.SetLastWriteTimeUtc(FilePath, now);
]]></Code>
</Task>
</UsingTask>
</Project>
Вызов указанной выше встроенной задачи в файле csproj Xamarin.Forms в target BeforeBuild:
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets. -->
<Import Project="SetBuildDate.targets" />
<Target Name="BeforeBuild">
<SetBuildDate FilePath="$(MSBuildProjectDirectory)\BuildMetadata.cs" />
</Target>
Свойство FilePath
установлено в файл BuildMetadata.cs
в проекте Xamarin.Forms, который содержит простой класс со строковым свойством BuildDate
, в который будет подставлено время сборки:
public class BuildMetadata
{
public static string BuildDate => "This can be any arbitrary string";
}
Добавить этот файл BuildMetadata.cs
в проект. Он будет изменяться при каждой сборке, но таким образом, чтобы допускались повторные сборки (повторные замены), поэтому вы можете включить или опустить его в системе контроля версий по своему усмотрению.