bundle assets folder into mods by default

This commit is contained in:
Jesse Plamondon-Willard 2019-03-29 23:58:06 -04:00
parent e6e15bef1c
commit c3a9b69daa
No known key found for this signature in database
GPG Key ID: 7D7C8097B62033CE
3 changed files with 37 additions and 21 deletions

View File

@ -6,6 +6,7 @@ The package...
* detects your game install path; * detects your game install path;
* adds the assembly references you need (with automatic support for Linux/Mac/Windows); * adds the assembly references you need (with automatic support for Linux/Mac/Windows);
* packages the mod into your `Mods` folder when you rebuild the code (configurable); * packages the mod into your `Mods` folder when you rebuild the code (configurable);
* creates a release zip (configurable);
* configures Visual Studio to enable debugging into the code when the game is running (_Windows only_); * configures Visual Studio to enable debugging into the code when the game is running (_Windows only_);
* adds C# analyzers to warn for Stardew Valley-specific issues. * adds C# analyzers to warn for Stardew Valley-specific issues.
@ -17,25 +18,21 @@ The package...
* [Release notes](#release-notes) * [Release notes](#release-notes)
## Install ## Install
**When creating a new mod:** 1. Create an empty library project.<br /><small>(For an existing project, remove references to `Microsoft.Xna.*`, `MonoGame`, Stardew Valley,
`StardewModdingAPI`, and `xTile` instead.)</small>
1. Create an empty library project.
2. Reference the [`Pathoschild.Stardew.ModBuildConfig` NuGet package](https://www.nuget.org/packages/Pathoschild.Stardew.ModBuildConfig). 2. Reference the [`Pathoschild.Stardew.ModBuildConfig` NuGet package](https://www.nuget.org/packages/Pathoschild.Stardew.ModBuildConfig).
3. [Write your code](https://stardewvalleywiki.com/Modding:Creating_a_SMAPI_mod). 3. [Write your code](https://stardewvalleywiki.com/Modding:Creating_a_SMAPI_mod).
4. Compile on any platform. 4. Compile on any platform.
**When migrating an existing mod:**
1. Remove any project references to `Microsoft.Xna.*`, `MonoGame`, Stardew Valley,
`StardewModdingAPI`, and `xTile`.
2. Reference the [`Pathoschild.Stardew.ModBuildConfig` NuGet package](https://www.nuget.org/packages/Pathoschild.Stardew.ModBuildConfig).
3. Compile on any platform.
## Configure ## Configure
### Deploy files into the `Mods` folder ### Deploy files into the `Mods` folder
By default, your mod will be copied into the game's `Mods` folder (with a subfolder matching your Your mod is copied into the game's `Mods` folder (with a subfolder matching your project name)
project name) when you rebuild the code. The package will automatically include your when you rebuild the code. The package automatically includes...
`manifest.json`, any `i18n` files, and the build output.
* any build output;
* your `manifest.json`;
* any [`i18n` files](https://stardewvalleywiki.com/Modding:Translations);
* the `assets` folder if present.
To add custom files to the mod folder, just [add them to the build output](https://stackoverflow.com/a/10828462/262123). To add custom files to the mod folder, just [add them to the build output](https://stackoverflow.com/a/10828462/262123).
(If your project references another mod, make sure the reference is [_not_ marked 'copy local'](https://msdn.microsoft.com/en-us/library/t1zz5y8c(v=vs.100).aspx).) (If your project references another mod, make sure the reference is [_not_ marked 'copy local'](https://msdn.microsoft.com/en-us/library/t1zz5y8c(v=vs.100).aspx).)
@ -52,9 +49,9 @@ If you don't want to deploy the mod automatically, you can add this:
``` ```
### Create release zip ### Create release zip
By default, a zip file will be created in the build output when you rebuild the code. This zip file A zip file is also created in the build output folder when you rebuild the code. This contains the
contains all the files needed to share your mod in the recommended format for uploading to Nexus same files deployed to the `Mods` folder, in the recommended format for uploading to Nexus Mods or
Mods or other sites. other sites.
You can change the zipped folder name (and zip name) by adding this above the first You can change the zipped folder name (and zip name) by adding this above the first
`</PropertyGroup>` in your `.csproj`: `</PropertyGroup>` in your `.csproj`:

View File

@ -5,6 +5,7 @@ using System.Linq;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using StardewModdingAPI.Toolkit.Serialisation; using StardewModdingAPI.Toolkit.Serialisation;
using StardewModdingAPI.Toolkit.Serialisation.Models; using StardewModdingAPI.Toolkit.Serialisation.Models;
using StardewModdingAPI.Toolkit.Utilities;
namespace StardewModdingAPI.ModBuildConfig.Framework namespace StardewModdingAPI.ModBuildConfig.Framework
{ {
@ -61,18 +62,33 @@ namespace StardewModdingAPI.ModBuildConfig.Framework
hasProjectTranslations = true; hasProjectTranslations = true;
} }
// project assets folder
bool hasAssetsFolder = false;
DirectoryInfo assetsFolder = new DirectoryInfo(Path.Combine(projectDir, "assets"));
if (assetsFolder.Exists)
{
foreach (FileInfo file in assetsFolder.EnumerateFiles("*", SearchOption.AllDirectories))
{
string relativePath = PathUtilities.GetRelativePath(projectDir, file.FullName);
this.Files[relativePath] = file;
}
hasAssetsFolder = true;
}
// build output // build output
DirectoryInfo buildFolder = new DirectoryInfo(targetDir); DirectoryInfo buildFolder = new DirectoryInfo(targetDir);
foreach (FileInfo file in buildFolder.EnumerateFiles("*", SearchOption.AllDirectories)) foreach (FileInfo file in buildFolder.EnumerateFiles("*", SearchOption.AllDirectories))
{ {
// get relative paths // get path info
string relativePath = file.FullName.Replace(buildFolder.FullName, ""); string relativePath = PathUtilities.GetRelativePath(buildFolder.FullName, file.FullName);
string relativeDirPath = file.Directory.FullName.Replace(buildFolder.FullName, ""); string[] segments = PathUtilities.GetSegments(relativePath);
// prefer project manifest/i18n files // prefer project manifest/i18n/assets files
if (hasProjectManifest && this.EqualsInvariant(relativePath, this.ManifestFileName)) if (hasProjectManifest && this.EqualsInvariant(relativePath, this.ManifestFileName))
continue; continue;
if (hasProjectTranslations && this.EqualsInvariant(relativeDirPath, "i18n")) if (hasProjectTranslations && this.EqualsInvariant(segments[0], "i18n"))
continue;
if (hasAssetsFolder && this.EqualsInvariant(segments[0], "assets"))
continue; continue;
// handle ignored files // handle ignored files
@ -149,6 +165,8 @@ namespace StardewModdingAPI.ModBuildConfig.Framework
/// <param name="other">The string to compare with.</param> /// <param name="other">The string to compare with.</param>
private bool EqualsInvariant(string str, string other) private bool EqualsInvariant(string str, string other)
{ {
if (str == null)
return other == null;
return str.Equals(other, StringComparison.InvariantCultureIgnoreCase); return str.Equals(other, StringComparison.InvariantCultureIgnoreCase);
} }
} }

View File

@ -13,6 +13,7 @@
<description>Automates the build configuration for crossplatform Stardew Valley SMAPI mods. For Stardew Valley 1.3 or later.</description> <description>Automates the build configuration for crossplatform Stardew Valley SMAPI mods. For Stardew Valley 1.3 or later.</description>
<releaseNotes> <releaseNotes>
2.2.1: 2.2.1:
- If the project contains an `assets` folder, its contents are now included in the mod automatically.
- Dropped support for very old versions of SMAPI and Visual Studio. - Dropped support for very old versions of SMAPI and Visual Studio.
- Fixed `Newtonsoft.Json.pdb` included in release zips when Json.NET is referenced directly. - Fixed `Newtonsoft.Json.pdb` included in release zips when Json.NET is referenced directly.
</releaseNotes> </releaseNotes>