Files
ersatztv/ErsatzTV/ErsatzTV.csproj
T
f2d0a36ed6
Build ErsatzTV Image / Build & test (.NET) (push) Successful in 2m19s
Build ErsatzTV Image / Build & push image (amd64) (push) Successful in 4m31s
build: adopt static-analysis packs at suggestion (#15, increment 1)
Add Roslynator, SonarAnalyzer.CSharp, Meziantou.Analyzer, and AsyncFixer as central
analyzer references (Directory.Build.targets, CPM-versioned, guarded on
ManagePackageVersionsCentrally so the gitignored .mcp tool isn't affected).
.editorconfig defaults dotnet_analyzer_diagnostic.severity to `suggestion` so the packs
surface findings without failing the TreatWarningsAsErrors (TWAE) build; rules are
promoted to warning/error incrementally (promotion = enforcement via the existing TWAE
build, so no separate lint step is needed).

StyleCop.Analyzers is intentionally excluded: its latest stable (1.1.118) crashes
(AD0001) on C# records and overlaps the existing .editorconfig/Roslynator.

Blazor .razor: editorconfig severity overrides don't reach analyzer diagnostics in Razor
@code (source-generator limitation; dotnet format can't fix them either), so the
currently-firing SonarAnalyzer rules are temporarily NoWarn-ed in ErsatzTV.csproj and
burned down rule-by-rule in #25. The same rules run at suggestion on .cs.

Formatting normalization (mixed UTF-8 BOM + whitespace) is deferred to its own PR.

Full-solution Release build green (0 errors, 0 warnings).

Refs #15

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-27 07:37:15 +00:00

173 lines
9.8 KiB
XML

<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<TypeScriptCompileBlocked>true</TypeScriptCompileBlocked>
<TypeScriptToolsVersion>Latest</TypeScriptToolsVersion>
<IsPackable>false</IsPackable>
<ImplicitUsings>enable</ImplicitUsings>
<NoWarn>VSTHRD200,CA1873</NoWarn>
<!-- ersatztv#25: SonarAnalyzer findings in Blazor .razor @code can't be downgraded via
.editorconfig (Razor source-generator limitation), so under TreatWarningsAsErrors they
would break the build. Temporarily suppressed here; the #25 burn-down removes each ID
as its .razor findings are fixed. (These same rules run at `suggestion` on .cs via
.editorconfig — visible, non-blocking.) -->
<NoWarn>$(NoWarn);S6966;S3267;S2325;S3260;S2094;S3458;S3358;S6667;S125;S1135;S1751;S1125;S1066;S127;S927;S6610;S6580;S5693;S3440;S2933;S1871</NoWarn>
<IncludeAllContentForSelfExtract>true</IncludeAllContentForSelfExtract>
<Configurations>Debug;Release;Debug No Sync</Configurations>
<Platforms>AnyCPU</Platforms>
<UserSecretsId>bf31217d-f4ec-4520-8cc3-138059044ede</UserSecretsId>
<AnalysisLevel>latest-Recommended</AnalysisLevel>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<RequiresAspNetWebAssets>true</RequiresAspNetWebAssets>
<NeutralLanguage>en-US</NeutralLanguage>
</PropertyGroup>
<PropertyGroup>
<OpenApiDocumentsDirectory>$(MSBuildProjectDirectory)\wwwroot\openapi</OpenApiDocumentsDirectory>
<OpenApiGenerateDocumentsOnBuild>false</OpenApiGenerateDocumentsOnBuild>
</PropertyGroup>
<Target Name="RenameOpenApiFiles" AfterTargets="GenerateOpenApiDocuments">
<Move SourceFiles="$(OpenApiDocumentsDirectory)\ErsatzTV.json" DestinationFiles="$(OpenApiDocumentsDirectory)\v1.json" />
<Move SourceFiles="$(OpenApiDocumentsDirectory)\ErsatzTV_scripted-schedule.json" DestinationFiles="$(OpenApiDocumentsDirectory)\scripted-schedule.json" />
<Move SourceFiles="$(OpenApiDocumentsDirectory)\ErsatzTV_scripted-schedule-tagged.json" DestinationFiles="$(OpenApiDocumentsDirectory)\scripted-schedule-tagged.json" />
</Target>
<ItemGroup>
<!-- <PackageReference Include="EntityFrameworkProfiler.Appender" /> -->
<PackageReference Include="Blazored.FluentValidation" />
<PackageReference Include="BlazorSortable" />
<PackageReference Include="Chronic.Core" />
<PackageReference Include="FluentValidation" />
<PackageReference Include="FluentValidation.AspNetCore" />
<PackageReference Include="Heron.MudCalendar" />
<PackageReference Include="HtmlSanitizer" />
<PackageReference Include="LanguageExt.Core" />
<PackageReference Include="Markdig" />
<PackageReference Include="MediatR.Courier.DependencyInjection" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" />
<PackageReference Include="Microsoft.AspNetCore.OpenApi" />
<PackageReference Include="Microsoft.AspNetCore.SpaServices.Extensions" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.Extensions.ApiDescription.Server">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="MudBlazor" />
<PackageReference Include="NaturalSort.Extension" />
<PackageReference Include="Refit.HttpClientFactory" />
<PackageReference Include="Scalar.AspNetCore" />
<PackageReference Include="Serilog" />
<PackageReference Include="Serilog.AspNetCore" />
<PackageReference Include="Serilog.Settings.Configuration" />
<PackageReference Include="VueCliMiddleware" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\ErsatzTV.Application\ErsatzTV.Application.csproj" />
<ProjectReference Include="..\ErsatzTV.Core\ErsatzTV.Core.csproj" />
<ProjectReference Include="..\ErsatzTV.Infrastructure.MySql\ErsatzTV.Infrastructure.MySql.csproj" />
<ProjectReference Include="..\ErsatzTV.Infrastructure.Sqlite\ErsatzTV.Infrastructure.Sqlite.csproj" />
<ProjectReference Include="..\ErsatzTV.Infrastructure\ErsatzTV.Infrastructure.csproj" />
<ProjectReference Include="..\ErsatzTV.Core.Nullable\ErsatzTV.Core.Nullable.csproj" />
<ProjectReference Include="..\ErsatzTV.Scanner\ErsatzTV.Scanner.csproj" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Resources\Fonts\Sen.ttf" />
<EmbeddedResource Include="Resources\_background.png" />
<EmbeddedResource Include="Resources\Fonts\OPTIKabel-Heavy.otf" />
<EmbeddedResource Include="Resources\Fonts\Roboto-Regular.ttf" />
<EmbeddedResource Include="Resources\Scripts\_threePartEpisodes.js" />
<EmbeddedResource Include="Resources\Scripts\_episode.js" />
<EmbeddedResource Include="Resources\Scripts\_movie.js" />
<EmbeddedResource Include="Resources\Scripts\MpegTs\run.sh" />
<EmbeddedResource Include="Resources\Scripts\MpegTs\run.bat" />
<EmbeddedResource Include="Resources\Scripts\MpegTs\mpegts.yml" />
<EmbeddedResource Include="Resources\_song_album_cover_512.png" />
<EmbeddedResource Include="Resources\_song_background_1.png" />
<EmbeddedResource Include="Resources\_song_background_2.png" />
<EmbeddedResource Include="Resources\_song_background_3.png" />
<EmbeddedResource Include="Resources\song_progress_overlay.png" />
<EmbeddedResource Include="Resources\song_progress_overlay_43.png" />
<EmbeddedResource Include="Resources\ErsatzTV.png" />
<EmbeddedResource Include="Resources\ISO-639-2_utf-8.txt" />
<EmbeddedResource Include="Resources\Templates\_default.ass.sbntxt" />
<EmbeddedResource Include="Resources\Templates\_ArtistTitle_LeftMiddle.sbntxt" />
<EmbeddedResource Include="Resources\Templates\_ArtistTitleAlbum_CenterTop.sbntxt" />
<EmbeddedResource Include="Resources\Templates\_channel.sbntxt" />
<EmbeddedResource Include="Resources\Templates\_episode.sbntxt" />
<EmbeddedResource Include="Resources\Templates\_movie.sbntxt" />
<EmbeddedResource Include="Resources\Templates\_musicVideo.sbntxt" />
<EmbeddedResource Include="Resources\Templates\_otherVideo.sbntxt" />
<EmbeddedResource Include="Resources\Templates\_song.sbntxt" />
<EmbeddedResource Include="Resources\sequential-schedule-import.schema.json" />
<EmbeddedResource Include="Resources\sequential-schedule.schema.json" />
<EmbeddedResource Include="Resources\empty.sqlite3" />
<EmbeddedResource Include="Resources\test.avs" />
<EmbeddedResource Include="Resources\Templates\_remoteStream.sbntxt" />
<EmbeddedResource Update="Locals\Shared\MainLayout.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>MainLayout.Designer.cs</LastGenOutput>
</EmbeddedResource>
<EmbeddedResource Update="Locals\Pages\Channels.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Channels.Designer.cs</LastGenOutput>
</EmbeddedResource>
<EmbeddedResource Update="Locals\Shared\Common.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Common.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<Content Include="..\artwork\Ersatztv.icns">
<Link>Ersatztv.icns</Link>
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>
<ItemGroup>
<_ContentIncludedByDefault Remove="wwwroot\css\open-iconic\FONT-LICENSE" />
<_ContentIncludedByDefault Remove="wwwroot\css\open-iconic\font\css\open-iconic-bootstrap.min.css" />
<_ContentIncludedByDefault Remove="wwwroot\css\open-iconic\font\fonts\open-iconic.eot" />
<_ContentIncludedByDefault Remove="wwwroot\css\open-iconic\font\fonts\open-iconic.otf" />
<_ContentIncludedByDefault Remove="wwwroot\css\open-iconic\font\fonts\open-iconic.svg" />
<_ContentIncludedByDefault Remove="wwwroot\css\open-iconic\font\fonts\open-iconic.ttf" />
<_ContentIncludedByDefault Remove="wwwroot\css\open-iconic\font\fonts\open-iconic.woff" />
<_ContentIncludedByDefault Remove="wwwroot\css\open-iconic\ICON-LICENSE" />
<_ContentIncludedByDefault Remove="wwwroot\css\open-iconic\README.md" />
</ItemGroup>
<ItemGroup>
<Compile Update="Locals\Shared\MainLayout.Designer.cs">
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
<DependentUpon>MainLayout.resx</DependentUpon>
</Compile>
<Compile Update="Locals\Pages\Channels.Designer.cs">
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
<DependentUpon>Channels.resx</DependentUpon>
</Compile>
<Compile Update="Locals\Shared\Common.Designer.cs">
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
<DependentUpon>Common.resx</DependentUpon>
</Compile>
</ItemGroup>
<ProjectExtensions>
<VisualStudio>
<UserProperties client-app_4package_1json__JsonSchema="https://json.schemastore.org/phraseapp.json" />
</VisualStudio>
</ProjectExtensions>
</Project>