diff --git a/.github/workflows/build-smapi.yml b/.github/workflows/build-smapi.yml
index 314799ed..828e4fef 100644
--- a/.github/workflows/build-smapi.yml
+++ b/.github/workflows/build-smapi.yml
@@ -74,8 +74,8 @@ jobs:
Write-Host "This is a dev version. Building as version: $updatedVersion"
- bash build/unix/set-smapi-version.sh "$updatedVersion"
- Write-Host 'Version updated using build/unix/set-smapi-version.sh.'
+ ./build/scripts/set-smapi-version.ps1 "$updatedVersion"
+ Write-Host 'Version updated.'
- name: Checkout game reference assemblies
run: |
@@ -85,7 +85,7 @@ jobs:
shell: pwsh
run: |
Write-Host "Building SMAPI $env:VERSION."
- bash build/unix/prepare-install-package.sh "$env:VERSION"
+ ./build/scripts/prepare-install-package.ps1 "$env:VERSION"
- name: Rename build zips
run: |
diff --git a/build/scripts/lib/in-place-regex.ps1 b/build/scripts/lib/in-place-regex.ps1
index 7b309342..ce4f2c3e 100644
--- a/build/scripts/lib/in-place-regex.ps1
+++ b/build/scripts/lib/in-place-regex.ps1
@@ -1,4 +1,4 @@
-function In-Place-Regex {
+function In-Place-Regex {
param (
[Parameter(Mandatory)][string]$Path,
[Parameter(Mandatory)][string]$Search,
diff --git a/build/scripts/prepare-install-package.ps1 b/build/scripts/prepare-install-package.ps1
index a5a6b043..2218cfe9 100644
--- a/build/scripts/prepare-install-package.ps1
+++ b/build/scripts/prepare-install-package.ps1
@@ -1,33 +1,63 @@
#
#
-# This is the PowerShell equivalent of ../unix/prepare-install-package.sh, *except* that it doesn't
-# set Linux permissions, create the install.dat files, or create the final zip (unless you specify
-# --windows-only). Due to limitations in PowerShell, the final changes are handled by the
-# windows/finalize-install-package.sh file in WSL.
-#
-# When making changes, make sure to update ../unix/prepare-install-package.ps1 too.
+# Note: On Windows, this script *does not* set Linux permissions. The final changes are handled by the
+# finalize-install-package.sh file in WSL.
#
#
. "$PSScriptRoot/lib/in-place-regex.ps1"
+##########
+## Read arguments
+##########
+$windowsOnly = $false # Windows-only build
+$skipBundleDeletion = $false # skip bundle deletion (only applies when using WSL to finalize the build on Windows)
+ foreach ($arg in $args) {
+ if ($arg -eq "--windows-only" -and $IsWindows) {
+ $windowsOnly = $true
+ }
+ elseif ($arg -eq "--skip-bundle-deletion") {
+ $skipBundleDeletion = $true
+ }
+}
+
+
##########
## Find the game folder
##########
-$possibleGamePaths=(
- # GOG
- "C:\Program Files\GalaxyClient\Games\Stardew Valley",
- "C:\Program Files\GOG Galaxy\Games\Stardew Valley",
- "C:\Program Files\GOG Games\Stardew Valley",
- "C:\Program Files (x86)\GalaxyClient\Games\Stardew Valley",
- "C:\Program Files (x86)\GOG Galaxy\Games\Stardew Valley",
- "C:\Program Files (x86)\GOG Games\Stardew Valley",
+if ($IsWindows) {
+ $possibleGamePaths=(
+ # GOG
+ "C:\Program Files\GalaxyClient\Games\Stardew Valley",
+ "C:\Program Files\GOG Galaxy\Games\Stardew Valley",
+ "C:\Program Files\GOG Games\Stardew Valley",
+ "C:\Program Files (x86)\GalaxyClient\Games\Stardew Valley",
+ "C:\Program Files (x86)\GOG Galaxy\Games\Stardew Valley",
+ "C:\Program Files (x86)\GOG Games\Stardew Valley",
+
+ # Steam
+ "C:\Program Files\Steam\steamapps\common\Stardew Valley",
+ "C:\Program Files (x86)\Steam\steamapps\common\Stardew Valley"
+ )
+}
+else {
+ $possibleGamePaths=(
+ # override
+ "$HOME/StardewValley",
+
+ # Linux
+ "$HOME/GOG Games/Stardew Valley/game",
+ "$HOME/.steam/steam/steamapps/common/Stardew Valley",
+ "$HOME/.local/share/Steam/steamapps/common/Stardew Valley",
+ "$HOME/.var/app/com.valvesoftware.Steam/data/Steam/steamapps/common/Stardew Valley",
+
+ # macOS
+ "/Applications/Stardew Valley.app/Contents/MacOS",
+ "$HOME/Library/Application Support/Steam/steamapps/common/Stardew Valley/Contents/MacOS"
+ )
+}
- # Steam
- "C:\Program Files\Steam\steamapps\common\Stardew Valley",
- "C:\Program Files (x86)\Steam\steamapps\common\Stardew Valley"
-)
$gamePath = ""
foreach ($possibleGamePath in $possibleGamePaths) {
if (Test-Path $possibleGamePath -PathType Container) {
@@ -46,9 +76,16 @@ $bundleModNames = "ConsoleCommands", "SaveBackup"
# build configuration
$buildConfig = "Release"
$framework = "net6.0"
-$folders = "linux", "macOS", "windows"
-$runtimes = @{ linux = "linux-x64"; macOS = "osx-x64"; windows = "win-x64" }
-$msBuildPlatformNames = @{ linux = "Unix"; macOS = "OSX"; windows = "Windows_NT" }
+if ($windowsOnly) {
+ $folders = "windows"
+ $runtimes = @{ windows = "win-x64" }
+ $msBuildPlatformNames = @{ windows = "Windows_NT" }
+}
+else {
+ $folders = "linux", "macOS", "windows"
+ $runtimes = @{ linux = "linux-x64"; macOS = "osx-x64"; windows = "win-x64" }
+ $msBuildPlatformNames = @{ linux = "Unix"; macOS = "OSX"; windows = "Windows_NT" }
+}
# version number
$version = $args[0]
@@ -56,35 +93,24 @@ if (!$version) {
$version = Read-Host "SMAPI release version (like '4.0.0')"
}
-# Windows-only build
-$windowsOnly = $false
-foreach ($arg in $args) {
- if ($arg -eq "--windows-only") {
- $windowsOnly = $true
- $folders = "windows"
- $runtimes = @{ windows = "win-x64" }
- $msBuildPlatformNames = @{ windows = "Windows_NT" }
- }
-}
-
##########
## Move to SMAPI root
##########
-cd "$PSScriptRoot/../.."
+Set-Location "$PSScriptRoot/../.."
##########
## Clear old build files
##########
-echo "Clearing old builds..."
-echo "-------------------------------------------------"
+Write-Output "Clearing old builds..."
+Write-Output "-------------------------------------------------"
-foreach ($path in (dir -Recurse -Include ('bin', 'obj'))) {
- echo "$path"
- rm -Recurse -Force "$path"
+foreach ($path in (Get-ChildItem -Recurse -Include ('bin', 'obj'))) {
+ Write-Output "$path"
+ Remove-Item -Recurse -Force "$path"
}
-echo ""
+Write-Output ""
##########
@@ -95,24 +121,24 @@ foreach ($folder in $folders) {
$runtime = $runtimes[$folder]
$msbuildPlatformName = $msBuildPlatformNames[$folder]
- echo "Compiling SMAPI for $folder..."
- echo "-------------------------------------------------"
+ Write-Output "Compiling SMAPI for $folder..."
+ Write-Output "-------------------------------------------------"
dotnet publish src/SMAPI --configuration $buildConfig -v minimal --runtime "$runtime" --framework "$framework" -p:OS="$msbuildPlatformName" -p:TargetFrameworks="$framework" -p:GamePath="$gamePath" -p:CopyToGameFolder="false" --self-contained true
- echo ""
- echo ""
+ Write-Output ""
+ Write-Output ""
- echo "Compiling installer for $folder..."
- echo "-------------------------------------------------"
+ Write-Output "Compiling installer for $folder..."
+ Write-Output "-------------------------------------------------"
dotnet publish src/SMAPI.Installer --configuration $buildConfig -v minimal --runtime "$runtime" --framework "$framework" -p:OS="$msbuildPlatformName" -p:TargetFrameworks="$framework" -p:GamePath="$gamePath" -p:CopyToGameFolder="false" --self-contained true
- echo ""
- echo ""
+ Write-Output ""
+ Write-Output ""
foreach ($modName in $bundleModNames) {
- echo "Compiling $modName for $folder..."
- echo "-------------------------------------------------"
+ Write-Output "Compiling $modName for $folder..."
+ Write-Output "-------------------------------------------------"
dotnet publish src/SMAPI.Mods.$modName --configuration $buildConfig -v minimal --runtime "$runtime" --framework "$framework" -p:OS="$msbuildPlatformName" -p:TargetFrameworks="$framework" -p:GamePath="$gamePath" -p:CopyToGameFolder="false" --self-contained false
- echo ""
- echo ""
+ Write-Output ""
+ Write-Output ""
}
}
@@ -120,8 +146,8 @@ foreach ($folder in $folders) {
##########
## Prepare install package
##########
-echo "Preparing install package..."
-echo "----------------------------"
+Write-Output "Preparing install package..."
+Write-Output "----------------------------"
# init paths
$installAssets = "src/SMAPI.Installer/assets"
@@ -130,7 +156,16 @@ $packageDevPath = "bin/SMAPI installer for developers"
# init structure
foreach ($folder in $folders) {
- mkdir "$packagePath/internal/$folder/bundle/smapi-internal" > $null
+ $folderPath = "$packagePath/internal/$folder/bundle/smapi-internal"
+
+ if ($IsWindows) {
+ # On Windows, mkdir creates parent directories automatically and the --parents argument isn't recognized.
+ mkdir "$folderPath" > $null
+ }
+ else
+ {
+ mkdir "$folderPath" --parents
+ }
}
# copy base installer files
@@ -139,7 +174,7 @@ foreach ($name in @("install on Linux.sh", "install on macOS.command", "install
continue;
}
- cp "$installAssets/$name" "$packagePath"
+ Copy-Item "$installAssets/$name" "$packagePath"
}
# copy per-platform files
@@ -152,18 +187,18 @@ foreach ($folder in $folders) {
$bundlePath = "$internalPath/bundle"
# installer files
- cp "src/SMAPI.Installer/bin/$buildConfig/$runtime/publish/*" "$internalPath" -Recurse
- rm -Recurse -Force "$internalPath/assets"
+ Copy-Item "src/SMAPI.Installer/bin/$buildConfig/$runtime/publish/*" "$internalPath" -Recurse
+ Remove-Item -Recurse -Force "$internalPath/assets"
# runtime config for SMAPI
# This is identical to the one generated by the build, except that the min runtime version is
- # set to 5.0.0 (instead of whatever version it was built with) and rollForward is set to latestMinor instead of
+ # set to 6.0.0 (instead of whatever version it was built with) and rollForward is set to latestMinor instead of
# minor.
- cp "$installAssets/runtimeconfig.json" "$bundlePath/StardewModdingAPI.runtimeconfig.json"
+ Copy-Item "$installAssets/runtimeconfig.json" "$bundlePath/StardewModdingAPI.runtimeconfig.json"
# installer DLL config
if ($folder -eq "windows") {
- cp "$installAssets/windows-exe-config.xml" "$packagePath/internal/windows/install.exe.config"
+ Copy-Item "$installAssets/windows-exe-config.xml" "$packagePath/internal/windows/install.exe.config"
}
# bundle root files
@@ -172,29 +207,29 @@ foreach ($folder in $folders) {
$name = "$name.exe"
}
- cp "$smapiBin/$name" "$bundlePath"
+ Copy-Item "$smapiBin/$name" "$bundlePath"
}
# bundle i18n
- cp -Recurse "$smapiBin/i18n" "$bundlePath/smapi-internal"
+ Copy-Item -Recurse "$smapiBin/i18n" "$bundlePath/smapi-internal"
# bundle smapi-internal
foreach ($name in @("0Harmony.dll", "0Harmony.xml", "Markdig.dll", "Mono.Cecil.dll", "Mono.Cecil.Mdb.dll", "Mono.Cecil.Pdb.dll", "MonoMod.Common.dll", "Newtonsoft.Json.dll", "Pathoschild.Http.Client.dll", "Pintail.dll", "TMXTile.dll", "SMAPI.Toolkit.dll", "SMAPI.Toolkit.xml", "SMAPI.Toolkit.CoreInterfaces.dll", "SMAPI.Toolkit.CoreInterfaces.xml", "System.Net.Http.Formatting.dll")) {
- cp "$smapiBin/$name" "$bundlePath/smapi-internal"
+ Copy-Item "$smapiBin/$name" "$bundlePath/smapi-internal"
}
if ($folder -eq "windows") {
- cp "$smapiBin/VdfConverter.dll" "$bundlePath/smapi-internal"
+ Copy-Item "$smapiBin/VdfConverter.dll" "$bundlePath/smapi-internal"
}
- cp "$smapiBin/SMAPI.blacklist.json" "$bundlePath/smapi-internal/blacklist.json"
- cp "$smapiBin/SMAPI.config.json" "$bundlePath/smapi-internal/config.json"
- cp "$smapiBin/SMAPI.metadata.json" "$bundlePath/smapi-internal/metadata.json"
+ Copy-Item "$smapiBin/SMAPI.blacklist.json" "$bundlePath/smapi-internal/blacklist.json"
+ Copy-Item "$smapiBin/SMAPI.config.json" "$bundlePath/smapi-internal/config.json"
+ Copy-Item "$smapiBin/SMAPI.metadata.json" "$bundlePath/smapi-internal/metadata.json"
if ($folder -eq "linux" -or $folder -eq "macOS") {
- cp "$installAssets/unix-launcher.sh" "$bundlePath"
+ Copy-Item "$installAssets/unix-launcher.sh" "$bundlePath"
}
else {
- cp "$installAssets/windows-exe-config.xml" "$bundlePath/StardewModdingAPI.exe.config"
+ Copy-Item "$installAssets/windows-exe-config.xml" "$bundlePath/StardewModdingAPI.exe.config"
}
# copy bundled mods
@@ -202,38 +237,47 @@ foreach ($folder in $folders) {
$fromPath = "src/SMAPI.Mods.$modName/bin/$buildConfig/$runtime/publish"
$targetPath = "$bundlePath/Mods/$modName"
- mkdir "$targetPath" > $null
+ if ($IsWindows) {
+ # On Windows, mkdir creates parent directories automatically and the --parents argument isn't recognized.
+ mkdir "$targetPath" > $null
+ }
+ else
+ {
+ mkdir "$targetPath" --parents
+ }
- cp "$fromPath/$modName.dll" "$targetPath"
- cp "$fromPath/manifest.json" "$targetPath"
+ Copy-Item "$fromPath/$modName.dll" "$targetPath"
+ Copy-Item "$fromPath/manifest.json" "$targetPath"
if (Test-Path "$fromPath/i18n" -PathType Container) {
- cp -Recurse "$fromPath/i18n" "$targetPath"
+ Copy-Item -Recurse "$fromPath/i18n" "$targetPath"
}
}
}
-# DISABLED: will be handled by Linux script
# mark scripts executable
-#ForEach ($path in @("install on Linux.sh", "install on macOS.command", "bundle/unix-launcher.sh")) {
-# if (Test-Path "$packagePath/$path" -PathType Leaf) {
-# chmod 755 "$packagePath/$path"
-# }
-#}
+if ($IsWindows) {
+ Write-Warning "Can't set Unix file permissions on Windows. This may cause issues for Linux/macOS players."
+}
+else {
+ ForEach ($path in @("install on Linux.sh", "install on macOS.command", "bundle/unix-launcher.sh")) {
+ if (Test-Path "$packagePath/$path" -PathType Leaf) {
+ chmod 755 "$packagePath/$path"
+ }
+ }
+}
# split into main + for-dev folders
-cp -Recurse "$packagePath" "$packageDevPath"
+Copy-Item -Recurse "$packagePath" "$packageDevPath"
foreach ($folder in $folders) {
# disable developer mode in main package
In-Place-Regex -Path "$packagePath/internal/$folder/bundle/smapi-internal/config.json" -Search "`"DeveloperMode`": true" -Replace "`"DeveloperMode`": false"
# convert bundle folder into final 'install.dat' files
- if ($windowsOnly)
+ foreach ($path in @("$packagePath/internal/$folder", "$packageDevPath/internal/$folder"))
{
- foreach ($path in @("$packagePath/internal/$folder", "$packageDevPath/internal/$folder"))
- {
- Compress-Archive -Path "$path/bundle/*" -CompressionLevel Optimal -DestinationPath "$path/install.zip"
- mv "$path/install.zip" "$path/install.dat"
- rm -Recurse -Force "$path/bundle"
+ Compress-Archive -Path "$path/bundle/*" -CompressionLevel Optimal -DestinationPath "$path/install.dat"
+ if (!$skipBundleDeletion) {
+ Remove-Item -Recurse -Force "$path/bundle"
}
}
}
@@ -243,15 +287,12 @@ foreach ($folder in $folders) {
### Create release zips
###########
# rename folders
-mv "$packagePath" "bin/SMAPI $version installer"
-mv "$packageDevPath" "bin/SMAPI $version installer for developers"
+Move-Item "$packagePath" "bin/SMAPI $version installer"
+Move-Item "$packageDevPath" "bin/SMAPI $version installer for developers"
# package files
-if ($windowsOnly)
-{
- Compress-Archive -Path "bin/SMAPI $version installer" -DestinationPath "bin/SMAPI $version installer.zip" -CompressionLevel Optimal
- Compress-Archive -Path "bin/SMAPI $version installer for developers" -DestinationPath "bin/SMAPI $version installer for developers.zip" -CompressionLevel Optimal
-}
+Compress-Archive -Path "bin/SMAPI $version installer" -DestinationPath "bin/SMAPI $version installer.zip" -CompressionLevel Optimal
+Compress-Archive -Path "bin/SMAPI $version installer for developers" -DestinationPath "bin/SMAPI $version installer for developers.zip" -CompressionLevel Optimal
-echo ""
-echo "Done! See docs/technical/smapi.md to create the release zips."
+Write-Output ""
+Write-Output "Done! Package created in ${pwd.Path}/bin."
diff --git a/build/scripts/set-smapi-version.ps1 b/build/scripts/set-smapi-version.ps1
index 1e109975..a8960865 100644
--- a/build/scripts/set-smapi-version.ps1
+++ b/build/scripts/set-smapi-version.ps1
@@ -1,11 +1,3 @@
-#
-#
-# This is the PowerShell equivalent of ../unix/set-smapi-version.sh.
-# When making changes, both scripts should be updated.
-#
-#
-
-
. "$PSScriptRoot\lib\in-place-regex.ps1"
# get version number
@@ -15,7 +7,7 @@ if (!$version) {
}
# move to SMAPI root
-cd "$PSScriptRoot/../.."
+Set-Location "$PSScriptRoot/../.."
# apply changes
In-Place-Regex -Path "build/common.targets" -Search ".+" -Replace "$version"
diff --git a/build/unix/prepare-install-package.sh b/build/unix/prepare-install-package.sh
deleted file mode 100755
index 837f8884..00000000
--- a/build/unix/prepare-install-package.sh
+++ /dev/null
@@ -1,228 +0,0 @@
-#!/usr/bin/env bash
-
-#
-#
-# This is the Bash equivalent of ../windows/prepare-install-package.ps1.
-# When making changes, both scripts should be updated.
-#
-#
-
-
-##########
-## Find the game folder
-##########
-possibleGamePaths=(
- # override
- "$HOME/StardewValley"
-
- # Linux
- "$HOME/GOG Games/Stardew Valley/game"
- "$HOME/.steam/steam/steamapps/common/Stardew Valley"
- "$HOME/.local/share/Steam/steamapps/common/Stardew Valley"
- "$HOME/.var/app/com.valvesoftware.Steam/data/Steam/steamapps/common/Stardew Valley"
-
- # macOS
- "/Applications/Stardew Valley.app/Contents/MacOS"
- "$HOME/Library/Application Support/Steam/steamapps/common/Stardew Valley/Contents/MacOS"
-)
-gamePath=""
-for possibleGamePath in "${possibleGamePaths[@]}"; do
- if [[ -d "$possibleGamePath" ]]; then
- gamePath="$possibleGamePath"
- break
- fi
-done
-
-
-##########
-## Preset values
-##########
-# paths
-bundleModNames=("ConsoleCommands" "SaveBackup")
-
-# build configuration
-buildConfig="Release"
-folders=("linux" "macOS" "windows")
-declare -A runtimes=(["linux"]="linux-x64" ["macOS"]="osx-x64" ["windows"]="win-x64")
-declare -A msBuildPlatformNames=(["linux"]="Unix" ["macOS"]="OSX" ["windows"]="Windows_NT")
-
-# version number
-version="$1"
-if [ $# -eq 0 ]; then
- echo "SMAPI release version (like '4.0.0'):"
- read version
-fi
-
-
-##########
-## Move to SMAPI root
-##########
-cd "`dirname "$0"`/../.."
-
-
-##########
-## Clear old build files
-##########
-echo "Clearing old builds..."
-echo "-------------------------------------------------"
-for path in bin */**/bin */**/obj; do
- echo "$path"
- rm -rf $path
-done
-echo ""
-
-##########
-## Compile files
-##########
-. ${0%/*}/set-smapi-version.sh "$version"
-for folder in ${folders[@]}; do
- runtime=${runtimes[$folder]}
- msbuildPlatformName=${msBuildPlatformNames[$folder]}
-
- echo "Compiling SMAPI for $folder..."
- echo "-------------------------------------------------"
- dotnet publish src/SMAPI --configuration $buildConfig -v minimal --runtime "$runtime" -p:OS="$msbuildPlatformName" -p:GamePath="$gamePath" -p:CopyToGameFolder="false" --self-contained true
- echo ""
- echo ""
-
- echo "Compiling installer for $folder..."
- echo "-------------------------------------------------"
- dotnet publish src/SMAPI.Installer --configuration $buildConfig -v minimal --runtime "$runtime" -p:OS="$msbuildPlatformName" -p:GamePath="$gamePath" -p:CopyToGameFolder="false" --self-contained true
- echo ""
- echo ""
-
- for modName in ${bundleModNames[@]}; do
- echo "Compiling $modName for $folder..."
- echo "-------------------------------------------------"
- dotnet publish src/SMAPI.Mods.$modName --configuration $buildConfig -v minimal --runtime "$runtime" -p:OS="$msbuildPlatformName" -p:GamePath="$gamePath" -p:CopyToGameFolder="false" --self-contained false
- echo ""
- echo ""
- done
-done
-
-
-##########
-## Prepare install package
-##########
-echo "Preparing install package..."
-echo "-------------------------------------------------"
-
-# init paths
-installAssets="src/SMAPI.Installer/assets"
-packagePath="bin/SMAPI installer"
-packageDevPath="bin/SMAPI installer for developers"
-
-# init structure
-for folder in ${folders[@]}; do
- mkdir "$packagePath/internal/$folder/bundle/smapi-internal" --parents
-done
-
-# copy base installer files
-for name in "install on Linux.sh" "install on macOS.command" "install on Windows.bat" "README.txt"; do
- cp "$installAssets/$name" "$packagePath"
-done
-
-# copy per-platform files
-for folder in ${folders[@]}; do
- runtime=${runtimes[$folder]}
-
- # get paths
- smapiBin="src/SMAPI/bin/$buildConfig/$runtime/publish"
- internalPath="$packagePath/internal/$folder"
- bundlePath="$internalPath/bundle"
-
- # installer files
- cp -r "src/SMAPI.Installer/bin/$buildConfig/$runtime/publish"/* "$internalPath"
- rm -rf "$internalPath/assets"
-
- # runtime config for SMAPI
- # This is identical to the one generated by the build, except that the min runtime version is
- # set to 5.0.0 (instead of whatever version it was built with) and rollForward is set to latestMinor instead of
- # minor.
- cp "$installAssets/runtimeconfig.json" "$bundlePath/StardewModdingAPI.runtimeconfig.json"
-
- # installer DLL config
- if [ $folder == "windows" ]; then
- cp "$installAssets/windows-exe-config.xml" "$packagePath/internal/windows/install.exe.config"
- fi
-
- # bundle root files
- for name in "StardewModdingAPI" "StardewModdingAPI.dll" "StardewModdingAPI.xml" "steam_appid.txt"; do
- if [ $name == "StardewModdingAPI" ] && [ $folder == "windows" ]; then
- name="$name.exe"
- fi
-
- cp "$smapiBin/$name" "$bundlePath"
- done
-
- # bundle i18n
- cp -r "$smapiBin/i18n" "$bundlePath/smapi-internal"
-
- # bundle smapi-internal
- for name in "0Harmony.dll" "0Harmony.xml" "Markdig.dll" "Mono.Cecil.dll" "Mono.Cecil.Mdb.dll" "Mono.Cecil.Pdb.dll" "MonoMod.Common.dll" "Newtonsoft.Json.dll" "Pathoschild.Http.Client.dll" "Pintail.dll" "TMXTile.dll" "SMAPI.Toolkit.dll" "SMAPI.Toolkit.xml" "SMAPI.Toolkit.CoreInterfaces.dll" "SMAPI.Toolkit.CoreInterfaces.xml" "System.Net.Http.Formatting.dll"; do
- cp "$smapiBin/$name" "$bundlePath/smapi-internal"
- done
-
- cp "$smapiBin/SMAPI.blacklist.json" "$bundlePath/smapi-internal/blacklist.json"
- cp "$smapiBin/SMAPI.config.json" "$bundlePath/smapi-internal/config.json"
- cp "$smapiBin/SMAPI.metadata.json" "$bundlePath/smapi-internal/metadata.json"
- if [ $folder == "linux" ] || [ $folder == "macOS" ]; then
- cp "$installAssets/unix-launcher.sh" "$bundlePath"
- else
- cp "$installAssets/windows-exe-config.xml" "$bundlePath/StardewModdingAPI.exe.config"
- fi
-
- # copy bundled mods
- for modName in ${bundleModNames[@]}; do
- fromPath="src/SMAPI.Mods.$modName/bin/$buildConfig/$runtime/publish"
- targetPath="$bundlePath/Mods/$modName"
-
- mkdir "$targetPath" --parents
-
- cp "$fromPath/$modName.dll" "$targetPath"
- cp "$fromPath/manifest.json" "$targetPath"
- if [ -d "$fromPath/i18n" ]; then
- cp -r "$fromPath/i18n" "$targetPath"
- fi
- done
-done
-
-# mark scripts executable
-for path in "install on Linux.sh" "install on macOS.command" "bundle/unix-launcher.sh"; do
- if [ -f "$packagePath/$path" ]; then
- chmod 755 "$packagePath/$path"
- fi
-done
-
-# split into main + for-dev folders
-cp -r "$packagePath" "$packageDevPath"
-for folder in ${folders[@]}; do
- # disable developer mode in main package
- sed --in-place --expression="s/\"DeveloperMode\": true/\"DeveloperMode\": false/" "$packagePath/internal/$folder/bundle/smapi-internal/config.json"
-
- # convert bundle folder into final 'install.dat' files
- for path in "$packagePath/internal/$folder" "$packageDevPath/internal/$folder"; do
- pushd "$path/bundle" > /dev/null
- zip "install.dat" * --recurse-paths --quiet
- popd > /dev/null
- mv "$path/bundle/install.dat" "$path/install.dat"
- rm -rf "$path/bundle"
- done
-done
-
-
-##########
-## Create release zips
-##########
-# rename folders
-mv "$packagePath" "bin/SMAPI $version installer"
-mv "$packageDevPath" "bin/SMAPI $version installer for developers"
-
-# package files
-pushd bin > /dev/null
-zip -9 "SMAPI $version installer.zip" "SMAPI $version installer" --recurse-paths --quiet
-zip -9 "SMAPI $version installer for developers.zip" "SMAPI $version installer for developers" --recurse-paths --quiet
-popd > /dev/null
-
-echo ""
-echo "Done! Package created in $(pwd)/bin"
diff --git a/build/unix/set-smapi-version.sh b/build/unix/set-smapi-version.sh
deleted file mode 100755
index 3ab48eb5..00000000
--- a/build/unix/set-smapi-version.sh
+++ /dev/null
@@ -1,26 +0,0 @@
-#!/usr/bin/env bash
-
-#
-#
-# This is the Bash equivalent of ../windows/set-smapi-version.ps1.
-# When making changes, both scripts should be updated.
-#
-#
-
-
-# get version number
-version="$1"
-if [ $# -eq 0 ]; then
- echo "SMAPI release version (like '4.0.0'):"
- read version
-fi
-
-# move to SMAPI root
-cd "`dirname "$0"`/../.."
-
-# apply changes
-sed "s/.+<\/Version>/$version<\/Version>/" "build/common.targets" --in-place --regexp-extended
-sed "s/RawApiVersion = \".+?\";/RawApiVersion = \"$version\";/" "src/SMAPI/Constants.cs" --in-place --regexp-extended
-for modName in "ConsoleCommands" "SaveBackup"; do
- sed "s/\"(Version|MinimumApiVersion)\": \".+?\"/\"\1\": \"$version\"/g" "src/SMAPI.Mods.$modName/manifest.json" --in-place --regexp-extended
-done
diff --git a/docs/technical/smapi.md b/docs/technical/smapi.md
index 801a2679..837b9488 100644
--- a/docs/technical/smapi.md
+++ b/docs/technical/smapi.md
@@ -93,12 +93,13 @@ option._
#### First-time setup
1. On Windows only:
1. [Install Windows Subsystem for Linux (WSL)](https://docs.microsoft.com/en-us/windows/wsl/install).
- 2. Run `sudo apt update` in WSL to update the package list.
- 3. The rest of the instructions below should be run in WSL.
+ 2. Follow the rest of the instructions inside WSL.
2. Install the required software:
- 1. Install the [.NET 5 SDK](https://docs.microsoft.com/en-us/dotnet/core/install/linux-ubuntu).
- _For Ubuntu-based systems, you can run `lsb_release -a` to get the Ubuntu version number._
- 2. [Install Steam](https://linuxconfig.org/how-to-install-steam-on-ubuntu-20-04-focal-fossa-linux).
+ 1. Install...
+ - [.NET 6 SDK](https://docs.microsoft.com/en-us/dotnet/core/install/linux-ubuntu) (run
+ `lsb_release -a` if you need the Ubuntu version number);
+ - [PowerShell](https://learn.microsoft.com/en-us/powershell/scripting/install/install-powershell-on-linux);
+ - and [Steam](https://linuxconfig.org/how-to-install-steam-on-ubuntu-20-04-focal-fossa-linux).
3. Launch `steam` and install the game like usual.
4. Download and install your preferred IDE. For the [latest standalone Rider
version](https://www.jetbrains.com/help/rider/Installation_guide.html#prerequisites):
@@ -122,7 +123,7 @@ option._
2. Launch the game through the Steam UI.
### Prepare the release
-1. Run `build/unix/prepare-install-package.sh VERSION_HERE` to create the release package in the
+1. Run `pwsh build/scripts/prepare-install-package.sh VERSION_HERE` to create the release package in the
root `bin` folder.
Make sure you use a [semantic version](https://semver.org). Recommended format:
@@ -152,8 +153,8 @@ above for the unified process._
```
### Prepare the release
-1. Run `build/scripts/prepare-install-package.ps1 VERSION_HERE` in PowerShell to create the release
- package folders in the root `bin` folder.
+1. Run `pwsh build/scripts/prepare-install-package.ps1 VERSION_HERE --skip-bundle-deletion` to
+ create the release package folders in the root `bin` folder.
Make sure you use a [semantic version](https://semver.org). Recommended format:
@@ -169,7 +170,7 @@ above for the unified process._
# In WSL, `/mnt/c/example` accesses `C:\example` on the Windows filesystem.
version="4.0.0"
binFolder="/mnt/e/source/_Stardew/SMAPI/bin"
- build/scripts/finalize-install-package.sh "$version" "$binFolder"
+ pwsh build/scripts/finalize-install-package.sh "$version" "$binFolder"
```
Note: to prepare a test Windows-only build, you can pass `--windows-only` in the first step and
diff --git a/src/SMAPI.slnx b/src/SMAPI.slnx
index 256010c3..8a76672c 100644
--- a/src/SMAPI.slnx
+++ b/src/SMAPI.slnx
@@ -28,10 +28,6 @@
-
-
-
-