diff options
Diffstat (limited to 'src/SMAPI.ModBuildConfig')
-rw-r--r-- | src/SMAPI.ModBuildConfig/BuildTasks/DeployModTask.cs (renamed from src/SMAPI.ModBuildConfig/DeployModTask.cs) | 31 | ||||
-rw-r--r-- | src/SMAPI.ModBuildConfig/BuildTasks/ValidateInstallTask.cs | 70 | ||||
-rw-r--r-- | src/SMAPI.ModBuildConfig/StardewModdingAPI.ModBuildConfig.csproj | 3 | ||||
-rw-r--r-- | src/SMAPI.ModBuildConfig/build/smapi.targets | 6 |
4 files changed, 77 insertions, 33 deletions
diff --git a/src/SMAPI.ModBuildConfig/DeployModTask.cs b/src/SMAPI.ModBuildConfig/BuildTasks/DeployModTask.cs index 0bfe9b2d..433e602f 100644 --- a/src/SMAPI.ModBuildConfig/DeployModTask.cs +++ b/src/SMAPI.ModBuildConfig/BuildTasks/DeployModTask.cs @@ -6,27 +6,12 @@ using Microsoft.Build.Framework; using Microsoft.Build.Utilities; using StardewModdingAPI.ModBuildConfig.Framework; -namespace StardewModdingAPI.ModBuildConfig +namespace StardewModdingAPI.ModBuildConfig.BuildTasks { /// <summary>A build task which deploys the mod files and prepares a release zip.</summary> public class DeployModTask : 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 name of the mod folder.</summary> @@ -49,10 +34,6 @@ namespace StardewModdingAPI.ModBuildConfig [Required] public string GameDir { get; set; } - /// <summary>The MSBuild OS value.</summary> - [Required] - public string Platform { get; set; } - /// <summary>Whether to enable copying the mod files into the game's Mods folder.</summary> [Required] public bool EnableModDeploy { get; set; } @@ -74,16 +55,6 @@ namespace StardewModdingAPI.ModBuildConfig try { - // validate context - 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."); - // get mod info ModFileManager package = new ModFileManager(this.ProjectDir, this.TargetDir); 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; + } + } + } +} diff --git a/src/SMAPI.ModBuildConfig/StardewModdingAPI.ModBuildConfig.csproj b/src/SMAPI.ModBuildConfig/StardewModdingAPI.ModBuildConfig.csproj index e04f09a7..0007e53e 100644 --- a/src/SMAPI.ModBuildConfig/StardewModdingAPI.ModBuildConfig.csproj +++ b/src/SMAPI.ModBuildConfig/StardewModdingAPI.ModBuildConfig.csproj @@ -38,7 +38,8 @@ <Reference Include="System.Web.Extensions" /> </ItemGroup> <ItemGroup> - <Compile Include="DeployModTask.cs" /> + <Compile Include="BuildTasks\ValidateInstallTask.cs" /> + <Compile Include="BuildTasks\DeployModTask.cs" /> <Compile Include="Framework\UserErrorException.cs" /> <Compile Include="Framework\ModFileManager.cs" /> <Compile Include="Properties\AssemblyInfo.cs" /> diff --git a/src/SMAPI.ModBuildConfig/build/smapi.targets b/src/SMAPI.ModBuildConfig/build/smapi.targets index 0010d8ff..9f3f13f5 100644 --- a/src/SMAPI.ModBuildConfig/build/smapi.targets +++ b/src/SMAPI.ModBuildConfig/build/smapi.targets @@ -3,6 +3,7 @@ ** Import build tasks **********************************************--> <UsingTask TaskName="DeployModTask" AssemblyFile="StardewModdingAPI.ModBuildConfig.dll" /> + <UsingTask TaskName="ValidateInstallTask" AssemblyFile="StardewModdingAPI.ModBuildConfig.dll" /> <!--********************************************* ** Find the basic mod metadata @@ -117,6 +118,9 @@ <!--********************************************* ** Deploy mod files & create release zip after build **********************************************--> + <Target Name="BeforeBuild"> + <ValidateInstallTask GameDir="$(GamePath)" Platform="$(OS)" /> + </Target> <Target Name="AfterBuild"> <DeployModTask ModFolderName="$(ModFolderName)" @@ -128,8 +132,6 @@ ProjectDir="$(ProjectDir)" TargetDir="$(TargetDir)" GameDir="$(GamePath)" - - Platform="$(OS)" /> </Target> </Project> |