diff --git a/.gitignore b/.gitignore index 8a30d25..5842824 100644 --- a/.gitignore +++ b/.gitignore @@ -396,3 +396,11 @@ FodyWeavers.xsd # JetBrains Rider *.sln.iml + + +# TALXIS DevKit temp folders +pack-dataverse-latest-to-local.ps1 +pack-dataverse-selected.ps1 +_temp/r +_export/**/*.* +_temp/**/*.* \ No newline at end of file diff --git a/TALXIS.DevKit.Build.slnx b/TALXIS.DevKit.Build.slnx index 9c4b1bf..cbd11a5 100644 --- a/TALXIS.DevKit.Build.slnx +++ b/TALXIS.DevKit.Build.slnx @@ -6,4 +6,7 @@ + + + diff --git a/src/Dataverse/PDPackage/README.md b/src/Dataverse/PDPackage/README.md new file mode 100644 index 0000000..f1608d7 --- /dev/null +++ b/src/Dataverse/PDPackage/README.md @@ -0,0 +1,3 @@ +# TALXIS.DevKit.Build.Dataverse.Tasks + +See [here](https://github.com/TALXIS/tools-devkit-build) for more information. \ No newline at end of file diff --git a/src/Dataverse/PDPackage/TALXIS.DevKit.Build.Dataverse.PdPackage.csproj b/src/Dataverse/PDPackage/TALXIS.DevKit.Build.Dataverse.PdPackage.csproj new file mode 100644 index 0000000..2cc6eab --- /dev/null +++ b/src/Dataverse/PDPackage/TALXIS.DevKit.Build.Dataverse.PdPackage.csproj @@ -0,0 +1,13 @@ + + + + net8.0 + true + 0.0.0.1 + TALXIS.DevKit.Build.Dataverse.PdPackage.nuspec + + Version=$(Version) + + + + \ No newline at end of file diff --git a/src/Dataverse/PDPackage/TALXIS.DevKit.Build.Dataverse.PdPackage.nuspec b/src/Dataverse/PDPackage/TALXIS.DevKit.Build.Dataverse.PdPackage.nuspec new file mode 100644 index 0000000..ccdb9c6 --- /dev/null +++ b/src/Dataverse/PDPackage/TALXIS.DevKit.Build.Dataverse.PdPackage.nuspec @@ -0,0 +1,28 @@ + + + + TALXIS.DevKit.Build.Dataverse.PdPackage + $Version$ + TALXIS + true + false + MIT + https://licenses.nuget.org/MIT + README.md + https://github.com/TALXIS/tools-devkit-build + Dataverse MSBuild PDPackage + https://github.com/TALXIS/tools-devkit-build/releases + 2025 NETWORG + + + + + + + + + + + + diff --git a/src/Dataverse/PDPackage/msbuild/build/TALXIS.DevKit.Build.Dataverse.PdPackage.targets b/src/Dataverse/PDPackage/msbuild/build/TALXIS.DevKit.Build.Dataverse.PdPackage.targets new file mode 100644 index 0000000..5569d13 --- /dev/null +++ b/src/Dataverse/PDPackage/msbuild/build/TALXIS.DevKit.Build.Dataverse.PdPackage.targets @@ -0,0 +1,8 @@ + + + + + + diff --git a/src/Dataverse/PDPackage/msbuild/tasks/TALXIS.DevKit.Build.Dataverse.DataPackage.targets b/src/Dataverse/PDPackage/msbuild/tasks/TALXIS.DevKit.Build.Dataverse.DataPackage.targets new file mode 100644 index 0000000..e7ce5eb --- /dev/null +++ b/src/Dataverse/PDPackage/msbuild/tasks/TALXIS.DevKit.Build.Dataverse.DataPackage.targets @@ -0,0 +1,52 @@ + + + + $([System.IO.Path]::GetFullPath('$(MSBuildProjectDirectory)')) + + + + $([System.IO.Path]::Combine('$([System.IO.Path]::GetFullPath('$(TargetDir)'))','DataPackages')) + + + $([System.IO.Path]::Combine('$([System.IO.Path]::GetFullPath('$(OutputPath)'))','DataPackages')) + + + $([System.Text.RegularExpressions.Regex]::Replace('$(DataPackageOutputDir)', '[\\/]*$', ''))\ + + + + + <_DataPackageCandidates Include="$(DataPackageSearchRoot)**\[Content_Types].xml" + Condition="Exists('$([System.IO.Path]::Combine('$([System.IO.Path]::GetDirectoryName('%(FullPath)'))','data_schema.xml'))') and + Exists('$([System.IO.Path]::Combine('$([System.IO.Path]::GetDirectoryName('%(FullPath)'))','data.xml'))')"> + $([System.IO.Path]::GetDirectoryName('%(FullPath)')) + + + + + <_DataPackageDirs Include="@(_DataPackageCandidates->'%(PackageDir)')" Distinct="true" /> + + + + + + + + + + + <_DataPackageZips Include="@(_DataPackageDirs)"> + $(DataPackageOutputDir)$([System.IO.Path]::GetFileName('%(Identity)')).zip + + + + + + + + diff --git a/src/Dataverse/PDPackage/msbuild/tasks/TALXIS.DevKit.Build.Dataverse.PdPackage.ILRepack.targets b/src/Dataverse/PDPackage/msbuild/tasks/TALXIS.DevKit.Build.Dataverse.PdPackage.ILRepack.targets new file mode 100644 index 0000000..d63fe14 --- /dev/null +++ b/src/Dataverse/PDPackage/msbuild/tasks/TALXIS.DevKit.Build.Dataverse.PdPackage.ILRepack.targets @@ -0,0 +1,40 @@ + + + 2.0.18 + $(NuGetPackageRoot)ilrepack\$(ILRepackVersion)\tools\ILRepack.exe + true + $(TargetDir) + $([System.Text.RegularExpressions.Regex]::Replace('$(ReferencedAssembliesDir)', '[\\/]+$', '')) + + + + + $(TargetPath) + <_KeyFileSwitch Condition="Exists('$(DataversePackageILRepackKeyFile)')">/keyfile:"$(DataversePackageILRepackKeyFile)" + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Dataverse/PDPackage/msbuild/tasks/TALXIS.DevKit.Build.Dataverse.PdPackage.targets b/src/Dataverse/PDPackage/msbuild/tasks/TALXIS.DevKit.Build.Dataverse.PdPackage.targets new file mode 100644 index 0000000..980ee19 --- /dev/null +++ b/src/Dataverse/PDPackage/msbuild/tasks/TALXIS.DevKit.Build.Dataverse.PdPackage.targets @@ -0,0 +1,19 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Dataverse/ScriptLibrary/README.md b/src/Dataverse/ScriptLibrary/README.md new file mode 100644 index 0000000..f1608d7 --- /dev/null +++ b/src/Dataverse/ScriptLibrary/README.md @@ -0,0 +1,3 @@ +# TALXIS.DevKit.Build.Dataverse.Tasks + +See [here](https://github.com/TALXIS/tools-devkit-build) for more information. \ No newline at end of file diff --git a/src/Dataverse/ScriptLibrary/TALXIS.DevKit.Build.Dataverse.ScriptLibrary.csproj b/src/Dataverse/ScriptLibrary/TALXIS.DevKit.Build.Dataverse.ScriptLibrary.csproj new file mode 100644 index 0000000..6a1c63d --- /dev/null +++ b/src/Dataverse/ScriptLibrary/TALXIS.DevKit.Build.Dataverse.ScriptLibrary.csproj @@ -0,0 +1,13 @@ + + + + net8.0 + true + 0.0.0.1 + TALXIS.DevKit.Build.Dataverse.ScriptLibrary.nuspec + + Version=$(Version) + + + + \ No newline at end of file diff --git a/src/Dataverse/ScriptLibrary/TALXIS.DevKit.Build.Dataverse.ScriptLibrary.nuspec b/src/Dataverse/ScriptLibrary/TALXIS.DevKit.Build.Dataverse.ScriptLibrary.nuspec new file mode 100644 index 0000000..4317d12 --- /dev/null +++ b/src/Dataverse/ScriptLibrary/TALXIS.DevKit.Build.Dataverse.ScriptLibrary.nuspec @@ -0,0 +1,27 @@ + + + + TALXIS.DevKit.Build.Dataverse.ScriptLibrary + $Version$ + TALXIS + true + false + MIT + https://licenses.nuget.org/MIT + README.md + https://github.com/TALXIS/tools-devkit-build + Dataverse MSBuild ScriptLibrary + https://github.com/TALXIS/tools-devkit-build/releases + 2025 NETWORG + + + + + + + + + + + \ No newline at end of file diff --git a/src/Dataverse/ScriptLibrary/msbuild/build/TALXIS.DevKit.Build.Dataverse.ScriptLibrary.props b/src/Dataverse/ScriptLibrary/msbuild/build/TALXIS.DevKit.Build.Dataverse.ScriptLibrary.props new file mode 100644 index 0000000..07cd5de --- /dev/null +++ b/src/Dataverse/ScriptLibrary/msbuild/build/TALXIS.DevKit.Build.Dataverse.ScriptLibrary.props @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/Dataverse/ScriptLibrary/msbuild/build/TALXIS.DevKit.Build.Dataverse.ScriptLibrary.targets b/src/Dataverse/ScriptLibrary/msbuild/build/TALXIS.DevKit.Build.Dataverse.ScriptLibrary.targets new file mode 100644 index 0000000..8a0424d --- /dev/null +++ b/src/Dataverse/ScriptLibrary/msbuild/build/TALXIS.DevKit.Build.Dataverse.ScriptLibrary.targets @@ -0,0 +1,5 @@ + + + + + diff --git a/src/Dataverse/ScriptLibrary/msbuild/tasks/TALXIS.DevKit.Build.Dataverse.ScriptLibrary.props b/src/Dataverse/ScriptLibrary/msbuild/tasks/TALXIS.DevKit.Build.Dataverse.ScriptLibrary.props new file mode 100644 index 0000000..196c76e --- /dev/null +++ b/src/Dataverse/ScriptLibrary/msbuild/tasks/TALXIS.DevKit.Build.Dataverse.ScriptLibrary.props @@ -0,0 +1,8 @@ + + + ScriptLibrary + + $(MSBuildProjectDirectory)\TS\build\main.js + + + diff --git a/src/Dataverse/ScriptLibrary/msbuild/tasks/TALXIS.DevKit.Build.Dataverse.ScriptLibrary.targets b/src/Dataverse/ScriptLibrary/msbuild/tasks/TALXIS.DevKit.Build.Dataverse.ScriptLibrary.targets new file mode 100644 index 0000000..8116df0 --- /dev/null +++ b/src/Dataverse/ScriptLibrary/msbuild/tasks/TALXIS.DevKit.Build.Dataverse.ScriptLibrary.targets @@ -0,0 +1,59 @@ + + + + + false + + $(MSBuildProjectDirectory)\TS + + + + + + + + + + + + + + + + + + + + PreserveNewest + + + + + + <_ProjectType Include="$(MSBuildProjectFullPath)"> + $(ProjectType) + + + + + + + <_ScriptLibraryOutputs Include="$(MSBuildProjectDirectory)\TS\build\main.js" /> + + + + + + <_ProjectOutputPath Include="$(TargetPath)" /> + + + + diff --git a/src/Dataverse/Sdk/README.md b/src/Dataverse/Sdk/README.md new file mode 100644 index 0000000..5a1ce0a --- /dev/null +++ b/src/Dataverse/Sdk/README.md @@ -0,0 +1,2 @@ +# TALXIS.DevKit.Build.Sdk + diff --git a/src/Dataverse/Sdk/Sdk/Sdk.props b/src/Dataverse/Sdk/Sdk/Sdk.props new file mode 100644 index 0000000..6ac8f96 --- /dev/null +++ b/src/Dataverse/Sdk/Sdk/Sdk.props @@ -0,0 +1,9 @@ + + + + + + TALXIS.DevKit.Build.Dataverse + 0.0.0.1 + + diff --git a/src/Dataverse/Sdk/Sdk/Sdk.targets b/src/Dataverse/Sdk/Sdk/Sdk.targets new file mode 100644 index 0000000..8abf675 --- /dev/null +++ b/src/Dataverse/Sdk/Sdk/Sdk.targets @@ -0,0 +1,15 @@ + + + + + $(TALXISDevKitDataversePackageBase).$(ProjectType) + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + + + diff --git a/src/Dataverse/Sdk/TALXIS.DevKit.Build.Sdk.csproj b/src/Dataverse/Sdk/TALXIS.DevKit.Build.Sdk.csproj new file mode 100644 index 0000000..229c117 --- /dev/null +++ b/src/Dataverse/Sdk/TALXIS.DevKit.Build.Sdk.csproj @@ -0,0 +1,13 @@ + + + + net8.0 + true + 0.0.0.1 + TALXIS.DevKit.Build.Sdk.nuspec + + Version=$(Version) + + + + diff --git a/src/Dataverse/Sdk/TALXIS.DevKit.Build.Sdk.nuspec b/src/Dataverse/Sdk/TALXIS.DevKit.Build.Sdk.nuspec new file mode 100644 index 0000000..e39f9e7 --- /dev/null +++ b/src/Dataverse/Sdk/TALXIS.DevKit.Build.Sdk.nuspec @@ -0,0 +1,26 @@ + + + + TALXIS.DevKit.Build.Sdk + $Version$ + TALXIS + true + false + MIT + https://licenses.nuget.org/MIT + README.md + https://github.com/TALXIS/tools-devkit-build + Dataverse MSBuild SDK + https://github.com/TALXIS/tools-devkit-build/releases + 2025 NETWORG + + + + + + + + + + diff --git a/src/Dataverse/Solution/msbuild/build/TALXIS.DevKit.Build.Dataverse.Solution.OverridePAC.targets b/src/Dataverse/Solution/msbuild/build/TALXIS.DevKit.Build.Dataverse.Solution.OverridePAC.targets new file mode 100644 index 0000000..658e6ba --- /dev/null +++ b/src/Dataverse/Solution/msbuild/build/TALXIS.DevKit.Build.Dataverse.Solution.OverridePAC.targets @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/Dataverse/Solution/msbuild/build/TALXIS.DevKit.Build.Dataverse.Solution.ScriptLibraries.targets b/src/Dataverse/Solution/msbuild/build/TALXIS.DevKit.Build.Dataverse.Solution.ScriptLibraries.targets new file mode 100644 index 0000000..658e6ba --- /dev/null +++ b/src/Dataverse/Solution/msbuild/build/TALXIS.DevKit.Build.Dataverse.Solution.ScriptLibraries.targets @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/Dataverse/Solution/msbuild/tasks/TALXIS.DevKit.Build.Dataverse.Solution.OverridePAC.targets b/src/Dataverse/Solution/msbuild/tasks/TALXIS.DevKit.Build.Dataverse.Solution.OverridePAC.targets new file mode 100644 index 0000000..1b1cccf --- /dev/null +++ b/src/Dataverse/Solution/msbuild/tasks/TALXIS.DevKit.Build.Dataverse.Solution.OverridePAC.targets @@ -0,0 +1,43 @@ + + + + + + + + <_ScriptLibraryProjectsList>;@(_ScriptLibraryProjects->'%(Identity)'); + + + + <_CdsRefs Include="@(ProjectReference)" /> + + + + <_CdsRefs Remove="@(_CdsRefs)" + Condition="$([System.String]::Copy('$(_ScriptLibraryProjectsList)').Contains(';%(FullPath);'))" /> + + + + + + + + + + + + + + diff --git a/src/Dataverse/Solution/msbuild/tasks/TALXIS.DevKit.Build.Dataverse.Solution.ScriptLibraries.targets b/src/Dataverse/Solution/msbuild/tasks/TALXIS.DevKit.Build.Dataverse.Solution.ScriptLibraries.targets new file mode 100644 index 0000000..5634a9a --- /dev/null +++ b/src/Dataverse/Solution/msbuild/tasks/TALXIS.DevKit.Build.Dataverse.Solution.ScriptLibraries.targets @@ -0,0 +1,96 @@ + + + + + + + + + + + + <_ScriptLibraryProjects Remove="@(_ScriptLibraryProjects)" /> + <_ScriptLibraryProjects Include="@(_ProjectTypeFromReferences)" + Condition="'%(ProjectType)'=='ScriptLibrary'" /> + + + + + + + + + + + + + + + + + $(MSBuildProjectDirectory)\$(SolutionRootPath)\WebResources\ + + + + + + + + + <_ScriptFiles Include="@(_ScriptLibraryOutputs)" /> + <_ScriptFilesToCopy Include="@(_ScriptFiles)"> + + $(WebResourcesDir)$(PublisherPrefix)_$([System.IO.Path]::GetFileName('%(Identity)')) + $(PublisherPrefix)_$([System.IO.Path]::GetFileName('%(Identity)')) + $([System.IO.Path]::GetFileName('%(Identity)')) + $(WebResourcesDir)$(PublisherPrefix)_$([System.IO.Path]::GetFileName('%(Identity)')).data.xml + + + + + + + + + <_ScriptFilesMissingDataXml Include="@(_ScriptFilesToCopy)" + Condition="!Exists('%(DataXmlFile)')"> + + + + + + + + + diff --git a/src/Dataverse/Solution/msbuild/tasks/TALXIS.DevKit.Build.Dataverse.Solution.props b/src/Dataverse/Solution/msbuild/tasks/TALXIS.DevKit.Build.Dataverse.Solution.props index a10194c..763fffb 100644 --- a/src/Dataverse/Solution/msbuild/tasks/TALXIS.DevKit.Build.Dataverse.Solution.props +++ b/src/Dataverse/Solution/msbuild/tasks/TALXIS.DevKit.Build.Dataverse.Solution.props @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/src/Dataverse/Solution/msbuild/tasks/TALXIS.DevKit.Build.Dataverse.Solution.targets b/src/Dataverse/Solution/msbuild/tasks/TALXIS.DevKit.Build.Dataverse.Solution.targets index 72ecfe8..e049176 100644 --- a/src/Dataverse/Solution/msbuild/tasks/TALXIS.DevKit.Build.Dataverse.Solution.targets +++ b/src/Dataverse/Solution/msbuild/tasks/TALXIS.DevKit.Build.Dataverse.Solution.targets @@ -1,15 +1,31 @@ - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Dataverse/Tasks/Tasks/EnsureWebResourceDataXml.cs b/src/Dataverse/Tasks/Tasks/EnsureWebResourceDataXml.cs new file mode 100644 index 0000000..04cf6b9 --- /dev/null +++ b/src/Dataverse/Tasks/Tasks/EnsureWebResourceDataXml.cs @@ -0,0 +1,83 @@ +using System; +using System.IO; +using System.Text; +using System.Xml; +using System.Xml.Linq; +using Microsoft.Build.Framework; +using Microsoft.Build.Utilities; + +public class EnsureWebResourceDataXml : Task +{ + [Required] + public string DataXmlFile { get; set; } + + [Required] + public string WebResourceName { get; set; } + + [Required] + public string DisplayName { get; set; } + + public string WebResourceType { get; set; } = "3"; + + public string IntroducedVersion { get; set; } = "1.0.0.0"; + + public override bool Execute() + { + try + { + if (File.Exists(DataXmlFile)) + { + return true; + } + + var directory = Path.GetDirectoryName(DataXmlFile); + if (!string.IsNullOrWhiteSpace(directory)) + { + Directory.CreateDirectory(directory); + } + + var guid = Guid.NewGuid(); + var guidLower = guid.ToString(); + var guidUpper = guid.ToString().ToUpperInvariant(); + + var doc = new XDocument( + new XDeclaration("1.0", "utf-8", null), + new XElement("WebResource", + new XAttribute(XNamespace.Xmlns + "xsi", "http://www.w3.org/2001/XMLSchema-instance"), + new XElement("WebResourceId", $"{{{guidLower}}}"), + new XElement("Name", WebResourceName), + new XElement("DisplayName", DisplayName), + new XElement("WebResourceType", string.IsNullOrWhiteSpace(WebResourceType) ? "3" : WebResourceType), + new XElement("IntroducedVersion", string.IsNullOrWhiteSpace(IntroducedVersion) ? "1.0.0.0" : IntroducedVersion), + new XElement("IsEnabledForMobileClient", "0"), + new XElement("IsAvailableForMobileOffline", "0"), + new XElement("IsCustomizable", "1"), + new XElement("CanBeDeleted", "1"), + new XElement("IsHidden", "0"), + new XElement("FileName", $"/WebResources/{WebResourceName}{guidUpper}") + ) + ); + + var settings = new XmlWriterSettings + { + Encoding = new UTF8Encoding(false), + Indent = true, + NewLineChars = Environment.NewLine, + NewLineHandling = NewLineHandling.Replace + }; + + using (var writer = XmlWriter.Create(DataXmlFile, settings)) + { + doc.Save(writer); + } + + Log.LogMessage(MessageImportance.High, $"Generated webresource data.xml: {DataXmlFile}"); + return true; + } + catch (Exception ex) + { + Log.LogErrorFromException(ex, true); + return false; + } + } +} diff --git a/src/Dataverse/Tasks/Tasks/GenerateGitVersion.cs b/src/Dataverse/Tasks/Tasks/GenerateGitVersion.cs index fe79fe0..6052781 100644 --- a/src/Dataverse/Tasks/Tasks/GenerateGitVersion.cs +++ b/src/Dataverse/Tasks/Tasks/GenerateGitVersion.cs @@ -41,8 +41,21 @@ public override bool Execute() // Prepare for running git commands var gitInfo = CreateGitProcessInfo(ProjectPath); + if (!IsGitRepository(gitInfo)) + { + Log.LogWarning($"Git repository not found for ProjectPath '{ProjectPath}'. Falling back to LocalBranchBuildVersionNumber."); + VersionOutput = LocalBranchBuildVersionNumber; + return true; + } var currentBranch = GetCurrentBranch(gitInfo); + if (string.IsNullOrWhiteSpace(ApplyToBranches)) + { + Log.LogWarning("ApplyToBranches is empty. Falling back to LocalBranchBuildVersionNumber."); + VersionOutput = LocalBranchBuildVersionNumber; + return true; + } + _branches = ApplyToBranches.Split(';').Select(BranchVersioning.Parse); if (_branches == null || !_branches.Any()) { @@ -214,6 +227,20 @@ private string ExecuteGitCommand(ProcessStartInfo gitInfo, string command) } } } + + private bool IsGitRepository(ProcessStartInfo gitInfo) + { + try + { + string output = ExecuteGitCommand(gitInfo, "rev-parse --is-inside-work-tree"); + return output.Trim().Equals("true", StringComparison.OrdinalIgnoreCase); + } + catch (Exception ex) + { + Log.LogMessage(MessageImportance.Low, $"Git repository check failed: {ex.Message}"); + return false; + } + } private void RetrieveAllProjectReferences(string projectPath, List projects) { var projectFile = ""; @@ -286,4 +313,4 @@ public static BranchVersioning Parse(string branchDefinition) return new BranchVersioning { BranchName = branchName, Prefix = prefix }; } } -} \ No newline at end of file +} diff --git a/src/Dataverse/Tasks/msbuild/tasks/TALXIS.DevKit.Build.Dataverse.Tasks.targets b/src/Dataverse/Tasks/msbuild/tasks/TALXIS.DevKit.Build.Dataverse.Tasks.targets index 5d062d3..1c0dfc8 100644 --- a/src/Dataverse/Tasks/msbuild/tasks/TALXIS.DevKit.Build.Dataverse.Tasks.targets +++ b/src/Dataverse/Tasks/msbuild/tasks/TALXIS.DevKit.Build.Dataverse.Tasks.targets @@ -23,4 +23,5 @@ - \ No newline at end of file + +