feat: allow dotnet to be specified (#21)

* feat: allow dotnet to be specified

* docs: update readme

* fix: optimize test workflow
This commit is contained in:
Joanna May 2023-03-14 19:04:27 -05:00 committed by GitHub
parent 1be00b61d4
commit 41ce0e3de8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 239 additions and 107 deletions

View File

@ -8,7 +8,7 @@ on: # rebuild any PRs and main branch changes
jobs:
tests:
name: 🧪 Test on ${{ matrix.os }}
name: 🧪 Test on ${{ matrix.os }}, .NET=${{ matrix.use-dotnet }}
runs-on: ${{ matrix.os }}
strategy:
# Don't cancel other OS runners if one fails.
@ -16,6 +16,7 @@ jobs:
matrix:
# Put the operating systems you want to run on here.
os: [ubuntu-latest, macos-latest, windows-latest]
use-dotnet: [false, true]
env:
DOTNET_CLI_TELEMETRY_OPTOUT: true
DOTNET_NOLOGO: true
@ -28,6 +29,7 @@ jobs:
name: 🧾 Checkout
- uses: actions/setup-dotnet@v3
if: ${{ matrix.use-dotnet }}
name: 💽 Setup .NET SDK
with:
dotnet-version: '6.0.x'
@ -38,8 +40,13 @@ jobs:
# Version must include major, minor, and patch, and be >= 4.0.0
# Pre-release label is optional.
version: 4.0.0
use-dotnet: ${{ matrix.use-dotnet }}
- name: 🔬 Verify Setup
- name: 🔬 Verify Dotnet
if: ${{ matrix.use-dotnet }}
run: |
dotnet --version
- name: 🔬 Verify Godot
run: |
godot --version

18
.vscode/launch.json vendored Normal file
View File

@ -0,0 +1,18 @@
{
"version": "0.2.0",
"configurations": [
{
"name": "Debug Jest Tests",
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/node_modules/jest/bin/jest.js",
"args": [
"--runInBand",
"--no-cache",
"--watch"
],
"console": "integratedTerminal",
"internalConsoleOptions": "neverOpen",
}
]
}

View File

@ -1,11 +1,12 @@
# Setup Godot
# 🤖 Setup Godot
[![Chickensoft Badge][chickensoft-badge]][chickensoft-website] [![Discord][discord-badge]][discord]
[![Chickensoft Badge][chickensoft-badge]][chickensoft-website] [![Discord][discord-badge]][discord] [![Read the docs][read-the-docs-badge]][docs]
Setup Godot for use with .NET on macOS, Windows, and Linux CI/CD runners.
Setup Godot for use with (or without) .NET on macOS, Windows, and Linux CI/CD runners.
- ✅ Godot 4.x
- ✅ C# supported using .NET version of Godot.
- ✅ Versions **without** .NET are also supported.
- ✅ Installs Godot directly on the CI/CD runner.
- ✅ Caches Godot installation for speedier workflows.
- ✅ Adds environment variables (`GODOT4`, `GODOT`) to the system path.
@ -59,6 +60,8 @@ jobs:
# Version must include major, minor, and patch, and be >= 4.0.0
# Pre-release label is optional.
version: 4.0.0-beta16 # also valid: 4.0.0.rc1 or 4.0.0, etc
# Use .NET-enabled version of Godot (the default is also true).
use-dotnet: true
- name: 🔬 Verify Setup
run: |
@ -74,10 +77,14 @@ jobs:
# Do whatever you want!
```
<!-- Links -->
## Inputs
<!-- Header -->
[chickensoft-badge]: https://chickensoft.games/images/chickensoft/chickensoft_badge.svg
See [action.yml][action] for information about the action's inputs.
[chickensoft-badge]: https://raw.githubusercontent.com/chickensoft-games/chickensoft_site/main/static/img/badges/chickensoft_badge.svg
[chickensoft-website]: https://chickensoft.games
[discord-badge]: https://raw.githubusercontent.com/chickensoft-games/chickensoft_site/main/static/img/badges/discord_badge.svg
[discord]: https://discord.gg/gSjaPgMmYW
[discord-badge]: https://img.shields.io/badge/Chickensoft%20Discord-%237289DA.svg?style=flat&logo=discord&logoColor=white
[read-the-docs-badge]: https://raw.githubusercontent.com/chickensoft-games/chickensoft_site/main/static/img/badges/read_the_docs_badge.svg
[docs]: https://chickensoft.games/docs
[action]: ./action.yml

View File

@ -28,48 +28,77 @@ describe('parseVersion', () => {
})
describe('getGodotUrl', () => {
describe('useDotnet = true', () => {
test('4.0.0-beta1', () => {
expect(getGodotUrl('4.0.0-beta1', getPlatform('linux'))).toEqual(
expect(getGodotUrl('4.0.0-beta1', getPlatform('linux'), true)).toEqual(
'https://downloads.tuxfamily.org/godotengine/4.0/beta1/mono/Godot_v4.0-beta1_mono_linux_x86_64.zip'
)
expect(getGodotUrl('4.0.0-beta1', getPlatform('win32'))).toEqual(
expect(getGodotUrl('4.0.0-beta1', getPlatform('win32'), true)).toEqual(
'https://downloads.tuxfamily.org/godotengine/4.0/beta1/mono/Godot_v4.0-beta1_mono_win64.zip'
)
expect(getGodotUrl('4.0.0-beta1', getPlatform('darwin'))).toEqual(
expect(getGodotUrl('4.0.0-beta1', getPlatform('darwin'), true)).toEqual(
'https://downloads.tuxfamily.org/godotengine/4.0/beta1/mono/Godot_v4.0-beta1_mono_macos.universal.zip'
)
})
test('4.0.0-beta.16', () => {
expect(getGodotUrl('4.0.0-beta.16', getPlatform('linux'))).toEqual(
expect(getGodotUrl('4.0.0-beta.16', getPlatform('linux'), true)).toEqual(
'https://downloads.tuxfamily.org/godotengine/4.0/beta16/mono/Godot_v4.0-beta16_mono_linux_x86_64.zip'
)
expect(getGodotUrl('4.0.0-beta.16', getPlatform('win32'))).toEqual(
expect(getGodotUrl('4.0.0-beta.16', getPlatform('win32'), true)).toEqual(
'https://downloads.tuxfamily.org/godotengine/4.0/beta16/mono/Godot_v4.0-beta16_mono_win64.zip'
)
expect(getGodotUrl('4.0.0-beta.16', getPlatform('darwin'))).toEqual(
expect(getGodotUrl('4.0.0-beta.16', getPlatform('darwin'), true)).toEqual(
'https://downloads.tuxfamily.org/godotengine/4.0/beta16/mono/Godot_v4.0-beta16_mono_macos.universal.zip'
)
})
test('4.0.0-beta8', () => {
expect(getGodotUrl('4.0.0-beta8', getPlatform('linux'))).toEqual(
expect(getGodotUrl('4.0.0-beta8', getPlatform('linux'), true)).toEqual(
'https://downloads.tuxfamily.org/godotengine/4.0/beta8/mono/Godot_v4.0-beta8_mono_linux_x86_64.zip'
)
expect(getGodotUrl('4.0.0-beta8', getPlatform('win32'))).toEqual(
expect(getGodotUrl('4.0.0-beta8', getPlatform('win32'), true)).toEqual(
'https://downloads.tuxfamily.org/godotengine/4.0/beta8/mono/Godot_v4.0-beta8_mono_win64.zip'
)
expect(getGodotUrl('4.0.0-beta8', getPlatform('darwin'))).toEqual(
expect(getGodotUrl('4.0.0-beta8', getPlatform('darwin'), true)).toEqual(
'https://downloads.tuxfamily.org/godotengine/4.0/beta8/mono/Godot_v4.0-beta8_mono_macos.universal.zip'
)
})
test('4.0.0', () => {
expect(getGodotUrl('4.0.0', getPlatform('linux'))).toEqual(
expect(getGodotUrl('4.0.0', getPlatform('linux'), true)).toEqual(
'https://downloads.tuxfamily.org/godotengine/4.0/mono/Godot_v4.0-stable_mono_linux_x86_64.zip'
)
expect(getGodotUrl('4.0.0', getPlatform('win32'))).toEqual(
expect(getGodotUrl('4.0.0', getPlatform('win32'), true)).toEqual(
'https://downloads.tuxfamily.org/godotengine/4.0/mono/Godot_v4.0-stable_mono_win64.zip'
)
expect(getGodotUrl('4.0.0', getPlatform('darwin'))).toEqual(
expect(getGodotUrl('4.0.0', getPlatform('darwin'), true)).toEqual(
'https://downloads.tuxfamily.org/godotengine/4.0/mono/Godot_v4.0-stable_mono_macos.universal.zip'
)
})
})
describe('useDotnet = false', () => {
test('4.0.0-beta1', () => {
expect(getGodotUrl('4.0.0-beta1', getPlatform('linux'), false)).toEqual(
'https://downloads.tuxfamily.org/godotengine/4.0/beta1/Godot_v4.0-beta1_linux.x86_64.zip'
)
expect(getGodotUrl('4.0.0-beta1', getPlatform('win32'), false)).toEqual(
'https://downloads.tuxfamily.org/godotengine/4.0/beta1/Godot_v4.0-beta1_win64.exe.zip'
)
expect(getGodotUrl('4.0.0-beta1', getPlatform('darwin'), false)).toEqual(
'https://downloads.tuxfamily.org/godotengine/4.0/beta1/Godot_v4.0-beta1_macos.universal.zip'
)
})
test('4.0.0-beta.16', () => {
expect(getGodotUrl('4.0.0-beta.16', getPlatform('linux'), false)).toEqual(
'https://downloads.tuxfamily.org/godotengine/4.0/beta16/Godot_v4.0-beta16_linux.x86_64.zip'
)
expect(getGodotUrl('4.0.0-beta.16', getPlatform('win32'), false)).toEqual(
'https://downloads.tuxfamily.org/godotengine/4.0/beta16/Godot_v4.0-beta16_win64.exe.zip'
)
expect(
getGodotUrl('4.0.0-beta.16', getPlatform('darwin'), false)
).toEqual(
'https://downloads.tuxfamily.org/godotengine/4.0/beta16/Godot_v4.0-beta16_macos.universal.zip'
)
})
})
})

View File

@ -33,6 +33,10 @@ inputs:
Whether to use the release or debug version of GodotSharp.dll. The
appropriate version will be symlinked in bin-path.
default: 'false'
use-dotnet:
description: >-
True to use the .NET-enabled version of Godot that enables C#, false to use the default version.
default: 'true'
runs:
using: 'node16'
main: 'dist/index.js'

View File

@ -1,6 +1,7 @@
{
"words": [
"Chickensoft",
"godotsharp",
"NOLOGO",
"norelease",
"OPTOUT",

61
dist/index.js generated vendored
View File

@ -58,21 +58,23 @@ function run(platform = undefined) {
.getInput('downloads-path')
.replace(/\s/g, '');
const version = core.getInput('version').replace(/\s/g, '');
const useDotnet = core.getBooleanInput('use-dotnet');
const binRelativePath = core.getInput('bin-path').replace(/\s/g, '');
const godotSharpRelease = core.getBooleanInput('godot-sharp-release');
// Compute derived information
const userDir = os.homedir();
const downloadsDir = path_1.default.join(userDir, downloadsRelativePath);
const installationDir = path_1.default.join(userDir, pathRelative);
const versionName = (0, utils_1.getGodotFilenameFromVersionString)(version, platform);
const godotUrl = (0, utils_1.getGodotUrl)(version, platform);
const versionName = (0, utils_1.getGodotFilenameFromVersionString)(version, platform, useDotnet);
const godotUrl = (0, utils_1.getGodotUrl)(version, platform, useDotnet);
const godotDownloadPath = path_1.default.join(downloadsDir, `${versionName}.zip`);
const godotInstallationPath = platform.getUnzippedPath(installationDir, versionName);
const godotInstallationPath = platform.getUnzippedPath(installationDir, versionName, useDotnet);
const binDir = path_1.default.join(userDir, binRelativePath);
// Log values
core.startGroup('🤖 Godot Action Inputs');
core.info(`🤖 Godot version: ${version}`);
core.info(`🤖 Godot version name: ${versionName}`);
core.info(`🟣 Use .NET: ${useDotnet}`);
core.info(`🤖 Godot download url: ${godotUrl}`);
core.info(`🧑‍💼 User directory: ${userDir}`);
core.info(`🌏 Downloads directory: ${downloadsDir}`);
@ -141,12 +143,14 @@ function run(platform = undefined) {
if (!godotExecutable) {
throw new Error('🚨 No Godot executable found!');
}
if (!godotSharp) {
if (!godotSharp && useDotnet) {
throw new Error('🚨 No GodotSharp.dll found!');
}
core.startGroup(`🚀 Resolve Godot Executables:`);
core.info(`🚀 Godot executable found at ${godotExecutable}`);
if (useDotnet) {
core.info(`🚀 GodotSharp.dll found at ${godotSharp}`);
}
core.endGroup();
// Add bin directory to PATH
core.startGroup(`🔦 Update PATH...`);
@ -156,15 +160,16 @@ function run(platform = undefined) {
core.endGroup();
// Create symlink to Godot executable
const godotAlias = path_1.default.join(binDir, 'godot');
const godotSharpDirAlias = path_1.default.join(binDir, 'GodotSharp');
core.startGroup(`🔗 Creating symlinks to executables...`);
fs.linkSync(godotExecutable, godotAlias);
core.info(`✅ Symlink to Godot created`);
const godotSharpDirAlias = path_1.default.join(binDir, 'GodotSharp');
if (useDotnet) {
// Create symlink to GodotSharp directory
const godotSharpDir = path_1.default.join(path_1.default.dirname(godotSharp), '../..');
// fs.mkdirSync(godotSharpDirAlias, {recursive: true})
fs.symlinkSync(godotSharpDir, godotSharpDirAlias);
core.info(`✅ Symlink to GodotSharp created at ${godotSharpDirAlias}`);
}
core.endGroup();
// Add environment variables
core.startGroup(`🔧 Adding environment variables...`);
@ -233,38 +238,44 @@ const core = __importStar(__nccwpck_require__(2186));
const fs = __importStar(__nccwpck_require__(7147));
const path_1 = __importDefault(__nccwpck_require__(1017));
class Linux {
constructor() {
this.godotFilenameSuffix = '_mono_linux_x86_64';
godotFilenameSuffix(useDotnet) {
if (useDotnet) {
return '_mono_linux_x86_64';
}
return '_linux.x86_64';
}
isGodotExecutable(basename) {
return basename.toLowerCase().endsWith('x86_64');
}
getUnzippedPath(installationDir, versionName) {
getUnzippedPath(installationDir, versionName, useDotnet) {
return path_1.default.join(installationDir, versionName);
}
}
exports.Linux = Linux;
class Windows {
constructor() {
this.godotFilenameSuffix = '_mono_win64';
godotFilenameSuffix(useDotnet) {
if (useDotnet) {
return '_mono_win64';
}
return '_win64.exe';
}
isGodotExecutable(basename) {
return basename.toLowerCase().endsWith('_win64.exe');
}
getUnzippedPath(installationDir, versionName) {
getUnzippedPath(installationDir, versionName, useDotnet) {
return path_1.default.join(installationDir, versionName);
}
}
exports.Windows = Windows;
class MacOS {
constructor() {
this.godotFilenameSuffix = '_mono_macos.universal';
godotFilenameSuffix(useDotnet) {
return `${useDotnet ? '_mono' : ''}_macos.universal`;
}
isGodotExecutable(basename) {
return basename.toLowerCase() === 'godot';
}
getUnzippedPath(installationDir, versionName) {
return path_1.default.join(installationDir, 'Godot_mono.app');
getUnzippedPath(installationDir, versionName, useDotnet) {
return path_1.default.join(installationDir, `Godot${useDotnet ? '_mono' : ''}.app`);
}
}
exports.MacOS = MacOS;
@ -293,15 +304,16 @@ exports.parseVersion = parseVersion;
* Returns the Godot download url for the given version and platform.
* @param versionString Version string.
* @param platform Current platform instance.
* @param useDotnet True to use the .NET-enabled version of Godot.
* @returns Godot binary download url.
*/
function getGodotUrl(versionString, platform) {
function getGodotUrl(versionString, platform, useDotnet) {
const version = parseVersion(versionString);
const major = version.major;
const minor = version.minor;
const patch = version.patch;
const label = version.label.replace('.', '');
const filename = getGodotFilename(version, platform);
const filename = getGodotFilename(version, platform, useDotnet);
let url = `${GODOT_URL_PREFIX + major}.${minor}`;
if (patch !== '' && patch !== '0') {
url += `.${patch}`;
@ -310,11 +322,16 @@ function getGodotUrl(versionString, platform) {
if (label !== '') {
url += `${label}/`;
}
if (useDotnet) {
url += `mono/${filename}.zip`;
}
else {
url += `${filename}.zip`;
}
return url;
}
exports.getGodotUrl = getGodotUrl;
function getGodotFilename(version, platform) {
function getGodotFilename(version, platform, useDotnet) {
const major = version.major;
const minor = version.minor;
const patch = version.patch;
@ -332,11 +349,11 @@ function getGodotFilename(version, platform) {
else {
filename += '-stable';
}
return filename + platform.godotFilenameSuffix;
return filename + platform.godotFilenameSuffix(useDotnet);
}
exports.getGodotFilename = getGodotFilename;
function getGodotFilenameFromVersionString(versionString, platform) {
return getGodotFilename(parseVersion(versionString), platform);
function getGodotFilenameFromVersionString(versionString, platform, useDotnet) {
return getGodotFilename(parseVersion(versionString), platform, useDotnet);
}
exports.getGodotFilenameFromVersionString = getGodotFilenameFromVersionString;
function getPlatform(processPlatform) {

2
dist/index.js.map generated vendored

File diff suppressed because one or more lines are too long

View File

@ -22,6 +22,7 @@ async function run(platform: Platform | undefined = undefined): Promise<void> {
.getInput('downloads-path')
.replace(/\s/g, '')
const version = core.getInput('version').replace(/\s/g, '')
const useDotnet = core.getBooleanInput('use-dotnet')
const binRelativePath = core.getInput('bin-path').replace(/\s/g, '')
const godotSharpRelease = core.getBooleanInput('godot-sharp-release')
@ -29,12 +30,17 @@ async function run(platform: Platform | undefined = undefined): Promise<void> {
const userDir = os.homedir()
const downloadsDir = path.join(userDir, downloadsRelativePath)
const installationDir = path.join(userDir, pathRelative)
const versionName = getGodotFilenameFromVersionString(version, platform)
const godotUrl = getGodotUrl(version, platform)
const versionName = getGodotFilenameFromVersionString(
version,
platform,
useDotnet
)
const godotUrl = getGodotUrl(version, platform, useDotnet)
const godotDownloadPath = path.join(downloadsDir, `${versionName}.zip`)
const godotInstallationPath = platform.getUnzippedPath(
installationDir,
versionName
versionName,
useDotnet
)
const binDir = path.join(userDir, binRelativePath)
@ -42,6 +48,7 @@ async function run(platform: Platform | undefined = undefined): Promise<void> {
core.startGroup('🤖 Godot Action Inputs')
core.info(`🤖 Godot version: ${version}`)
core.info(`🤖 Godot version name: ${versionName}`)
core.info(`🟣 Use .NET: ${useDotnet}`)
core.info(`🤖 Godot download url: ${godotUrl}`)
core.info(`🧑‍💼 User directory: ${userDir}`)
core.info(`🌏 Downloads directory: ${downloadsDir}`)
@ -139,13 +146,15 @@ async function run(platform: Platform | undefined = undefined): Promise<void> {
throw new Error('🚨 No Godot executable found!')
}
if (!godotSharp) {
if (!godotSharp && useDotnet) {
throw new Error('🚨 No GodotSharp.dll found!')
}
core.startGroup(`🚀 Resolve Godot Executables:`)
core.info(`🚀 Godot executable found at ${godotExecutable}`)
if (useDotnet) {
core.info(`🚀 GodotSharp.dll found at ${godotSharp}`)
}
core.endGroup()
// Add bin directory to PATH
@ -157,15 +166,16 @@ async function run(platform: Platform | undefined = undefined): Promise<void> {
// Create symlink to Godot executable
const godotAlias = path.join(binDir, 'godot')
const godotSharpDirAlias = path.join(binDir, 'GodotSharp')
core.startGroup(`🔗 Creating symlinks to executables...`)
fs.linkSync(godotExecutable, godotAlias)
core.info(`✅ Symlink to Godot created`)
const godotSharpDirAlias = path.join(binDir, 'GodotSharp')
if (useDotnet) {
// Create symlink to GodotSharp directory
const godotSharpDir = path.join(path.dirname(godotSharp), '../..')
// fs.mkdirSync(godotSharpDirAlias, {recursive: true})
fs.symlinkSync(godotSharpDir, godotSharpDirAlias)
core.info(`✅ Symlink to GodotSharp created at ${godotSharpDirAlias}`)
}
core.endGroup()
// Add environment variables

View File

@ -4,7 +4,7 @@ import path from 'path'
export interface Platform {
/** Godot installation filename suffix. */
godotFilenameSuffix: string
godotFilenameSuffix(useDotnet: boolean): string
/**
* Returns true if the given path is most likely the Godot executable for
* the platform.
@ -16,36 +16,64 @@ export interface Platform {
* @param installationDir Installation directory.
* @param versionName Version name.
*/
getUnzippedPath(installationDir: string, versionName: string): string
getUnzippedPath(
installationDir: string,
versionName: string,
useDotnet: boolean
): string
}
export class Linux implements Platform {
godotFilenameSuffix = '_mono_linux_x86_64'
godotFilenameSuffix(useDotnet: boolean): string {
if (useDotnet) {
return '_mono_linux_x86_64'
}
return '_linux.x86_64'
}
isGodotExecutable(basename: string): boolean {
return basename.toLowerCase().endsWith('x86_64')
}
getUnzippedPath(installationDir: string, versionName: string): string {
getUnzippedPath(
installationDir: string,
versionName: string,
useDotnet: boolean
): string {
return path.join(installationDir, versionName)
}
}
export class Windows implements Platform {
godotFilenameSuffix = '_mono_win64'
godotFilenameSuffix(useDotnet: boolean): string {
if (useDotnet) {
return '_mono_win64'
}
return '_win64.exe'
}
isGodotExecutable(basename: string): boolean {
return basename.toLowerCase().endsWith('_win64.exe')
}
getUnzippedPath(installationDir: string, versionName: string): string {
getUnzippedPath(
installationDir: string,
versionName: string,
useDotnet: boolean
): string {
return path.join(installationDir, versionName)
}
}
export class MacOS implements Platform {
godotFilenameSuffix = '_mono_macos.universal'
godotFilenameSuffix(useDotnet: boolean): string {
return `${useDotnet ? '_mono' : ''}_macos.universal`
}
isGodotExecutable(basename: string): boolean {
return basename.toLowerCase() === 'godot'
}
getUnzippedPath(installationDir: string, versionName: string): string {
return path.join(installationDir, 'Godot_mono.app')
getUnzippedPath(
installationDir: string,
versionName: string,
useDotnet: boolean
): string {
return path.join(installationDir, `Godot${useDotnet ? '_mono' : ''}.app`)
}
}
@ -90,16 +118,21 @@ export function parseVersion(version: string): SemanticVersion {
* Returns the Godot download url for the given version and platform.
* @param versionString Version string.
* @param platform Current platform instance.
* @param useDotnet True to use the .NET-enabled version of Godot.
* @returns Godot binary download url.
*/
export function getGodotUrl(versionString: string, platform: Platform): string {
export function getGodotUrl(
versionString: string,
platform: Platform,
useDotnet: boolean
): string {
const version = parseVersion(versionString)
const major = version.major
const minor = version.minor
const patch = version.patch
const label = version.label.replace('.', '')
const filename = getGodotFilename(version, platform)
const filename = getGodotFilename(version, platform, useDotnet)
let url = `${GODOT_URL_PREFIX + major}.${minor}`
if (patch !== '' && patch !== '0') {
@ -109,14 +142,19 @@ export function getGodotUrl(versionString: string, platform: Platform): string {
if (label !== '') {
url += `${label}/`
}
if (useDotnet) {
url += `mono/${filename}.zip`
} else {
url += `${filename}.zip`
}
return url
}
export function getGodotFilename(
version: SemanticVersion,
platform: Platform
platform: Platform,
useDotnet: boolean
): string {
const major = version.major
const minor = version.minor
@ -137,14 +175,15 @@ export function getGodotFilename(
filename += '-stable'
}
return filename + platform.godotFilenameSuffix
return filename + platform.godotFilenameSuffix(useDotnet)
}
export function getGodotFilenameFromVersionString(
versionString: string,
platform: Platform
platform: Platform,
useDotnet: boolean
): string {
return getGodotFilename(parseVersion(versionString), platform)
return getGodotFilename(parseVersion(versionString), platform, useDotnet)
}
export function getPlatform(processPlatform: NodeJS.Platform): Platform {