Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
142 commits
Select commit Hold shift + click to select a range
894c4a6
Phase 0: Scaffolding for Part 14 PubSub reimplementation
marcschier Jun 15, 2026
63f48b5
Phase 1: Core PubSub abstractions and state machine
marcschier Jun 15, 2026
e5a8e4a
Phase 2/3/4: UADP + JSON encoders + configuration validator
marcschier Jun 15, 2026
0ff3e0c
Phase 5/6: UDP and MQTT transports
marcschier Jun 16, 2026
ff1a1ec
Phase 7: PubSub security subsystem
marcschier Jun 16, 2026
53f3020
Phase 8: Security Key Service (SKS) client and in-memory server
marcschier Jun 16, 2026
1be00be
Phase 10/13: Server address space + v1.05.06 compliance fixes
marcschier Jun 16, 2026
f2e3f40
Phase 14: Runtime integration of orphaned security + chunking + KeepA…
marcschier Jun 16, 2026
77fb4e2
Phases 15/16(partial)/17: subscriber semantics + metadata pub + confi…
marcschier Jun 16, 2026
c0bf686
Phase 16 follow-up: complete sub-tasks 16b-g
marcschier Jun 16, 2026
de69931
Phase 11: rewrite samples to fluent/DI, enable NativeAOT publish, add…
marcschier Jun 16, 2026
d954527
Phase 12: replace Docs/PubSub.md, expand migration guide, add benchma…
marcschier Jun 17, 2026
4998144
Phase 12 coverage lift (partial): +163 tests, 72/72/79/74% vs 80% target
marcschier Jun 17, 2026
6a173a2
Phase 12 coverage lift (round 2): Mqtt/Server pass 80%, fix Publisher…
marcschier Jun 17, 2026
32830d6
Phase 12 coverage lift: UDP datagram tests
marcschier Jun 17, 2026
bcdf5e9
Phase 12 coverage lift: UADP raw binary tests
marcschier Jun 17, 2026
a43bd2b
Phase 12 coverage lift: JSON array tests
marcschier Jun 17, 2026
dd4bdf3
Phase 12 coverage lift: legacy UADP flags
marcschier Jun 17, 2026
f0837fc
Phase 12 coverage lift: legacy UADP encode tests
marcschier Jun 17, 2026
784ef3d
Phase 12 coverage lift: JSON constructor paths
marcschier Jun 17, 2026
7350a5b
Phase 12 coverage lift: configurator compatibility tests
marcschier Jun 17, 2026
f77ba7c
Phase 12 coverage lift: configurator branch tests
marcschier Jun 17, 2026
a8f5414
Phase 12 coverage lift: JSON and configurator edges
marcschier Jun 17, 2026
424a860
Phase 12 coverage lift: JSON scalar edge tests
marcschier Jun 17, 2026
7794dcb
Phase 12 coverage lift (final): all 4 PubSub libs ≥80%
marcschier Jun 17, 2026
d20fca2
Security S1+S3: wire message security fail-closed + decoder/reassembl…
marcschier Jun 17, 2026
56c84b7
Security S2: replay protection + deterministic nonce + SKS per-group …
marcschier Jun 17, 2026
490480f
Security S4+S5: SKS-client TLS, validator diagnostics, key zeroizatio…
marcschier Jun 17, 2026
97c39bb
Merge branch 'master' into part14pubsub
marcschier Jun 17, 2026
dc9c4de
Address PR #3892 review feedback: DeadbandFilter ConvertToDouble + do…
marcschier Jun 18, 2026
8c55052
Codestyle: fix analyzer diagnostics in PubSub projects after master m…
marcschier Jun 18, 2026
e3fe9a3
PR #3892 follow-ups R1-R4: ArrayOf public API, record structs, migrat…
marcschier Jun 18, 2026
76b23c3
Fix analyzer warnings on branch changes (CA2000, CA2025)
marcschier Jun 18, 2026
10d7c95
Address PR #3892 review feedback (round 2): mechanical + doc cleanups
marcschier Jun 18, 2026
149d923
PR #3892 structural follow-ups P1-P5
marcschier Jun 18, 2026
948ce73
Fix CI: repair Opc.Ua.Aot.Tests/PubSubAotTests.cs (RCS1094 + JSON ali…
marcschier Jun 18, 2026
fe38a28
Fix CI: wire SampleSecurity key provider in publisher AOT tests (PSC1…
marcschier Jun 18, 2026
501f81a
Merge remote-tracking branch 'origin/master' into part14pubsub
marcschier Jun 18, 2026
636568a
Phase 2: integrate master merge into PubSub libraries
marcschier Jun 18, 2026
e5ee024
Fix CI: make PubSub test projects build on net48/net472
marcschier Jun 19, 2026
dcac373
Remove Opc.Ua.PubSub.Legacy compatibility layer
marcschier Jun 19, 2026
95d0455
Add all Docs/ markdown files to UA.slnx
marcschier Jun 19, 2026
63b458c
Merge branch 'master' into part14pubsub
marcschier Jun 19, 2026
7584ea9
Use one-shot EncryptEcb for AES-CTR keystream on net6+ (CodeQL #349)
marcschier Jun 19, 2026
4051143
Skip UDP multicast loopback tests when send has no route (macOS CI)
marcschier Jun 20, 2026
1783a1e
Merge remote-tracking branch 'origin/master' into part14pubsub
marcschier Jun 20, 2026
a41d708
PubSub diagnostics S1: opt-in transport capture seam
marcschier Jun 21, 2026
7ea8421
PubSub diagnostics S2 + MCP S6: capture library scaffold + PubSub MCP…
marcschier Jun 21, 2026
f889482
PubSub diagnostics S3: offline dissection + pcap/json/text formats + …
marcschier Jun 21, 2026
e498301
PubSub diagnostics S4 + S5: encrypted UADP decryption, SKS keys, DI/e…
marcschier Jun 21, 2026
1dcdcf6
PubSub diagnostics S9 (docs): add Docs/PubSubDiagnostics.md
marcschier Jun 21, 2026
962d0d4
PubSub diagnostics S8: MCP capture / dissection tools
marcschier Jun 21, 2026
d84788b
PubSub diagnostics S7 + S9: MCP publish/subscribe runtime + diagnosti…
marcschier Jun 21, 2026
d1d8eb2
Address PR #3900 review feedback: capturing decorator, single MCP ref…
marcschier Jun 22, 2026
59eadc7
MCP PubSub tools: drop redundant config wrappers, add discovery; plan…
marcschier Jun 22, 2026
b64616c
PubSub Actions S1-S3: JSON + UADP action messages + PublishedAction s…
marcschier Jun 22, 2026
25ae465
PubSub Actions S4: requester/responder runtime + correlation
marcschier Jun 22, 2026
281bcb2
PubSub Actions S5 + S6: server method binding + DI/fluent responder w…
marcschier Jun 22, 2026
15c3973
PubSub Actions S7: MCP PubSubActionTools
marcschier Jun 22, 2026
9c82df0
Bump actions/checkout from 6 to 7
dependabot[bot] Jun 22, 2026
bdd0e0f
PubSub Actions S8: docs + mark plans/28 implemented
marcschier Jun 22, 2026
c1a10af
Fix PubSubConnection private-method test reflection ambiguity
marcschier Jun 22, 2026
9449270
Merge remote-tracking branch 'origin/dependabot/github_actions/action…
marcschier Jun 22, 2026
9d0ccf0
Fix PubSub MQTT topics and discovery encoding
marcschier Jun 22, 2026
0ac87b1
Fix PubSub message encoding conformance
marcschier Jun 22, 2026
4bed79e
Fix PubSub config model state handling
marcschier Jun 22, 2026
9491462
Implement PubSub SKS push and key rotation
marcschier Jun 22, 2026
4231ecc
Complete MQTT discovery status wiring
marcschier Jun 22, 2026
2a27e9a
Complete PubSub configuration model methods
marcschier Jun 22, 2026
3b63f63
Merge branch 'fix/pubsub-config' into part14pubsub
marcschier Jun 22, 2026
94ec43c
Merge branch 'fix/pubsub-security' into part14pubsub
marcschier Jun 22, 2026
b35e04b
Finish PubSub discovery announcements
marcschier Jun 22, 2026
7b15a99
Merge branch 'fix/pubsub-transport' into part14pubsub
marcschier Jun 22, 2026
70ec418
Fix down-level (net48/netstandard) compatibility in merged PubSub con…
marcschier Jun 22, 2026
5ef4308
Document Part 14 v1.05.07 PubSub conformance changes
marcschier Jun 22, 2026
22988c2
Fix PubSub round 2 encoding conformance
marcschier Jun 22, 2026
f5a59db
Fix PubSub dynamic address space routing
marcschier Jun 22, 2026
4bcd3b4
Harden PubSub SKS key handling
marcschier Jun 22, 2026
34acbc8
Fix PubSub transport remediation gaps
marcschier Jun 22, 2026
4a1595e
Add DTLS profile registry
marcschier Jun 22, 2026
417293d
Add DTLS transport scaffolding
marcschier Jun 22, 2026
96bd4ce
Wire opc.dtls endpoints into UDP transport
marcschier Jun 22, 2026
82409c0
Add DTLS record protection mechanics
marcschier Jun 22, 2026
c876d0b
Add TLS 1.3 DTLS key schedule
marcschier Jun 22, 2026
3109d48
Keep DTLS crypto helpers cross-TFM safe
marcschier Jun 22, 2026
8b51115
Use DTLS crypto wrapper in tests
marcschier Jun 22, 2026
a0db14d
Materialize PubSub SKS address-space nodes
marcschier Jun 22, 2026
020dc59
Keep DTLS crypto tests on supported TFMs
marcschier Jun 22, 2026
4807272
Add PubSub HA provider contracts
marcschier Jun 22, 2026
0f05c29
Test PubSub HA provider registrations
marcschier Jun 22, 2026
15bf276
Add DTLS handshake message codecs
marcschier Jun 22, 2026
eeff0b2
Add DTLS ECDHE key share support
marcschier Jun 22, 2026
a0311a3
Add DTLS handshake reliability helpers
marcschier Jun 22, 2026
a8727ef
Add DTLS certificate authentication helpers
marcschier Jun 22, 2026
9f506d3
Add DTLS retry timer and HRR cookie helpers
marcschier Jun 22, 2026
0be4f16
Add DTLS Finished and KeyUpdate helpers
marcschier Jun 22, 2026
4d459ee
Complete DTLS handshake flight driver
marcschier Jun 22, 2026
cf204dc
Optimize DTLS record protection
marcschier Jun 22, 2026
e7e2e33
Expand DTLS test and AOT coverage
marcschier Jun 22, 2026
525b227
Document PubSub DTLS transport
marcschier Jun 22, 2026
50dc142
Wire PubSub runtime state providers
marcschier Jun 22, 2026
e30a60c
Test PubSub provider failover rebuild
marcschier Jun 22, 2026
92d80b2
Move DTLS code from Security/Dtls to Dtls (drop intermediate Security…
marcschier Jun 23, 2026
1f1fcbf
Address PR #3906 review feedback: docs v1.05.06 links, trim new-in-2.…
marcschier Jun 23, 2026
133486b
Address PR #3906 review feedback (round 2): restore 1.05.07 in core/P…
marcschier Jun 23, 2026
40b7fc7
Move DTLS ZeroMemory/FixedTimeEquals into stack CryptoUtils; remove P…
marcschier Jun 23, 2026
2100ec9
Fix High PubSub security findings SA-REGR-01 and SA-ACT-01
marcschier Jun 23, 2026
e2a770b
Remediate all Medium/Low PubSub security findings (14)
marcschier Jun 23, 2026
24291cd
Merge fix/pubsub-r2-encodings into part14pubsub (round-2 encoding con…
marcschier Jun 24, 2026
41bc5b5
Merge fix/pubsub-r2-server into part14pubsub (HA runtime-state provid…
marcschier Jun 24, 2026
bc0e8a1
Remediate Info DTLS findings SA-DTLS-CRYPTO-03 and SA-DTLS-HS-07
marcschier Jun 24, 2026
c536f7c
Add Opc.Ua.PubSub.Adapter: PubSub publisher/subscriber/action adapter…
marcschier Jun 24, 2026
34a7314
Merge remote-tracking branch 'origin/master' into part14pubsub
marcschier Jun 24, 2026
8f73200
Consolidate the three PubSub console samples into ConsoleReferencePub…
marcschier Jun 24, 2026
04f114c
Address PR #3892 review feedback: rename adapter (drop External), mer…
marcschier Jun 24, 2026
2768d69
PubSub adapter hot-reload, model-change monitoring, runtime data-set …
marcschier Jun 24, 2026
e282b23
Address PR #3892 review: rename sample to ConsoleReferencePubSubClien…
marcschier Jun 24, 2026
9f9860e
Fix CI: net48 build breaks in PubSub test projects + platform-guard D…
marcschier Jun 25, 2026
372c38a
Merge remote-tracking branch 'origin/master' into part14pubsub
marcschier Jun 25, 2026
02c0c86
Fix CI: guard DtlsRecordProtectionBenchmarks SetUp for platforms lack…
marcschier Jun 25, 2026
31b195e
Address PR #3892 review: sample multi-mode external bridge, remove ob…
marcschier Jun 25, 2026
f9582a6
Add hot-reload demo to ConsoleReferencePubSubClient + opt-in file wat…
marcschier Jun 25, 2026
a383f6f
Fix CI: net48 ServerConnectionOptions.GetHashCode null-string crash +…
marcschier Jun 25, 2026
f8370de
Merge remote-tracking branch 'origin/master' into part14pubsub
marcschier Jun 25, 2026
f38b82a
Fix all-TFM CI build: MQTTnet v4/v5 selection under netstandard2.1 pin
marcschier Jun 25, 2026
2511a55
Centralize sensitive-buffer crypto helpers on stack CryptoUtils
marcschier Jun 26, 2026
01c0209
Fix build-windows-all-tfm: PubSub.Diagnostics netstandard2.0 shell
marcschier Jun 26, 2026
0185308
Fix flaky macOS PubSub UDP loopback tests (HostUnreachable)
marcschier Jun 26, 2026
338992f
Merge origin/master into part14pubsub
marcschier Jun 28, 2026
25f96e4
Merge origin/master into part14pubsub (#3921 StatusCode equality)
marcschier Jun 28, 2026
aca14d1
Harden DTLS Certificate handle ownership and disposal
marcschier Jun 28, 2026
a99ab30
Format/diagnostic sweep on DTLS Certificate ownership changes
marcschier Jun 28, 2026
4149133
Add CA trust chain to MQTT TLS configuration surface (#3920)
marcschier Jun 28, 2026
606b17a
Add OPC UA PubSub Ethernet (Layer 2) transport opc.eth:// (squash #3915)
marcschier Jun 29, 2026
ddc11c5
Runtime schema generation (XSD/BSD/JSON) + PubSub message schemas (sq…
marcschier Jun 29, 2026
3ccb17e
Merge remote-tracking branch 'origin/master' into part14pubsub
marcschier Jun 29, 2026
78d298b
dotnet format sweep on squashed #3915/#3916 changes
marcschier Jun 29, 2026
190971c
Fix build-linux-all-tfm: Eth Pcap test under netstandard2.1 pin
marcschier Jun 29, 2026
094d4fb
Fix Docker Reference Server build: copy Opc.Ua.Core.Schema csproj
marcschier Jun 29, 2026
b753d48
Merge remote-tracking branch 'origin/master' into part14pubsub
marcschier Jun 29, 2026
3a70e9a
Address PR #3892 review feedback (round 5)
marcschier Jun 30, 2026
f4ca52a
Consolidate TFM-support warning suppression to common.props (#3927)
marcschier Jun 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 1 addition & 1 deletion .github/copilot-instructions.md
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ This is the official OPC UA .NET Standard Stack from the OPC Foundation. It prov
- Follow standard C# naming conventions. Do not use underscores in method names.
- Assembly prefix: `Opc.Ua` (Except applications, or if otherwise requested)
- Package prefix: `OPCFoundation.NetStandard`
- Always use a line break after <summary> and before </summary> for all members (except for documentation of fields).
- Always use a line break after `<summary>` and before `</summary>` for all members (except for documentation of fields). This applies to **every** XML-doc summary, including in sample/application code — never write a single-line `/// <summary> ... </summary>`; always put the text on its own line between the opening and closing tags.

### Security Requirements
- **Never hardcode credentials, certificates, or secrets** in source code
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/buildandtest.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ jobs:
outputs:
csprojs: ${{ steps.list.outputs.csprojs }}
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7
- name: Enumerate Tests/Opc.Ua.*.Tests projects
id: list
shell: pwsh
Expand Down Expand Up @@ -79,7 +79,7 @@ jobs:
TESTRESULTS: "TestResults-${{matrix.csproj}}-${{matrix.os}}-${{matrix.framework}}-${{matrix.configuration}}"

steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7
with:
fetch-depth: 0

Expand Down Expand Up @@ -159,7 +159,7 @@ jobs:
AOTPROJECT: './Tests/Opc.Ua.Aot.Tests/Opc.Ua.Aot.Tests.csproj'

steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7
with:
fetch-depth: 0

Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/codeql-analysis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ jobs:

steps:
- name: Checkout repository
uses: actions/checkout@v6
uses: actions/checkout@v7

# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/docker-image.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ jobs:
id-token: write

steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7
with:
fetch-depth: 0

Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/stability-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ jobs:

steps:
- name: Checkout code
uses: actions/checkout@v6
uses: actions/checkout@v7
with:
fetch-depth: 0

Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/stress-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ jobs:

steps:
- name: Checkout code
uses: actions/checkout@v6
uses: actions/checkout@v7
with:
fetch-depth: 0

Expand Down
85 changes: 85 additions & 0 deletions Applications/ConsoleReferencePubSubClient/ConsoleLoggingSink.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
/* ========================================================================
* Copyright (c) 2005-2026 The OPC Foundation, Inc. All rights reserved.
*
* OPC Foundation MIT License 1.00
*
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without
* restriction, including without limitation the rights to use,
* copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following
* conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*
* The complete license agreement can be found here:
* http://opcfoundation.org/License/MIT/1.00/
* ======================================================================*/

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using Opc.Ua.PubSub.DataSets;
using Opc.Ua.PubSub.Encoding;

namespace Quickstarts.ConsoleReferencePubSubClient
{
/// <summary>
/// <see cref="ISubscribedDataSetSink"/> that prints every received
/// DataSetMessage to the console via an
/// <see cref="ILogger"/>. Demonstrates the Part 14 §6.2.9 sink
/// extension point.
/// </summary>
public sealed class ConsoleLoggingSink : ISubscribedDataSetSink
{
private readonly ILogger m_logger;
private long m_received;

public ConsoleLoggingSink(ILogger logger)
{
if (logger is null)
{
throw new ArgumentNullException(nameof(logger));
}
m_logger = logger;
}

public ValueTask WriteAsync(
IReadOnlyList<DataSetField> fields,
CancellationToken cancellationToken = default)
{
cancellationToken.ThrowIfCancellationRequested();
long sequence = Interlocked.Increment(ref m_received);
var builder = new StringBuilder();
for (int i = 0; i < fields.Count; i++)
{
DataSetField field = fields[i];
if (i > 0)
{
builder.Append(", ");
}
builder.Append(string.IsNullOrEmpty(field.Name) ? $"f{i}" : field.Name);
builder.Append('=');
builder.Append(field.Value.IsNull ? "(null)" : field.Value.ToString());
}
m_logger.LogInformation(
"DataSet #{Sequence} received ({FieldCount} fields): {Fields}",
sequence, fields.Count, builder.ToString());
Comment thread
github-advanced-security[bot] marked this conversation as resolved.
Fixed
Comment thread
marcschier marked this conversation as resolved.
Dismissed
return ValueTask.CompletedTask;
}
}
}
Comment thread
marcschier marked this conversation as resolved.
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<OutputType>Exe</OutputType>
<AssemblyName>ConsoleReferencePubSubClient</AssemblyName>
<PackageId>ConsoleReferencePubSubClient</PackageId>
<Company>OPC Foundation</Company>
<Description>Self-contained OPC UA Part 14 PubSub reference sample with three command-line-selectable modes (publisher, subscriber, external-server adapter bridge) built on the fluent + DI Host surface. Native AOT compatible.</Description>
<Copyright>Copyright © 2004-2026 OPC Foundation, Inc</Copyright>
<RootNamespace>Quickstarts.ConsoleReferencePubSubClient</RootNamespace>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>
<PublishAot>true</PublishAot>
<!-- Opt into the root Directory.Build.targets no-op shape on
per-TFM CI matrix entries that pin CustomTestTarget to a
legacy TFM this sample cannot target. -->
<RestrictForLegacyTfm>true</RestrictForLegacyTfm>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\Libraries\Opc.Ua.Configuration\Opc.Ua.Configuration.csproj" />
<ProjectReference Include="..\..\Libraries\Opc.Ua.PubSub\Opc.Ua.PubSub.csproj" />
<ProjectReference Include="..\..\Libraries\Opc.Ua.PubSub.Udp\Opc.Ua.PubSub.Udp.csproj" />
<ProjectReference Include="..\..\Libraries\Opc.Ua.PubSub.Eth\Opc.Ua.PubSub.Eth.csproj" />
<ProjectReference Include="..\..\Libraries\Opc.Ua.PubSub.Mqtt\Opc.Ua.PubSub.Mqtt.csproj" />
<ProjectReference Include="..\..\Libraries\Opc.Ua.PubSub.Adapter\Opc.Ua.PubSub.Adapter.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Hosting" />
<PackageReference Include="Microsoft.Extensions.Logging.Console" />
<PackageReference Include="System.CommandLine" />
</ItemGroup>
<ItemGroup>
<None Update="appsettings.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>
Loading