ANcpLua.NET.Sdk.Test
1.1.7
See the version list below for details.
dotnet add package ANcpLua.NET.Sdk.Test --version 1.1.7
NuGet\Install-Package ANcpLua.NET.Sdk.Test -Version 1.1.7
<PackageReference Include="ANcpLua.NET.Sdk.Test" Version="1.1.7" />
<PackageVersion Include="ANcpLua.NET.Sdk.Test" Version="1.1.7" />
<PackageReference Include="ANcpLua.NET.Sdk.Test" />
paket add ANcpLua.NET.Sdk.Test --version 1.1.7
#r "nuget: ANcpLua.NET.Sdk.Test, 1.1.7"
#:package ANcpLua.NET.Sdk.Test@1.1.7
#addin nuget:?package=ANcpLua.NET.Sdk.Test&version=1.1.7
#tool nuget:?package=ANcpLua.NET.Sdk.Test&version=1.1.7
ANcpLua.NET.Sdk
MSBuild SDK with opinionated defaults for .NET projects. Inspired by Meziantou.NET.Sdk.
SDKs
| SDK | Base SDK | Use For |
|---|---|---|
ANcpLua.NET.Sdk |
Microsoft.NET.Sdk |
Libraries, Console Apps, Workers, Unit Tests |
ANcpLua.NET.Sdk.Web |
Microsoft.NET.Sdk.Web |
Web APIs, ASP.NET Core, Integration Tests |
Installation
Replace your SDK reference:
<Project Sdk="ANcpLua.NET.Sdk/1.1.2"></Project>
<Project>Sdk="ANcpLua.NET.Sdk.Web/1.1.2"</Project>
Or use global.json for centralized version management:
{
"msbuild-sdks": {
"ANcpLua.NET.Sdk": "1.1.2",
"ANcpLua.NET.Sdk.Web": "1.1.2"
}
}
Then reference without version:
<Project Sdk="ANcpLua.NET.Sdk"></Project>
Working Features
Banned API Analyzer (RS0030)
Enforces best practices via BannedSymbols.txt:
| Banned | Use Instead |
|---|---|
DateTime.Now/UtcNow |
TimeProvider.System.GetUtcNow() |
DateTimeOffset.Now/UtcNow |
TimeProvider.System.GetUtcNow() |
ArgumentNullException.ThrowIfNull |
Native .NET 6+ API (polyfilled) |
Enumerable.Any(predicate) |
List<T>.Exists() |
Enumerable.FirstOrDefault(predicate) |
List<T>.Find() |
InvariantCulture comparisons |
Ordinal |
System.Tuple |
ValueTuple |
Math.Round (no rounding mode) |
Overload with MidpointRounding |
| Local time file APIs | UTC variants |
| Newtonsoft.Json | System.Text.J son |
ANcpLua.Analyzers (Bundled)
| Rule | Description |
|---|---|
| QYL0001 | lock keyword → Use Lock.EnterScope() (.NET 9+) |
| QYL0002 | Deprecated OTel GenAI attributes → Use OTel 1.38 names |
Extensions (Auto-Enabled by Default)
| Property | Description | Default |
|---|---|---|
GenerateClaudeMd |
Auto-generates CLAUDE.md linking to repo root |
true |
InjectSharedThrow |
Injects Throw.IfNull() guard clause helper |
true |
IncludeDefaultBannedSymbols |
Include BannedSymbols.txt | true |
BanNewtonsoftJsonSymbols |
Ban Newtonsoft.Json direct usage | true |
Extensions (Opt-in)
| Property | Description | Default |
|---|---|---|
InjectStringOrdinalComparer |
Injects internal StringOrdinalComparer |
false |
InjectFakeLogger |
Injects FakeLoggerExtensions (requires FakeLogCollector) |
false |
InjectSourceGenHelpers |
Injects Roslyn symbol extensions | false |
Polyfills (Opt-in for Legacy TFMs)
| Property | Description | Default |
|---|---|---|
InjectLockPolyfill |
Injects System.Threading.Lock (net8.0 backport) |
false |
InjectTimeProviderPolyfill |
Injects System.TimeProvider |
false |
InjectIndexRangeOnLegacy |
Injects Index and Range types |
false |
InjectIsExternalInitOnLegacy |
Injects IsExternalInit (for records) |
false |
InjectTrimAttributesOnLegacy |
Injects trimming attributes (e.g. DynamicallyAccessedMembers) |
false |
InjectNullabilityAttributesOnLegacy |
Injects nullability attributes (e.g. AllowNull) |
false |
InjectRequiredMemberOnLegacy |
Injects RequiredMemberAttribute |
false |
InjectCompilerFeatureRequiredOnLegacy |
Injects CompilerFeatureRequiredAttribute |
false |
InjectCallerAttributesOnLegacy |
Injects CallerArgumentExpressionAttribute |
false |
InjectUnreachableExceptionOnLegacy |
Injects UnreachableException |
false |
InjectExperimentalAttributeOnLegacy |
Injects ExperimentalAttribute |
false |
InjectParamCollectionOnLegacy |
Injects ParamCollectionAttribute |
false |
InjectStackTraceHiddenOnLegacy |
Injects StackTraceHiddenAttribute |
false |
InjectThrowPolyfillsOnLegacy |
Injects C# 14 ThrowPolyfills (extension members) | false |
C# 14 Extension Member Polyfills
Modern throw helpers using C# 14 extension(Type) syntax. Available on all targets:
// .NET 6+ style APIs - work everywhere!
ArgumentNullException.ThrowIfNull(myArg);
ArgumentException.ThrowIfNullOrEmpty(myString);
ArgumentException.ThrowIfNullOrWhiteSpace(myString);
ArgumentOutOfRangeException.ThrowIfNegative(count);
ArgumentOutOfRangeException.ThrowIfZero(count);
ArgumentOutOfRangeException.ThrowIfNegativeOrZero(count);
ArgumentOutOfRangeException.ThrowIfGreaterThan(value, max);
ArgumentOutOfRangeException.ThrowIfLessThan(value, min);
ObjectDisposedException.ThrowIf(isDisposed, this);
Configuration
| Property | Default | Description |
|---|---|---|
GenerateClaudeMd |
true |
Generate CLAUDE.md for AI assistants |
InjectSharedThrow |
true |
Inject Throw.IfNull() guard clauses |
IncludeDefaultBannedSymbols |
true |
Include BannedSymbols.txt |
BanNewtonsoftJsonSymbols |
true |
Ban Newtonsoft.Json direct usage |
EnableDefaultTestSettings |
true |
Auto-configure test runner |
EnableCodeCoverage |
true (CI) |
Enable coverage |
Web Service Defaults (Auto-Registered for Web Projects)
When using Microsoft.NET.Sdk.Web, the SDK automatically adds Aspire 13.0-compatible service defaults:
| Feature | Description |
|---|---|
| OpenTelemetry | Logging, Metrics (ASP.NET, HTTP, Runtime), Tracing with OTLP export |
| Health Checks | /health (readiness) and /alive (liveness) endpoints |
| Service Discovery | Microsoft.Extensions.ServiceDiscovery enabled |
| HTTP Resilience | Standard resilience handlers with retries and circuit breakers |
Opt-out: <AutoRegisterServiceDefaults>false</AutoRegisterServiceDefaults>
Running Tests Correctly
The test suite simulates an environment where the SDK is packed and consumed. To avoid performance issues caused by parallel tests trying to repack the SDK simultaneously, use the following command:
# 1. Ensure artifacts are built (if running for the first time)
# Note: The test fixture will auto-build if artifacts/nuget is empty,
# but for optimal performance, set up the environment variables.
# 2. Run tests pointing to the artifacts directory
export CI=true
export NUGET_DIRECTORY="$(pwd)/artifacts/nuget"
dotnet test tests/ANcpLua.Sdk.Tests
License
MIT
Credits
- Inspired by Meziantou.NET.Sdk by Gérald Barré
- ServiceDefaults pattern from .NET Aspire
Learn more about Target Frameworks and .NET Standard.
This package has no dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.6.2 | 29 | 1/10/2026 |
| 1.6.1 | 35 | 1/10/2026 |
| 1.6.0 | 35 | 1/9/2026 |
| 1.5.1 | 61 | 1/8/2026 |
| 1.5.0 | 87 | 1/2/2026 |
| 1.4.2 | 79 | 1/1/2026 |
| 1.4.1 | 78 | 1/1/2026 |
| 1.4.0 | 78 | 1/1/2026 |
| 1.3.31 | 29 | 1/9/2026 |
| 1.3.30 | 33 | 1/9/2026 |
| 1.3.29 | 37 | 1/9/2026 |
| 1.3.28 | 38 | 1/9/2026 |
| 1.3.27 | 37 | 1/9/2026 |
| 1.3.26 | 36 | 1/9/2026 |
| 1.3.25 | 38 | 1/9/2026 |
| 1.3.24 | 32 | 1/9/2026 |
| 1.3.23 | 74 | 1/6/2026 |
| 1.3.22 | 78 | 1/6/2026 |
| 1.3.20 | 79 | 1/2/2026 |
| 1.3.19 | 83 | 1/2/2026 |
| 1.3.18 | 84 | 1/1/2026 |
| 1.3.17 | 80 | 1/1/2026 |
| 1.3.16 | 81 | 12/31/2025 |
| 1.3.15 | 80 | 12/31/2025 |
| 1.3.14 | 78 | 12/31/2025 |
| 1.3.13 | 79 | 12/31/2025 |
| 1.3.10 | 77 | 12/31/2025 |
| 1.3.9 | 79 | 12/31/2025 |
| 1.3.8 | 83 | 12/30/2025 |
| 1.3.7 | 80 | 12/30/2025 |
| 1.3.6 | 83 | 12/30/2025 |
| 1.3.5 | 80 | 12/30/2025 |
| 1.3.4 | 85 | 12/30/2025 |
| 1.3.3 | 81 | 12/30/2025 |
| 1.3.2 | 86 | 12/30/2025 |
| 1.3.1 | 76 | 12/30/2025 |
| 1.3.0 | 82 | 12/30/2025 |
| 1.2.4 | 90 | 12/29/2025 |
| 1.2.3 | 87 | 12/29/2025 |
| 1.2.2 | 93 | 12/29/2025 |
| 1.2.1 | 179 | 12/25/2025 |
| 1.2.0 | 173 | 12/24/2025 |
| 1.1.8 | 265 | 12/16/2025 |
| 1.1.7 | 260 | 12/16/2025 |