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 @@ - - - -