using System; using System.IO; using Cake.Common; using Cake.Common.IO; using Cake.Common.Tools.DotNet; using Cake.Common.Tools.DotNet.Clean; using Cake.Common.Tools.DotNet.Publish; using Cake.Core; using Cake.Frosting; using Cake.Json; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Vintagestory.API.Common; public static class Program { public static int Main(string[] args) { return new CakeHost() .UseContext() .Run(args); } } public class BuildContext : FrostingContext { public const string ProjectName = "AriasServerUtils"; public string BuildConfiguration { get; set; } public string Version { get; } public string Name { get; } public bool SkipJsonValidation { get; set; } public BuildContext(ICakeContext context) : base(context) { BuildConfiguration = context.Argument("configuration", "Release"); SkipJsonValidation = context.Argument("skipJsonValidation", false); var modInfo = context.DeserializeJsonFromFile($"../{BuildContext.ProjectName}/modinfo.json"); Version = modInfo.Version; Name = modInfo.ModID; } } [TaskName("ValidateJson")] public sealed class ValidateJsonTask : FrostingTask { public override void Run(BuildContext context) { if (context.SkipJsonValidation) { return; } var jsonFiles = context.GetFiles($"../{BuildContext.ProjectName}/assets/**/*.json"); foreach (var file in jsonFiles) { try { var json = File.ReadAllText(file.FullPath); JToken.Parse(json); } catch (JsonException ex) { throw new Exception($"Validation failed for JSON file: {file.FullPath}{Environment.NewLine}{ex.Message}", ex); } } } } [TaskName("Build")] [IsDependentOn(typeof(ValidateJsonTask))] public sealed class BuildTask : FrostingTask { public override void Run(BuildContext context) { context.DotNetClean($"../{BuildContext.ProjectName}/{BuildContext.ProjectName}.csproj", new DotNetCleanSettings { Configuration = context.BuildConfiguration }); context.DotNetPublish($"../{BuildContext.ProjectName}/{BuildContext.ProjectName}.csproj", new DotNetPublishSettings { Configuration = context.BuildConfiguration }); } } [TaskName("Package")] [IsDependentOn(typeof(BuildTask))] public sealed class PackageTask : FrostingTask { public override void Run(BuildContext context) { context.EnsureDirectoryExists("../Releases"); context.CleanDirectory("../Releases"); context.EnsureDirectoryExists($"../Releases/{context.Name}"); context.CopyFiles($"../{BuildContext.ProjectName}/bin/{context.BuildConfiguration}/Mods/mod/publish/*", $"../Releases/{context.Name}"); context.CopyDirectory($"../{BuildContext.ProjectName}/assets", $"../Releases/{context.Name}/assets"); context.CopyFile($"../{BuildContext.ProjectName}/modinfo.json", $"../Releases/{context.Name}/modinfo.json"); if (context.FileExists($"../{BuildContext.ProjectName}/modicon.png")) { context.CopyFile($"../{BuildContext.ProjectName}/modicon.png", $"../Releases/{context.Name}/modicon.png"); } context.Zip($"../Releases/{context.Name}", $"../Releases/{context.Name}_{context.Version}.zip"); } } [TaskName("Default")] [IsDependentOn(typeof(PackageTask))] public class DefaultTask : FrostingTask { }