diff options
author | Jesse Plamondon-Willard <github@jplamondonw.com> | 2017-10-10 21:59:05 -0400 |
---|---|---|
committer | Jesse Plamondon-Willard <github@jplamondonw.com> | 2017-10-10 21:59:05 -0400 |
commit | 1c0d22e82c4690069754d211179d8aef636a3e7a (patch) | |
tree | dc15076933c45776838848f27bf07443645880e0 /src/SMAPI.ModBuildConfig/BuildTasks/ValidateInstallTask.cs | |
parent | 5dfb12c2781c73854dc9aff2ae12b0a8de83c408 (diff) | |
download | SMAPI-1c0d22e82c4690069754d211179d8aef636a3e7a.tar.gz SMAPI-1c0d22e82c4690069754d211179d8aef636a3e7a.tar.bz2 SMAPI-1c0d22e82c4690069754d211179d8aef636a3e7a.zip |
validate build context before build
Diffstat (limited to 'src/SMAPI.ModBuildConfig/BuildTasks/ValidateInstallTask.cs')
-rw-r--r-- | src/SMAPI.ModBuildConfig/BuildTasks/ValidateInstallTask.cs | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/src/SMAPI.ModBuildConfig/BuildTasks/ValidateInstallTask.cs b/src/SMAPI.ModBuildConfig/BuildTasks/ValidateInstallTask.cs new file mode 100644 index 00000000..2cc7dc9c --- /dev/null +++ b/src/SMAPI.ModBuildConfig/BuildTasks/ValidateInstallTask.cs @@ -0,0 +1,70 @@ +using System; +using System.Collections.Generic; +using System.IO; +using Microsoft.Build.Framework; +using Microsoft.Build.Utilities; +using StardewModdingAPI.ModBuildConfig.Framework; + +namespace StardewModdingAPI.ModBuildConfig.BuildTasks +{ + /// <summary>A build task which validates the install context.</summary> + public class ValidateInstallTask : Task + { + /********* + ** Properties + *********/ + /// <summary>The MSBuild platforms recognised by the build configuration.</summary> + private readonly HashSet<string> ValidPlatforms = new HashSet<string>(new[] { "OSX", "Unix", "Windows_NT" }, StringComparer.InvariantCultureIgnoreCase); + + /// <summary>The name of the game's main executable file.</summary> + private string GameExeName => this.Platform == "Windows_NT" + ? "Stardew Valley.exe" + : "StardewValley.exe"; + + /// <summary>The name of SMAPI's main executable file.</summary> + private readonly string SmapiExeName = "StardewModdingAPI.exe"; + + + /********* + ** Accessors + *********/ + /// <summary>The folder containing the game files.</summary> + public string GameDir { get; set; } + + /// <summary>The MSBuild OS value.</summary> + public string Platform { get; set; } + + + /********* + ** Public methods + *********/ + /// <summary>When overridden in a derived class, executes the task.</summary> + /// <returns>true if the task successfully executed; otherwise, false.</returns> + public override bool Execute() + { + try + { + if (!this.ValidPlatforms.Contains(this.Platform)) + throw new UserErrorException($"The mod build package doesn't recognise OS type '{this.Platform}'."); + if (!Directory.Exists(this.GameDir)) + throw new UserErrorException("The mod build package can't find your game path. See https://github.com/Pathoschild/SMAPI/blob/develop/docs/mod-build-config.md for help specifying it."); + if (!File.Exists(Path.Combine(this.GameDir, this.GameExeName))) + throw new UserErrorException($"The mod build package found a game folder at {this.GameDir}, but it doesn't contain the {this.GameExeName} file. If this folder is invalid, delete it and the package will autodetect another game install path."); + if (!File.Exists(Path.Combine(this.GameDir, this.SmapiExeName))) + throw new UserErrorException($"The mod build package found a game folder at {this.GameDir}, but it doesn't contain SMAPI. You need to install SMAPI before building the mod."); + + return true; + } + catch (UserErrorException ex) + { + this.Log.LogErrorFromException(ex); + return false; + } + catch (Exception ex) + { + this.Log.LogError($"The mod build package failed trying to deploy the mod.\n{ex}"); + return false; + } + } + } +} |