summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-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.cs70
-rw-r--r--src/SMAPI.ModBuildConfig/StardewModdingAPI.ModBuildConfig.csproj3
-rw-r--r--src/SMAPI.ModBuildConfig/build/smapi.targets6
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>