From d26a68ecd91d47d42e19aaa299deefc3fafced67 Mon Sep 17 00:00:00 2001 From: Dominique Louis Date: Mon, 4 Nov 2024 11:55:12 +0000 Subject: [PATCH 1/3] Changes required to get F7 flashing without errors and debugging working. --- .../SerialConnection.ListenerProc.cs | 327 +++++++++--------- .../Connections/SerialConnection.cs | 32 +- 2 files changed, 185 insertions(+), 174 deletions(-) mode change 100755 => 100644 Source/v2/Meadow.HCom/Connections/SerialConnection.cs diff --git a/Source/v2/Meadow.HCom/Connections/SerialConnection.ListenerProc.cs b/Source/v2/Meadow.HCom/Connections/SerialConnection.ListenerProc.cs index e7433e33..e4aa7fca 100644 --- a/Source/v2/Meadow.HCom/Connections/SerialConnection.ListenerProc.cs +++ b/Source/v2/Meadow.HCom/Connections/SerialConnection.ListenerProc.cs @@ -26,7 +26,7 @@ public override async Task WaitForMeadowAttach(CancellationToken? cancellationTo return; } - await Task.Delay(20); + await Task.Delay(timeout); if (!_port.IsOpen) { @@ -108,6 +108,11 @@ async Task ReOpen() // local function await ReOpen(); goto read; } + catch (Exception ex) + { + Debug.WriteLine($"Error reading from port: {ex.Message}"); + await Task.Delay(1000); + } Debug.WriteLine($"Received {receivedLength} bytes"); @@ -163,162 +168,7 @@ async Task ReOpen() // local function _messageCount++; } - if (response is TextInformationResponse tir) - { - // send the message to any listeners - Debug.WriteLine($"INFO> {tir.Text}"); - - InfoMessages.Add(tir.Text); - base.RaiseDeviceMessageReceived(tir.Text, "info"); - } - else if (response is TextStdOutResponse tso) - { - // send the message to any listeners - Debug.WriteLine($"STDOUT> {tso.Text}"); - - StdOut.Add(tso.Text); - base.RaiseDeviceMessageReceived(tso.Text, "stdout"); - } - else if (response is TextStdErrResponse tse) - { - // send the message to any listeners - Debug.WriteLine($"STDERR> {tse.Text}"); - - StdErr.Add(tse.Text); - base.RaiseDeviceMessageReceived(tse.Text, "stderr"); - } - else if (response is TextListHeaderResponse tlh) - { - // start of a list - _textListComplete = false; - _textList.Clear(); - } - else if (response is TextListMemberResponse tlm) - { - _textList.Add(tlm.Text); - } - else if (response is TextCrcMemberResponse tcm) - { - _textList.Add(tcm.Text); - } - else if (response is TextConcludedResponse tcr) - { - _lastRequestConcluded = (RequestType)tcr.RequestType; - - if (_reconnectInProgress) - { - Open(); - _reconnectInProgress = false; - } - else if (_textListComplete != null) - { - _textListComplete = true; - } - } - else if (response is TextRequestResponse trr) - { - // this is a response to a text request - the exact request is cached - //Debug.WriteLine($"RESPONSE> {trr.Text}"); - } - else if (response is DeviceInfoSerialResponse dir) - { - _deviceInfo = new DeviceInfo(dir.Fields); - } - else if (response is ReconnectRequiredResponse rrr) - { - // the device is going to restart - we need to wait for a HCOM_HOST_REQUEST_TEXT_CONCLUDED to know it's back - Close(); - - await Task.Delay(3000); - - Open(); - } - else if (response is FileReadInitOkResponse fri) - { - // Once HCOM_MDOW_REQUEST_UPLOAD_FILE_INIT is sent the F7 will respond - // with either HCOM_HOST_REQUEST_INIT_UPLOAD_OKAY or - // HCOM_HOST_REQUEST_INIT_UPLOAD_FAIL. - // - // If we get HCOM_HOST_REQUEST_INIT_UPLOAD_OKAY we must open a file on - // this machine and respond with HCOM_MDOW_REQUEST_UPLOAD_READY_SEND_DATA. - // - // The F7 will begin to send HCOM_HOST_REQUEST_UPLOADING_FILE_DATA which - // contains the file data, which we must write to the open file. - // - // When the F7 has finished sending the data it will send a - // HCOM_HOST_REQUEST_UPLOAD_FILE_COMPLETED message. When it is received - // we then close the open file and the process is completed. - var folder = Path.GetDirectoryName(_readFileInfo!.LocalFileName); - if (!Directory.Exists(folder)) throw new DirectoryNotFoundException(folder); - - _readFileInfo.FileStream = File.Create(_readFileInfo.LocalFileName); - - var uploadRequest = RequestBuilder.Build(); - EncodeAndSendPacket(uploadRequest.Serialize()); - } - else if (response is UploadDataPacketResponse udp) - { - if (_readFileInfo == null) - { - throw new Exception("Data received for unknown file"); - } - - _readFileInfo.FileStream.Write(udp.FileData, 0, udp.FileData.Length); - - RaiseFileBytesReceived(udp.FileData.Length); - } - else if (response is UploadCompletedResponse ucr) - { - if (_readFileInfo == null) - { - throw new Exception("File Complete received for unknown file"); - } - - var fn = _readFileInfo.LocalFileName; - - _readFileInfo.FileStream.Flush(); - _readFileInfo.FileStream.Dispose(); - _readFileInfo = null; - - RaiseFileReadCompleted(fn ?? string.Empty); - } - else if (response is FileReadInitFailedResponse frf) - { - _readFileInfo = null; - throw new Exception(_lastError ?? "unknown error"); - } - else if (response is RequestErrorTextResponse ret) - { - Debug.WriteLine(ret.Text); - RaiseDeviceMessageReceived(ret.Text, "hcom"); - _lastError = ret.Text; - } - else if (response is FileWriteInitFailedSerialResponse fwf) - { - _readFileInfo = null; - FileException?.Invoke(this, new Exception(_lastError ?? "unknown error")); - } - else if (response is FileWriteInitOkSerialResponse) - { - FileWriteAccepted?.Invoke(this, EventArgs.Empty); - } - else if (response is TextPayloadSerialResponse fib) - { - FileTextReceived?.Invoke(this, fib.Text); - } - else if (response is FileDownloadFailedResponse fdf) - { - RaiseFileWriteFailed(); - } - else if (response is DebuggingDataResponse ddr) - { - RaiseDebuggerMessage(ddr.Data); - } - else - { - Debug.WriteLine($"{response?.GetType().Name} for: {response?.RequestType}"); - // try to match responses with the requests - } + await ParseResponse(response); } } } @@ -366,5 +216,168 @@ async Task ReOpen() // local function } } } + + private async Task ParseResponse(SerialResponse? response) + { + // If possible, consider keeping thes responses in alphabetical order, + // so it's easier to find them. + + switch (response) + { + case DebuggingDataResponse ddr: + RaiseDebuggerMessage(ddr.Data); + break; + + case DeviceInfoSerialResponse dir: + _deviceInfo = new DeviceInfo(dir.Fields); + break; + + case FileDownloadFailedResponse fdf: + RaiseFileWriteFailed(); + break; + + case FileReadInitFailedResponse frf: + _readFileInfo = null; + throw new Exception(_lastError ?? "unknown error"); + + case FileWriteInitFailedSerialResponse fwf: + _readFileInfo = null; + FileException?.Invoke(this, new Exception(_lastError ?? "unknown error")); + break; + + case FileReadInitOkResponse fri: + // Once HCOM_MDOW_REQUEST_UPLOAD_FILE_INIT is sent the F7 will respond + // with either HCOM_HOST_REQUEST_INIT_UPLOAD_OKAY or + // HCOM_HOST_REQUEST_INIT_UPLOAD_FAIL. + // + // If we get HCOM_HOST_REQUEST_INIT_UPLOAD_OKAY we must open a file on + // this machine and respond with HCOM_MDOW_REQUEST_UPLOAD_READY_SEND_DATA. + // + // The F7 will begin to send HCOM_HOST_REQUEST_UPLOADING_FILE_DATA which + // contains the file data, which we must write to the open file. + // + // When the F7 has finished sending the data it will send a + // HCOM_HOST_REQUEST_UPLOAD_FILE_COMPLETED message. When it is received + // we then close the open file and the process is completed. + var folder = Path.GetDirectoryName(_readFileInfo!.LocalFileName); + if (!Directory.Exists(folder)) throw new DirectoryNotFoundException(folder); + + _readFileInfo.FileStream = File.Create(_readFileInfo.LocalFileName); + + var uploadRequest = RequestBuilder.Build(); + EncodeAndSendPacket(uploadRequest.Serialize()); + break; + + case FileWriteInitOkSerialResponse fws: + FileWriteAccepted?.Invoke(this, EventArgs.Empty); + break; + + case ReconnectRequiredResponse rrr: + // the device is going to restart - we need to wait for a HCOM_HOST_REQUEST_TEXT_CONCLUDED to know it's back + Close(); + + await Task.Delay(3000); + + Open(); + break; + + case RequestErrorTextResponse ret: + Debug.WriteLine(ret.Text); + RaiseDeviceMessageReceived(ret.Text, "hcom"); + _lastError = ret.Text; + break; + + case TextCrcMemberResponse tcm: + _textList.Add(tcm.Text); + break; + + case TextConcludedResponse tcr: + _lastRequestConcluded = (RequestType)tcr.RequestType; + + if (_reconnectInProgress) + { + Open(); + _reconnectInProgress = false; + } + else if (_textListComplete != null) + { + _textListComplete = true; + } + break; + + case TextInformationResponse tir: + // send the message to any listeners + Debug.WriteLine($"INFO> {tir.Text}"); + + InfoMessages.Add(tir.Text); + base.RaiseDeviceMessageReceived(tir.Text, "info"); + break; + + case TextListHeaderResponse tlh: + // start of a list + _textListComplete = false; + _textList.Clear(); + break; + + case TextListMemberResponse tlm: + _textList.Add(tlm.Text); + break; + + case TextPayloadSerialResponse tps: + FileTextReceived?.Invoke(this, tps.Text); + break; + + case TextRequestResponse trr: + // this is a response to a text request - the exact request is cached + //Debug.WriteLine($"RESPONSE> {trr.Text}"); + break; + + case TextStdErrResponse tse: + // send the message to any listeners + Debug.WriteLine($"STDERR> {tse.Text}"); + + StdErr.Add(tse.Text); + base.RaiseDeviceMessageReceived(tse.Text, "stderr"); + break; + + case TextStdOutResponse tso: + Debug.WriteLine($"STDOUT> {tso.Text}"); + + StdOut.Add(tso.Text); + base.RaiseDeviceMessageReceived(tso.Text, "stdout"); + break; + + case UploadCompletedResponse ucr: + if (_readFileInfo == null) + { + throw new Exception("File Complete received for unknown file"); + } + + var fn = _readFileInfo.LocalFileName; + + _readFileInfo.FileStream.Flush(); + _readFileInfo.FileStream.Dispose(); + _readFileInfo = null; + + RaiseFileReadCompleted(fn ?? string.Empty); + break; + + case UploadDataPacketResponse udp: + if (_readFileInfo == null) + { + throw new Exception("Data received for unknown file"); + } + + _readFileInfo.FileStream.Write(udp.FileData, 0, udp.FileData.Length); + + RaiseFileBytesReceived(udp.FileData.Length); + break; + + default: + Debug.WriteLine($"{response?.GetType().Name} for: {response?.RequestType}"); + // try to match responses with the requests + break; + }; + } } } \ No newline at end of file diff --git a/Source/v2/Meadow.HCom/Connections/SerialConnection.cs b/Source/v2/Meadow.HCom/Connections/SerialConnection.cs old mode 100755 new mode 100644 index ef37f8b5..6ea0967d --- a/Source/v2/Meadow.HCom/Connections/SerialConnection.cs +++ b/Source/v2/Meadow.HCom/Connections/SerialConnection.cs @@ -1,4 +1,5 @@ using System.Buffers; +using System.Collections.Concurrent; using System.IO.Ports; using System.Security.Cryptography; @@ -21,8 +22,7 @@ public partial class SerialConnection : ConnectionBase, IDisposable private bool _isDisposed; private ConnectionState _state; private readonly List _listeners = new List(); - private readonly Queue _pendingCommands = new Queue(); - private readonly AutoResetEvent _commandEvent = new AutoResetEvent(false); + private readonly ConcurrentQueue _pendingCommands = new ConcurrentQueue(); private bool _maintainConnection; private Thread? _connectionManager = null; private readonly List _textList = new List(); @@ -208,8 +208,7 @@ public override void Detach() // local function so we can unsubscribe var count = _messageCount; - _pendingCommands.Enqueue(command); - _commandEvent.Set(); + EnqueueRequest(command); while (timeout-- > 0) { @@ -242,18 +241,13 @@ public override void Detach() } } - private void CommandManager() + private async void CommandManager() { while (!_isDisposed) { - _commandEvent.WaitOne(1000); - - while (_pendingCommands.Count > 0) + if (_pendingCommands.TryDequeue(out var pendingCommand)) { - Debug.WriteLine($"There are {_pendingCommands.Count} pending commands"); - - var command = _pendingCommands.Dequeue() as Request; - if (command != null) + if (pendingCommand is Request command) { // if this is a file write, we need to packetize for progress @@ -263,6 +257,11 @@ private void CommandManager() // TODO: re-queue on fail? } } + else + { + // If no commands to dequeue, delay a bit to avoid busy waiting + await Task.Delay(100); + } } } @@ -298,7 +297,6 @@ public void EnqueueRequest(IRequest command) } _pendingCommands.Enqueue(command); - _commandEvent.Set(); } private void EncodeAndSendPacket(byte[] messageBytes, CancellationToken? cancellationToken = null) @@ -1251,13 +1249,13 @@ public override async Task StartDebuggingSession(int port, ILog throw new DeviceNotFoundException(); } + logger?.LogDebug($"Start Debugging on port: {port}"); + await Device.StartDebugging(port, logger, cancellationToken); + var debuggingServer = new DebuggingServer(this, port, logger); logger?.LogDebug("Tell the Debugging Server to Start Listening"); - await debuggingServer.StartListening(cancellationToken); - - logger?.LogDebug($"Start Debugging on port: {port}"); - await Device.StartDebugging(port, logger, cancellationToken); + _ = debuggingServer.StartListening(cancellationToken); return debuggingServer; } From 45cc74cd6a12c50d85509727589de1e75ea9f19d Mon Sep 17 00:00:00 2001 From: Dominique Louis Date: Mon, 4 Nov 2024 12:31:38 +0000 Subject: [PATCH 2/3] Bump to .61 version, and bump action versions. --- .github/workflows/dotnet.yml | 76 ++++++++++++++++++------------------ 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index 144ec1f6..3169ffd3 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -1,7 +1,7 @@ name: Meadow.CLI Packaging env: CLI_RELEASE_VERSION_1: 1.9.4.0 - CLI_RELEASE_VERSION_2: 2.0.17.0 + CLI_RELEASE_VERSION_2: 2.0.61.0 IDE_TOOLS_RELEASE_VERSION: 1.9.4 MEADOW_OS_VERSION: 1.9.0.0 VS_MAC_2019_VERSION: 8.10 @@ -19,33 +19,33 @@ jobs: steps: - name: Checkout Meadow.CLI - uses: actions/checkout@v2 + uses: actions/checkout@v4 with: path: main - name: Checkout Meadow.Contracts side-by-side - uses: actions/checkout@v2 + uses: actions/checkout@v4 with: repository: WildernessLabs/Meadow.Contracts path: Meadow.Contracts ref: main - name: Checkout Meadow.Logging side-by-side - uses: actions/checkout@v2 + uses: actions/checkout@v4 with: repository: WildernessLabs/Meadow.Logging path: Meadow.Logging ref: main - name: Checkout Meadow.Units side-by-side - uses: actions/checkout@v2 + uses: actions/checkout@v4 with: repository: WildernessLabs/Meadow.Units path: Meadow.Units ref: main - name: Setup .NET Core SDK 6.0.x, 7.0.x & 8.0.x - uses: actions/setup-dotnet@v1 + uses: actions/setup-dotnet@v4 with: dotnet-version: | 6.0.x @@ -53,7 +53,7 @@ jobs: 8.0.x - name: Setup NuGet - uses: NuGet/setup-nuget@v1.0.5 + uses: NuGet/setup-nuget@v2 - if: ${{ github.event_name == 'workflow_dispatch' }} name: Update CLI Version Numbers @@ -79,7 +79,7 @@ jobs: $newcontent | Set-Content main/Meadow.CLI.Core/Constants.cs - name: Add MSBuild to Path - uses: microsoft/setup-msbuild@v1.1 + uses: microsoft/setup-msbuild@v2 - name: Restore Classic dependencies run: dotnet restore main/MeadowCLI.Classic.sln /p:Configuration=Release @@ -134,14 +134,14 @@ jobs: # steps: # - name: Checkout Meadow.CLI.Core side-by-side - # uses: actions/checkout@v2 + # uses: actions/checkout@v4 # with: # repository: WildernessLabs/Meadow.CLI # path: Meadow.CLI # - if: ${{ github.ref == 'refs/heads/main' }} # name: Checkout Win Extension side-by-side - # uses: actions/checkout@v2 + # uses: actions/checkout@v4 # with: # repository: WildernessLabs/VS_Win_Meadow_Extension # path: vs-win @@ -149,13 +149,13 @@ jobs: # - if: ${{ github.ref != 'refs/heads/main' }} # name: Checkout Win Extension side-by-side - # uses: actions/checkout@v2 + # uses: actions/checkout@v4 # with: # repository: WildernessLabs/VS_Win_Meadow_Extension # path: vs-win # - name: Setup .NET Core SDK 5.0.x, 6.0.x & 7.0.x - # uses: actions/setup-dotnet@v1 + # uses: actions/setup-dotnet@v4 # with: # dotnet-version: | # 6.0.x @@ -163,10 +163,10 @@ jobs: # 8.0.x # - name: Setup NuGet - # uses: NuGet/setup-nuget@v1.0.5 + # uses: NuGet/setup-nuget@v2 # - name: Add MSBuild to Path - # uses: microsoft/setup-msbuild@v1.1 + # uses: microsoft/setup-msbuild@v2 # - if: ${{ github.event_name == 'workflow_dispatch' }} # name: Update VS2019 Version Numbers @@ -202,14 +202,14 @@ jobs: steps: - name: Checkout Meadow.CLI.Core side-by-side - uses: actions/checkout@v2 + uses: actions/checkout@v4 with: repository: WildernessLabs/Meadow.CLI path: Meadow.CLI - if: ${{ github.ref == 'refs/heads/main' }} name: Checkout Win Extension side-by-side - uses: actions/checkout@v2 + uses: actions/checkout@v4 with: repository: WildernessLabs/VS_Win_Meadow_Extension path: vs-win @@ -217,13 +217,13 @@ jobs: - if: ${{ github.ref != 'refs/heads/main' }} name: Checkout Win Extension side-by-side - uses: actions/checkout@v2 + uses: actions/checkout@v4 with: repository: WildernessLabs/VS_Win_Meadow_Extension path: vs-win - name: Setup .NET Core SDK 6.0.x, 7.0.x, 8.0.x - uses: actions/setup-dotnet@v1 + uses: actions/setup-dotnet@v4 with: dotnet-version: | 6.0.x @@ -231,10 +231,10 @@ jobs: 8.0.x - name: Setup NuGet - uses: NuGet/setup-nuget@v1.0.5 + uses: NuGet/setup-nuget@v2 - name: Add MSBuild to Path - uses: microsoft/setup-msbuild@v1.1 + uses: microsoft/setup-msbuild@v2 with: vs-version: '[17.0, 18.0)' @@ -271,13 +271,13 @@ jobs: # steps: # - name: Checkout Meadow.CLI.Core side-by-side - # uses: actions/checkout@v2 + # uses: actions/checkout@v4 # with: # path: Meadow.CLI # - if: ${{ github.ref == 'refs/heads/main' }} # name: Checkout Mac Extension side-by-side - # uses: actions/checkout@v2 + # uses: actions/checkout@v4 # with: # repository: WildernessLabs/VS_Mac_Meadow_Extension # path: vs-mac @@ -285,7 +285,7 @@ jobs: # - if: ${{ github.ref != 'refs/heads/main' }} # name: Checkout Mac Extension side-by-side - # uses: actions/checkout@v2 + # uses: actions/checkout@v4 # with: # repository: WildernessLabs/VS_Mac_Meadow_Extension # path: vs-mac @@ -297,7 +297,7 @@ jobs: # sudo xcode-select -s $XCODE_ROOT # - name: Setup .NET Core SDK 5.0.x, 6.0.x & 7.0.x - # uses: actions/setup-dotnet@v1 + # uses: actions/setup-dotnet@v4 # with: # dotnet-version: | # 6.0.x @@ -305,7 +305,7 @@ jobs: # 8.0.x # - name: Setup NuGet - # uses: NuGet/setup-nuget@v1.0.5 + # uses: NuGet/setup-nuget@v2 # - name: Work around so that VS2019 is picked up. # run: | @@ -334,7 +334,7 @@ jobs: #- if: ${{ github.event_name == 'workflow_dispatch' && github.ref == 'refs/heads/main' }} # name: Get Commit Messages # id: commit_messages - # uses: actions/github-script@v6 + # uses: actions/github-script@v7 # with: # github-token: ${{ secrets.MEADOW_MAC_TOKEN }} # script: | @@ -391,13 +391,13 @@ jobs: steps: - name: Checkout Meadow.CLI.Core side-by-side - uses: actions/checkout@v2 + uses: actions/checkout@v4 with: path: Meadow.CLI - if: ${{ github.ref == 'refs/heads/main' }} name: Checkout Mac Extension side-by-side - uses: actions/checkout@v2 + uses: actions/checkout@v4 with: repository: WildernessLabs/VS_Mac_Meadow_Extension path: vs-mac @@ -405,13 +405,13 @@ jobs: - if: ${{ github.ref != 'refs/heads/main' }} name: Checkout Mac Extension side-by-side - uses: actions/checkout@v2 + uses: actions/checkout@v4 with: repository: WildernessLabs/VS_Mac_Meadow_Extension path: vs-mac - name: Setup .NET Core SDK 6.0.x, 7.0.x & 8.0.x - uses: actions/setup-dotnet@v1 + uses: actions/setup-dotnet@v4 with: dotnet-version: | 6.0.x @@ -419,7 +419,7 @@ jobs: 8.0.x - name: Setup NuGet - uses: NuGet/setup-nuget@v1.0.5 + uses: NuGet/setup-nuget@v2 - if: ${{ github.event_name == 'workflow_dispatch' }} name: Update VS2022 Version Numbers @@ -443,7 +443,7 @@ jobs: - if: ${{ github.event_name == 'workflow_dispatch' && github.ref == 'refs/heads/main' }} name: Get Commit Messages id: commit_messages - uses: actions/github-script@v6 + uses: actions/github-script@v7 with: github-token: ${{ secrets.MEADOW_MAC_TOKEN }} script: | @@ -500,13 +500,13 @@ jobs: steps: - name: Checkout Meadow.CLI.Core side-by-side - uses: actions/checkout@v2 + uses: actions/checkout@v4 with: path: Meadow.CLI - if: ${{ github.ref == 'refs/heads/main' }} name: Checkout VSCode Extension side-by-side - uses: actions/checkout@v2 + uses: actions/checkout@v4 with: repository: WildernessLabs/VSCode_Meadow_Extension path: vs-code @@ -515,14 +515,14 @@ jobs: - if: ${{ github.ref != 'refs/heads/main' }} name: Checkout VSCode Extension side-by-side - uses: actions/checkout@v2 + uses: actions/checkout@v4 with: repository: WildernessLabs/VSCode_Meadow_Extension path: vs-code submodules: true - name: Setup .NET Core SDK 6.0.x, 7.0.x & 8.0.x - uses: actions/setup-dotnet@v1 + uses: actions/setup-dotnet@v4 with: dotnet-version: | 6.0.x @@ -530,7 +530,7 @@ jobs: 8.0.x - name: Setup Nuget - uses: Nuget/setup-nuget@v1.0.5 + uses: Nuget/setup-nuget@v2 - name: Setup Node.js 16 uses: actions/setup-node@v2 @@ -548,7 +548,7 @@ jobs: npm i -g @vscode/vsce - name: Add MSBuild to Path - uses: microsoft/setup-msbuild@v1.1 + uses: microsoft/setup-msbuild@v2 - if: ${{ github.event_name == 'workflow_dispatch' }} name: Update VSCode Version Numbers From 3929cac8fd7ed3284955965973c9707d16d16202 Mon Sep 17 00:00:00 2001 From: Dominique Louis Date: Mon, 4 Nov 2024 12:35:56 +0000 Subject: [PATCH 3/3] Node version needs to be 20 now --- .github/workflows/dotnet.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index 3169ffd3..59b80b5d 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -532,10 +532,10 @@ jobs: - name: Setup Nuget uses: Nuget/setup-nuget@v2 - - name: Setup Node.js 16 - uses: actions/setup-node@v2 + - name: Setup Node.js 20 + uses: actions/setup-node@v4 with: - node-version: '16' + node-version: '20' - name: Install NPM run: |