Skip to content

Commit 10bde55

Browse files
authored
Merge pull request #88 from cwensley/mac-include-version
Include version in macOS app bundle
2 parents 8b126ab + aec584f commit 10bde55

File tree

4 files changed

+130
-46
lines changed

4 files changed

+130
-46
lines changed

Source/Directory.Build.props

+11-2
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,17 @@
88

99
<PropertyGroup>
1010
<Company>Picoe Software Solutions</Company>
11-
<Copyright>(c) 2006-2022 by Curtis Wensley aka Eto</Copyright>
12-
<Version Condition="$(Version) == ''">3.3.11-dev</Version>
11+
<Copyright>(c) 2006-2023 by Curtis Wensley aka Eto</Copyright>
12+
13+
<DevVersion>3.3.12</DevVersion>
14+
15+
<!-- set version from tag -->
16+
<Version Condition="$(Version) == '' AND $(BuildBranch.StartsWith('refs/tags/'))">$(BuildBranch.Substring(10))</Version>
17+
<!-- set version for CI build -->
18+
<Version Condition="$(Version) == '' AND $(BuildVersion) != ''">$(DevVersion)-ci-$([System.DateTime]::Now.ToString('yyyyMMdd')).$(BuildVersion)</Version>
19+
<!-- set version for development -->
20+
<Version Condition="$(Version) == ''">$(DevVersion)-dev</Version>
21+
1322

1423
<BasePath>$([System.IO.Path]::GetFullPath('$(MSBuildThisFileDirectory)..\'))</BasePath>
1524
<ArtifactsDir>$(BasePath)artifacts\</ArtifactsDir>

Source/Directory.Build.targets

100644100755
+2-44
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,7 @@
11
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
22

3-
<!-- <Import Project="EmbedReferences.targets" /> -->
3+
<Import Project="UpdatePList.targets" />
44

5-
<UsingTask TaskName="_ParseVersion" TaskFactory="RoslynCodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.Core.dll">
6-
<ParameterGroup>
7-
<Version ParameterType="System.String" Required="true" />
8-
<AssemblyVersion ParameterType="System.String" Output="true" />
9-
<AssemblyFileVersion ParameterType="System.String" Output="true" />
10-
<AssemblyInformationalVersion ParameterType="System.String" Output="true" />
11-
</ParameterGroup>
12-
<Task>
13-
<Using Namespace="System"/>
14-
<Using Namespace="System.IO"/>
15-
<Using Namespace="System.Text.RegularExpressions"/>
16-
<Code Type="Fragment" Language="cs"><![CDATA[
17-
var regex = new Regex(@"(?<ver>(?<maj>\d+)[.](?<min>\d+)([.](?<build>\d+)([.](?<rev>\d+))?)?)([-](?<info>.+))?");
18-
19-
if (string.IsNullOrEmpty(AssemblyVersion)) AssemblyVersion = regex.Replace(Version, "${ver}");
20-
if (string.IsNullOrEmpty(AssemblyFileVersion)) AssemblyFileVersion = AssemblyFileVersion ?? regex.Replace(Version, "${ver}");
21-
if (string.IsNullOrEmpty(AssemblyInformationalVersion)) AssemblyInformationalVersion = Version;
22-
23-
]]></Code>
24-
</Task>
25-
</UsingTask>
26-
27-
<Target Name="_ParseAssemblyVersion" BeforeTargets="BeforeBuild">
28-
29-
<_ParseVersion Version="$(Version)">
30-
<Output TaskParameter="AssemblyVersion" PropertyName="AssemblyVersion"/>
31-
<Output TaskParameter="AssemblyFileVersion" PropertyName="AssemblyFileVersion"/>
32-
<Output TaskParameter="AssemblyInformationalVersion" PropertyName="AssemblyInformationalVersion"/>
33-
</_ParseVersion>
34-
</Target>
5+
<!-- <Import Project="EmbedReferences.targets" /> -->
356

36-
<Target Name="_WriteVersion" BeforeTargets="CoreCompile" Condition="$(GenerateAssemblyVersion) == 'True'"
37-
Inputs="$(MSBuildAllProjects);@(Compile);@(_CoreCompileResourceInputs);$(ApplicationIcon);$(AssemblyOriginatorKeyFile);@(ReferencePathWithRefAssemblies);@(CompiledLicenseFile);@(LinkResource);@(EmbeddedDocumentation);$(Win32Resource);$(Win32Manifest);@(CustomAdditionalCompileInputs);$(ResolvedCodeAnalysisRuleSet);@(AdditionalFiles);@(EmbeddedFiles)"
38-
Outputs="$(IntermediateOutputPath)VersionInfo.cs">
39-
40-
<ItemGroup>
41-
<VersionInfo Include="[assembly: System.Reflection.AssemblyVersion(&quot;$(AssemblyVersion)&quot;)]" />
42-
<VersionInfo Include="[assembly: System.Reflection.AssemblyFileVersion(&quot;$(AssemblyFileVersion)&quot;)]" />
43-
<VersionInfo Include="[assembly: System.Reflection.AssemblyInformationalVersion(&quot;$(AssemblyInformationalVersion)&quot;)]" />
44-
</ItemGroup>
45-
<MakeDir Directories="$(IntermediateOutputPath)" />
46-
<WriteLinesToFile File="$(IntermediateOutputPath)VersionInfo.cs" Overwrite="True" Lines="@(VersionInfo)" />
47-
</Target>
48-
497
</Project>

Source/PabloDraw/PabloDraw.csproj

+9
Original file line numberDiff line numberDiff line change
@@ -108,5 +108,14 @@
108108
<!-- Should go into Eto 2.7.2 -->
109109
<MakeDir Directories="$(DmgOutputPath)" />
110110
</Target>
111+
112+
<Target Name="_UpdateMacVersion" Condition="$(BuildTarget) == 'Mac'" BeforeTargets="MacFinishBundle">
113+
<ItemGroup>
114+
<PListEntry Include="CFBundleShortVersionString" Value="$(AssemblyVersion)" />
115+
<PListEntry Include="CFBundleVersion" Value="$(AssemblyVersion)" />
116+
</ItemGroup>
117+
118+
<UpdatePListEntries TargetFile="$(OutputPListFile)" Entries="@(PListEntry)" />
119+
</Target>
111120

112121
</Project>

Source/UpdatePList.targets

+108
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
2+
3+
4+
<UsingTask TaskName="UpdatePListEntries" TaskFactory="RoslynCodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.Core.dll">
5+
<ParameterGroup>
6+
<TargetFile ParameterType="System.String" Required="true" />
7+
<Entries ParameterType="Microsoft.Build.Framework.ITaskItem[]" Required="true" />
8+
<IconFile ParameterType="System.String" Output="true" />
9+
</ParameterGroup>
10+
<Task>
11+
<Reference Include="netstandard" />
12+
<Code Type="Class" Language="cs"><![CDATA[
13+
using System;
14+
using System.IO;
15+
using System.Xml;
16+
using System.Text;
17+
using Microsoft.Build.Framework;
18+
using Microsoft.Build.Utilities;
19+
20+
public class UpdatePListEntries : Task
21+
{
22+
[Required]
23+
public string TargetFile { get; set; }
24+
[Required]
25+
public Microsoft.Build.Framework.ITaskItem[] Entries { get; set; }
26+
[Output]
27+
public string IconFile { get; set; }
28+
29+
XmlDocument xml;
30+
XmlNode dict;
31+
32+
class NullSubsetXmlTextWriter : XmlTextWriter
33+
{
34+
XmlWriterSettings _settings;
35+
public NullSubsetXmlTextWriter(string inputFileName, Encoding encoding)
36+
: base(inputFileName, encoding)
37+
{
38+
Formatting = Formatting.Indented;
39+
IndentChar = ' ';
40+
Indentation = 2;
41+
_settings = new XmlWriterSettings();
42+
_settings.Encoding = Encoding.UTF8;
43+
_settings.Indent = true;
44+
_settings.IndentChars = " ";
45+
_settings.NewLineChars = "\n";
46+
_settings.NewLineHandling = NewLineHandling.Entitize;
47+
}
48+
49+
public override XmlWriterSettings Settings { get { return _settings; } }
50+
51+
public override void WriteDocType(string name, string pubid, string sysid, string subset)
52+
{
53+
// fix issue writing doctype
54+
if (subset == string.Empty)
55+
subset = null;
56+
base.WriteDocType(name, pubid, sysid, subset);
57+
}
58+
}
59+
60+
string GetStringProperty(string name)
61+
{
62+
var location = dict.SelectSingleNode("key[.='" + name + "']/following-sibling::string[1]");
63+
return location.InnerText;
64+
}
65+
66+
void AddStringProperty(string name, string value, bool force = false)
67+
{
68+
XmlNode node;
69+
70+
var exists = dict.SelectSingleNode("key[text()='" + name + "']") != null;
71+
if (exists && !force)
72+
return;
73+
74+
dict.AppendChild(node = xml.CreateNode(XmlNodeType.Element, "key", null));
75+
node.InnerText = name;
76+
dict.AppendChild(node = xml.CreateNode(XmlNodeType.Element, "string", null));
77+
node.InnerText = value;
78+
}
79+
80+
public override bool Execute()
81+
{
82+
xml = new XmlDocument();
83+
xml.Load(TargetFile);
84+
85+
dict = xml.SelectSingleNode("plist/dict") as XmlElement;
86+
87+
foreach (var entry in Entries)
88+
{
89+
if (!bool.TryParse(entry.GetMetadata("Force"), out var force))
90+
force = false;
91+
92+
AddStringProperty(entry.ItemSpec, entry.GetMetadata("Value"), force);
93+
}
94+
95+
IconFile = GetStringProperty("CFBundleIconFile");
96+
97+
using (var sw = new NullSubsetXmlTextWriter(TargetFile, Encoding.UTF8))
98+
xml.Save(sw);
99+
100+
return true;
101+
}
102+
}
103+
]]></Code>
104+
</Task>
105+
</UsingTask>
106+
107+
108+
</Project>

0 commit comments

Comments
 (0)