Hm? Hier meldet sich irgendwie keiner. Na vielleicht ist CB einfach nicht (mehr) der richtige Ort für sowas.... 🤔
So ein paar Ideen, die sich mir beim Drüberschauen ergeben haben:
- Etwas viele Optionen. Und wenn ich das richtig verstanden habe, dann werden an manchen Stellen auch dieselbe Option mehrfach angegeben, um "mehrere" Einträge für eine Option zu bekommen.
=> Das macht es natürlich für alle Beteiligten, Dich wie den Anwender auch, zu einem ziemlichen Tohuwabohu. Daher: Optionen einkürzen und, wo es praktikabel ist, statt dieselbe Option mehrfach angeben zu müssen, eine Option als Liste auswertbar zu machen. ZB --option=A,B,C oder sowas.
Aber auch ein Templateformat wäre eine Idee. Das hast Du ja stellenweise schon.
Weitergehend wäre auch eine Form einer Templatedatei möglich, die man einmal erstellt und die man dann zB per --config <name> auswählen kann.
- Mich persönlich ödet das mit dem "var" in .Net schon seit Ewigkeiten an... das kannst Du natürlich halten wie Du möchtest, aber so als Vorschlag: net6+ erlaubt es auch, die Typinferenz "rumzudrehen". Also statt var x=new Fileinfo() halt FileInfo x = new() .
- Du hast in der global.json angegeben, daß rollforward auf "irgendwas" möglich sein soll. Wäre ich vorsichtig mit. Bist Du sicher, daß das auf net7, net8, net irgendwas immer noch laufen wird?
-- Dependency injection. Versuch das loszuwerden, wenn irgend möglich. MS hat schon angedroht, das stopfen zu wollen.
-- OO macht es natürlich naturgemäß immer etwas schwieriger, "schnell" einen tiefen Einblick zu bekommen, aber mir fällt beim Lesen auf, daß Du evtl. von yields gebrauch machen könntest (wenn Du nicht bereits Dich explizit dagegen entschieden hattest). Aber das nur so als Überlegung, wo man hingucken könnte; vor allem wenn Du feststellst daß es mancherorts vielleicht unnötig hängt.
Gibt sicher noch einiges mehr, aber das ist erstmal das was mir aufgefallen ist.
Alles in allem wirkt der Code jedenfalls strukturiert (daß es inzwischen file-scoped namespaces gibt und ich die auf den Tod nicht abkann ist ja nicht Dein Vergehen
). Definitiv besser als eine Menge Code wo ich mich mit auseinandersetzen "durfte".
Ausnahmen hab ich allerdings keine gesehen. Will natürlich nix heißen (hab nicht in jede Datei geschaut), daher: definierst Du irgendwo welche und nutzt sie auch?
Dasselbe für Events. Beides ist natürlich kein Muß, aber ich unterstelle mal, daß Dir ein Exception- und ein Eventmodell bei der Implementierung durchaus entgegenkommen können, wenn nämlich eine Aktion zB "bin fertig" signalisieren kann oder wenn du feststellst, Mist, der Vorgang hat zwar funktioniert, aber nicht wie er sollte, weil XYZ ist passiert. Manchmal(tm) kann man sowas ja abfangen ("die Datei die du gesagt hast gibt es gar nicht => gib neu ein" oder "hey in /tmp kann ich nicht schreiben, aber vielleicht nach $USER/tmp?"). Manchmal aber auch nicht ("ja das war ja alles super schick, aber Dateisystem voll, kann ich ja nicht riechen" oder "ich weiß nicht wie du das geschafft hast aber deine Laufzeitumgebung ist so kaputt daß ich damit nix mehr machen kann").
Finally, dotnet build, osx12, net7 7.0.100, net6 6.0.300, code unverändert:
Code:
Microsoft (R) Build Engine version 17.3.0-preview-22226-04+f15ed2652 for .NET
Copyright (C) Microsoft Corporation. All rights reserved.
Determining projects to restore...
tone/tone.Tests/tone.Tests.csproj : warning NU1603: tone.Tests depends on Sandreas.Files (>= 0.0.5) but Sandreas.Files 0.0.5 was not found. An approximate best match of Sandreas.Files 1.0.0 was resolved. [tone/tone.sln]
tone/tone/tone.csproj : warning NU1603: tone depends on Sandreas.Files (>= 0.0.5) but Sandreas.Files 0.0.5 was not found. An approximate best match of Sandreas.Files 1.0.0 was resolved. [tone/tone.sln]
All projects are up-to-date for restore.
/usr/local/share/dotnet/sdk/7.0.100-preview.4.22252.9/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.RuntimeIdentifierInference.targets(216,5): message NETSDK1057: You are using a preview version of .NET. See: https://aka.ms/dotnet-support-policy [tone/tone.Tests/tone.Tests.csproj]
tone/tone.Tests/tone.Tests.csproj : warning NU1603: tone.Tests depends on Sandreas.Files (>= 0.0.5) but Sandreas.Files 0.0.5 was not found. An approximate best match of Sandreas.Files 1.0.0 was resolved.
/usr/local/share/dotnet/sdk/7.0.100-preview.4.22252.9/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.RuntimeIdentifierInference.targets(216,5): message NETSDK1057: You are using a preview version of .NET. See: https://aka.ms/dotnet-support-policy [tone/tone/tone.csproj]
tone/tone/tone.csproj : warning NU1603: tone depends on Sandreas.Files (>= 0.0.5) but Sandreas.Files 0.0.5 was not found. An approximate best match of Sandreas.Files 1.0.0 was resolved.
tone/tone/Services/DirectoryLoaderService.cs(40,50): error CS1061: 'FileWalker' does not contain a definition for 'FileSystem' and no accessible extension method 'FileSystem' accepting a first argument of type 'FileWalker' could be found (are you missing a using directive or an assembly reference?) [tone/tone/tone.csproj]
tone/tone/Services/DirectoryLoaderService.cs(75,35): error CS1503: Argument 1: cannot convert from 'string' to 'System.IO.Abstractions.IFileInfo' [tone/tone/tone.csproj]
tone/tone/Services/DirectoryLoaderService.cs(77,41): error CS1061: 'FileWalker' does not contain a definition for 'FileSystem' and no accessible extension method 'FileSystem' accepting a first argument of type 'FileWalker' could be found (are you missing a using directive or an assembly reference?) [tone/tone/tone.csproj]
tone/tone/DependencyInjection/TypeRegistrar.cs(23,9): warning IL2067: 'implementationType' argument does not satisfy 'DynamicallyAccessedMemberTypes.PublicConstructors' in call to 'Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddSingleton(IServiceCollection, Type, Type)'. The parameter 'implementation' of method 'tone.DependencyInjection.TypeRegistrar.Register(Type, Type)' does not have matching annotations. The source value must declare at least the same requirements as those declared on the target location it is assigned to. [tone/tone/tone.csproj]
tone/tone/Common/Extensions/Object/ObjectExtensions.cs(41,16): warning IL2090: 'this' argument does not satisfy 'DynamicallyAccessedMemberTypes.PublicProperties' in call to 'System.Type.GetProperties()'. The generic parameter 'T' of 'tone.Common.Extensions.Object.ObjectExtensions.GetProperties<T>(T)' does not have matching annotations. The source value must declare at least the same requirements as those declared on the target location it is assigned to. [tone/tone/tone.csproj]
Build FAILED.
tone/tone.Tests/tone.Tests.csproj : warning NU1603: tone.Tests depends on Sandreas.Files (>= 0.0.5) but Sandreas.Files 0.0.5 was not found. An approximate best match of Sandreas.Files 1.0.0 was resolved. [tone/tone.sln]
tone/tone/tone.csproj : warning NU1603: tone depends on Sandreas.Files (>= 0.0.5) but Sandreas.Files 0.0.5 was not found. An approximate best match of Sandreas.Files 1.0.0 was resolved. [tone/tone.sln]
tone/tone.Tests/tone.Tests.csproj : warning NU1603: tone.Tests depends on Sandreas.Files (>= 0.0.5) but Sandreas.Files 0.0.5 was not found. An approximate best match of Sandreas.Files 1.0.0 was resolved.
tone/tone/tone.csproj : warning NU1603: tone depends on Sandreas.Files (>= 0.0.5) but Sandreas.Files 0.0.5 was not found. An approximate best match of Sandreas.Files 1.0.0 was resolved.
tone/tone/DependencyInjection/TypeRegistrar.cs(23,9): warning IL2067: 'implementationType' argument does not satisfy 'DynamicallyAccessedMemberTypes.PublicConstructors' in call to 'Microsoft.Extensions.DependencyInjection.ServiceCollectionServiceExtensions.AddSingleton(IServiceCollection, Type, Type)'. The parameter 'implementation' of method 'tone.DependencyInjection.TypeRegistrar.Register(Type, Type)' does not have matching annotations. The source value must declare at least the same requirements as those declared on the target location it is assigned to. [tone/tone/tone.csproj]
tone/tone/Common/Extensions/Object/ObjectExtensions.cs(41,16): warning IL2090: 'this' argument does not satisfy 'DynamicallyAccessedMemberTypes.PublicProperties' in call to 'System.Type.GetProperties()'. The generic parameter 'T' of 'tone.Common.Extensions.Object.ObjectExtensions.GetProperties<T>(T)' does not have matching annotations. The source value must declare at least the same requirements as those declared on the target location it is assigned to. [tone/tone/tone.csproj]
tone/tone/Services/DirectoryLoaderService.cs(40,50): error CS1061: 'FileWalker' does not contain a definition for 'FileSystem' and no accessible extension method 'FileSystem' accepting a first argument of type 'FileWalker' could be found (are you missing a using directive or an assembly reference?) [tone/tone/tone.csproj]
tone/tone/Services/DirectoryLoaderService.cs(75,35): error CS1503: Argument 1: cannot convert from 'string' to 'System.IO.Abstractions.IFileInfo' [tone/tone/tone.csproj]
tone/tone/Services/DirectoryLoaderService.cs(77,41): error CS1061: 'FileWalker' does not contain a definition for 'FileSystem' and no accessible extension method 'FileSystem' accepting a first argument of type 'FileWalker' could be found (are you missing a using directive or an assembly reference?) [tone/tone/tone.csproj]
6 Warning(s)
3 Error(s)
Time Elapsed 00:00:00.73
Ich geh mal davon aus, daß das zunächst an der unbeschränkten global.json liegt und daß ein passender Tools-Eintrag dort schon helfen würde, hab es aber auch nicht weiter verfolgt, sorry.