239 lines
8.3 KiB
PowerShell
239 lines
8.3 KiB
PowerShell
#
|
|
#
|
|
# 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.
|
|
#
|
|
#
|
|
|
|
. "$PSScriptRoot/lib/in-place-regex.ps1"
|
|
|
|
|
|
##########
|
|
## Fetch values
|
|
##########
|
|
# paths
|
|
$gamePath = "C:\Program Files (x86)\Steam\steamapps\common\Stardew Valley"
|
|
$bundleModNames = "ConsoleCommands", "ErrorHandler", "SaveBackup"
|
|
|
|
# build configuration
|
|
$buildConfig = "Release"
|
|
$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]
|
|
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/../.."
|
|
|
|
|
|
##########
|
|
## Clear old build files
|
|
##########
|
|
echo "Clearing old builds..."
|
|
echo "-------------------------------------------------"
|
|
|
|
foreach ($path in (dir -Recurse -Include ('bin', 'obj'))) {
|
|
echo "$path"
|
|
rm -Recurse -Force "$path"
|
|
}
|
|
echo ""
|
|
|
|
|
|
##########
|
|
## Compile files
|
|
##########
|
|
. "$PSScriptRoot/set-smapi-version.ps1" "$version"
|
|
foreach ($folder in $folders) {
|
|
$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" -p:PublishTrimmed=True -p:TrimMode=Link --self-contained true
|
|
echo ""
|
|
echo ""
|
|
|
|
foreach ($modName in $bundleModNames) {
|
|
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"
|
|
echo ""
|
|
echo ""
|
|
}
|
|
}
|
|
|
|
|
|
##########
|
|
## 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
|
|
foreach ($folder in $folders) {
|
|
mkdir "$packagePath/internal/$folder/bundle/smapi-internal" > $null
|
|
}
|
|
|
|
# copy base installer files
|
|
foreach ($name in @("install on Linux.sh", "install on macOS.command", "install on Windows.bat", "README.txt")) {
|
|
if ($windowsOnly -and ($name -eq "install on Linux.sh" -or $name -eq "install on macOS.command")) {
|
|
continue;
|
|
}
|
|
|
|
cp "$installAssets/$name" "$packagePath"
|
|
}
|
|
|
|
# copy per-platform files
|
|
foreach ($folder in $folders) {
|
|
$runtime = $runtimes[$folder]
|
|
|
|
# get paths
|
|
$smapiBin = "src/SMAPI/bin/$buildConfig/$runtime/publish"
|
|
$internalPath = "$packagePath/internal/$folder"
|
|
$bundlePath = "$internalPath/bundle"
|
|
|
|
# installer files
|
|
cp "src/SMAPI.Installer/bin/$buildConfig/$runtime/publish/*" "$internalPath" -Recurse
|
|
rm -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
|
|
# minor.
|
|
cp "$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"
|
|
}
|
|
|
|
# bundle root files
|
|
foreach ($name in @("StardewModdingAPI", "StardewModdingAPI.dll", "StardewModdingAPI.pdb", "StardewModdingAPI.xml", "steam_appid.txt")) {
|
|
if ($name -eq "StardewModdingAPI" -and $folder -eq "windows") {
|
|
$name = "$name.exe"
|
|
}
|
|
|
|
cp "$smapiBin/$name" "$bundlePath"
|
|
}
|
|
|
|
# bundle i18n
|
|
cp -Recurse "$smapiBin/i18n" "$bundlePath/smapi-internal"
|
|
|
|
# bundle smapi-internal
|
|
foreach ($name in @("0Harmony.dll", "0Harmony.xml", "Mono.Cecil.dll", "Mono.Cecil.Mdb.dll", "Mono.Cecil.Pdb.dll", "MonoMod.Common.dll", "Newtonsoft.Json.dll", "Pintail.dll", "TMXTile.dll", "SMAPI.Toolkit.dll", "SMAPI.Toolkit.pdb", "SMAPI.Toolkit.xml", "SMAPI.Toolkit.CoreInterfaces.dll", "SMAPI.Toolkit.CoreInterfaces.pdb", "SMAPI.Toolkit.CoreInterfaces.xml")) {
|
|
cp "$smapiBin/$name" "$bundlePath/smapi-internal"
|
|
}
|
|
|
|
cp "$smapiBin/SMAPI.config.json" "$bundlePath/smapi-internal/config.json"
|
|
cp "$smapiBin/SMAPI.metadata.json" "$bundlePath/smapi-internal/metadata.json"
|
|
if ($folder -eq "linux" -or $folder -eq "macOS") {
|
|
cp "$installAssets/unix-launcher.sh" "$bundlePath"
|
|
}
|
|
else {
|
|
cp "$installAssets/windows-exe-config.xml" "$bundlePath/StardewModdingAPI.exe.config"
|
|
}
|
|
|
|
# copy .NET dependencies
|
|
if ($folder -eq "windows") {
|
|
cp "$smapiBin/System.Management.dll" "$bundlePath/smapi-internal"
|
|
}
|
|
|
|
# copy legacy .NET dependencies (remove in SMAPI 4.0.0)
|
|
cp "$smapiBin/System.Configuration.ConfigurationManager.dll" "$bundlePath/smapi-internal"
|
|
cp "$smapiBin/System.Runtime.Caching.dll" "$bundlePath/smapi-internal"
|
|
cp "$smapiBin/System.Security.Permissions.dll" "$bundlePath/smapi-internal"
|
|
|
|
# copy bundled mods
|
|
foreach ($modName in $bundleModNames) {
|
|
$fromPath = "src/SMAPI.Mods.$modName/bin/$buildConfig/$runtime/publish"
|
|
$targetPath = "$bundlePath/Mods/$modName"
|
|
|
|
mkdir "$targetPath" > $null
|
|
|
|
cp "$fromPath/$modName.dll" "$targetPath"
|
|
cp "$fromPath/$modName.pdb" "$targetPath"
|
|
cp "$fromPath/manifest.json" "$targetPath"
|
|
if (Test-Path "$fromPath/i18n" -PathType Container) {
|
|
cp -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"
|
|
# }
|
|
#}
|
|
|
|
# split into main + for-dev folders
|
|
cp -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"))
|
|
{
|
|
Compress-Archive -Path "$path/bundle/*" -CompressionLevel Optimal -DestinationPath "$path/install.zip"
|
|
mv "$path/install.zip" "$path/install.dat"
|
|
rm -Recurse -Force "$path/bundle"
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
###########
|
|
### Create release zips
|
|
###########
|
|
# rename folders
|
|
mv "$packagePath" "bin/SMAPI $version installer"
|
|
mv "$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
|
|
}
|
|
|
|
echo ""
|
|
echo "Done! See docs/technical/smapi.md to create the release zips."
|