Compare commits

..
41 Commits
Author SHA1 Message Date
akritikos 1912484334 🔧 Updates GitVersion configuration to enhance branch management and increment strategies 2026-10-27 20:57:46 +02:00
akritikos f4c843b9f7 🔧 Updates C# documentation guidelines for comments and logging practices 2026-09-07 22:00:11 +03:00
akritikos eee54a4a36 🔥 Removes increment prevention on merges
It suppresses the increment that a merged feature/hotfix branch contributes, freezing main's version on every merge.
2026-08-30 03:07:54 +03:00
akritikos 70a0eeec33 📌 Switches versioning to trunk-based development 2026-08-30 02:38:40 +03:00
akritikos 3b31cbcb14 📌 Updates versioning calculation 2026-08-30 02:29:30 +03:00
akritikos 0d7d18fae0 🔧 Sanitizes assembly names 2026-08-28 23:35:14 +03:00
akritikos 243a3ce519 🔧 Replaces ineffective merge drivers with EOL normalisation
merge=upstream-wins named a driver that is not built in and is not
defined in any git config, so git silently fell back to the default
3-way merge. Custom merge drivers live in .git/config and cannot be
distributed via .gitattributes, so downstream clones never had it.

merge=union on Directory.Packages.props silently produced duplicate
PackageVersion entries when both sides changed the same Include,
which NuGet rejects at build time with no conflict to review.

No tracked blob is stored with CRLF, so text=auto is a no-op for
existing content and only guards future contributions.
2026-08-28 20:10:29 +03:00
akritikos f975b7a41f 📝 Documents changelog generation in the release skill 2026-08-28 20:08:42 +03:00
akritikos be09aef8a3 📌 Aligns versioning to GitHubFlow 2026-08-27 19:12:47 +03:00
akritikos 406af21694 🚨 Removes documentation hard requirement from samples & tests 2026-08-27 05:18:38 +03:00
akritikos d7b610d6f5 🙈 Excludes Copilot tracking folder (HVE R-P-I loop) 2026-08-26 23:17:26 +03:00
akritikos 4d05e08d98 🚚 Copies OpenAPI Documents for automated generation of API Clients using Refitter 2026-08-26 23:17:04 +03:00
akritikos fdbf44149a 🔖 Adds seperate versioning instructions to release skill 2026-08-26 22:48:23 +03:00
akritikos 88b3e5c661 🧱 Ensures changelog file is generated before packing 2026-08-26 22:45:56 +03:00
akritikos 96696ab2bb 📌 Allows each library to maintain their own version 2026-08-26 22:45:23 +03:00
akritikos 569fdd8053 🗑️ Disables versioned hierarchical nuget output 2026-08-26 22:38:18 +03:00
akritikos 5f7dc55e66 🔧 Updates copilot instructions 2026-08-26 22:38:18 +03:00
akritikos 661908bcea 🔧 Moves CLS Compliance to target file so it can be evaluated 2026-08-26 22:38:18 +03:00
akritikos 9b27bbdc37 ⬆️ Updates template dependencies 2026-08-26 22:38:17 +03:00
akritikos 7bc86d8a34 🔧 Ensures OpenAPI documents are named consistently 2026-08-26 22:38:17 +03:00
akritikos 4095d6385b 🚨 Sanitizes warnings 2026-08-26 22:38:17 +03:00
akritikos bd50907471 🤖 Adds some more strict rails for handling .NET projects 2026-08-26 22:38:16 +03:00
akritikos eea4ce7a0e ✨ Updates API, C#, Docker, MSBuild, and Testing guidelines
Refines conventions for ASP.NET API endpoints, C# documentation,
Docker build arguments, MSBuild package management, and testing
method naming and structure. These changes aim to enhance clarity
and enforce best practices across the codebase.
2026-08-26 22:38:16 +03:00
akritikos b169a233ed 🔧 Removes default internals visibility for test projects
Eliminates the automatic exposure of assembly internals to
test projects when no friend assemblies are declared,
streamlining the handling of internals visibility.
2026-08-26 22:38:16 +03:00
akritikos b34dffe5f2 ✨ Removes double-BOM 2026-08-26 22:38:16 +03:00
akritikos 5d109c31aa 🚨 Update .editorconfig and .globalconfig for improved C# coding standards
Refactor coding conventions in .editorconfig and .globalconfig to
enhance code quality and maintainability. This includes organizing
usings, modifying naming conventions, and adjusting various C#
style preferences.
2026-08-26 22:38:15 +03:00
akritikosandCopilot 0cc34f7b4b ✨ Add skills for EF migrations and new ADR creation
Introduces new skills for managing Entity Framework Core migrations
and creating Architectural Decision Records (ADRs). These skills
provide structured guidance for users to document architectural
decisions and manage database migrations effectively.

Co-authored-by: Copilot <copilot@github.com>
2026-08-26 22:38:15 +03:00
akritikos f5ce51d854 ✨ Adds new prompts for auditing, converting controllers, and logging
Introduces several new markdown prompt files to enhance the
repository's capabilities. These include instructions for auditing
files, converting MVC controllers to Minimal API endpoints, and
refactoring inline logger calls to use LoggerMessage-generated
methods. This improves code quality and aligns with project
conventions.
2026-08-26 22:38:15 +03:00
akritikosandCopilot 0f5eab59a8 ✨ Adds documentation instructions for ADR, analyzers, and observability
Introduces new markdown files detailing editing rules for ADRs,
guidelines for analyzer and style configuration, and best practices
for observability and feature flags. These documents aim to ensure
consistency and clarity in project documentation and code quality.

Co-authored-by: Copilot <copilot@github.com>
2026-08-26 22:38:15 +03:00
akritikos 57062f7bea 📝 Updates C# and MSBuild instructions for clarity 2026-08-26 22:38:14 +03:00
akritikos c80a6fbe58 📝 Updates generic copilot instructions 2026-08-26 22:38:14 +03:00
akritikos 14f84c0300 ✨ Adds project guidelines and conventions for Github Copilot
Introduces detailed instructions for ASP.NET API, C#, Docker, MSBuild,
testing, and library creation. These guidelines aim to standardize
development practices and improve code quality across the project.
2026-08-26 22:38:14 +03:00
akritikos 741b2f0501 ✨ Adds VSCode configuration files for extensions and settings
Introduces new extensions.json and settings.json files to recommend
useful VSCode extensions and configure JSON schemas, word wrap, and
default formatters for XML files. This enhances the development
environment for better productivity and consistency.
2026-08-26 22:38:14 +03:00
akritikos 664d676ab6 🔧 Updates overflow checking behavior for performance
Changes the default setting for CheckForOverflowUnderflow to false
to improve performance during math operations.
2026-08-26 22:38:13 +03:00
akritikos bc4c5de10c 🚨 Updates severity levels for C# compiler diagnostics and code quality analyzers in global configuration 2026-08-26 22:38:13 +03:00
akritikos f51e396bdb ✨ Adds OpenApi Source Generated Interceptors property group with namespaces 2026-08-26 22:38:13 +03:00
akritikos e4fe3d91c2 📝 Makes documentation optional for partial elements in samples & tests 2026-08-26 22:38:12 +03:00
akritikos 780f133885 📝 Makes documentation optional for samples & tests 2026-08-26 22:38:12 +03:00
akritikos 9a8dde4699 ✨ Adds 'main' as a source branch for feature mode in GitVersion configuration 2026-08-26 22:38:12 +03:00
akritikos 94a85e5ba4 ⬆️ Updates GitVersion.MsBuild to version 6.7.0 2026-08-26 22:38:12 +03:00
akritikos 6809901e8d ✨ Adds condition to PackageReference for Microsoft.AspNetCore.OpenApi 2026-08-26 22:38:11 +03:00
18 changed files with 460 additions and 328 deletions

No files matched your search

+164 -1
View File
@@ -13,5 +13,168 @@ end_of_line = lf
[*.{xml,csproj,props,targets,nuspec}] [*.{xml,csproj,props,targets,nuspec}]
max_line_length = 1000 max_line_length = 1000
[{*.Generated.*.cs,**/Migrations/*.cs}] [*.{cs,vb}]
# Organize usings
dotnet_sort_system_directives_first = true
dotnet_separate_import_directive_groups = true
csharp_using_directive_placement = inside_namespace:suggestion
csharp_prefer_simple_using_statement = true:suggestion
csharp_style_namespace_declarations = file_scoped:warning
# this. preferences
dotnet_style_qualification_for_field = false:none
dotnet_style_qualification_for_property = false:none
dotnet_style_qualification_for_method = false:none
dotnet_style_qualification_for_event = false:none
# Language keywords vs BCL types preferences
dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion
dotnet_style_predefined_type_for_member_access = true:suggestion
# Parentheses preferences
dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:silent
dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:silent
dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:silent
dotnet_style_parentheses_in_other_operators = never_if_unnecessary:silent
# Modifier preferences
dotnet_style_require_accessibility_modifiers = for_non_interface_members:suggestion
dotnet_style_readonly_field = true:suggestion
# Expression-level preferences
dotnet_style_object_initializer = true:suggestion
dotnet_style_collection_initializer = true:suggestion
dotnet_style_explicit_tuple_names = true:suggestion
dotnet_style_null_propagation = true:suggestion
dotnet_style_coalesce_expression = true:suggestion
dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion
dotnet_style_prefer_inferred_tuple_names = true:suggestion
dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion
dotnet_style_prefer_auto_properties = true:silent
dotnet_style_prefer_conditional_expression_over_assignment = true:suggestion
dotnet_style_prefer_conditional_expression_over_return = true:suggestion
# var preferences
csharp_style_var_for_built_in_types = true:suggestion
csharp_style_var_when_type_is_apparent = true:suggestion
csharp_style_var_elsewhere = true:suggestion
# Expression-bodied members
csharp_style_expression_bodied_methods = when_on_single_line:suggestion
csharp_style_expression_bodied_constructors = when_on_single_line:suggestion
csharp_style_expression_bodied_operators = when_on_single_line:suggestion
csharp_style_expression_bodied_properties = when_on_single_line:suggestion
csharp_style_expression_bodied_indexers = when_on_single_line:suggestion
csharp_style_expression_bodied_accessors = when_on_single_line:suggestion
csharp_style_expression_bodied_lambdas = when_on_single_line:suggestion
csharp_style_expression_bodied_local_functions = when_on_single_line:suggestion
# Pattern matching preferences
csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion
csharp_style_pattern_matching_over_as_with_null_check = true:suggestion
# Null-checking preferences
csharp_style_throw_expression = true:suggestion
csharp_style_conditional_delegate_call = true:suggestion
# Modifier preferences
csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:suggestion
# Expression-level preferences
csharp_prefer_braces = true:none
csharp_style_deconstructed_variable_declaration = true:suggestion
csharp_prefer_simple_default_expression = true:suggestion
csharp_style_pattern_local_over_anonymous_function = true:suggestion
csharp_style_inlined_variable_declaration = true:suggestion
# Unused value preferences
csharp_style_unused_value_expression_statement_preference = discard_variable:none
csharp_style_unused_value_assignment_preference = discard_variable:suggestion
# Index and Range preferences
csharp_style_prefer_index_operator = true:suggestion
csharp_style_prefer_range_operator = true:suggestion
csharp_prefer_static_local_function = true:suggestion
csharp_style_prefer_switch_expression = true:suggestion
# New line preferences
csharp_new_line_before_open_brace = all
csharp_new_line_before_else = true
csharp_new_line_before_catch = true
csharp_new_line_before_finally = true
csharp_new_line_before_members_in_object_initializers = true
csharp_new_line_before_members_in_anonymous_types = true
csharp_new_line_between_query_expression_clauses = true
# Indentation preferences
csharp_indent_case_contents = true
csharp_indent_switch_labels = true
csharp_indent_labels = flush_left
csharp_indent_block_contents = true
csharp_indent_braces = false
csharp_indent_case_contents_when_block = true
# Space preferences
csharp_space_after_cast = false
csharp_space_after_keywords_in_control_flow_statements = true
csharp_space_between_method_call_parameter_list_parentheses = false
csharp_space_between_method_declaration_parameter_list_parentheses = false
csharp_space_between_parentheses = false
csharp_space_before_colon_in_inheritance_clause = true
csharp_space_after_colon_in_inheritance_clause = true
csharp_space_around_binary_operators = before_and_after
csharp_space_between_method_declaration_empty_parameter_list_parentheses = false
csharp_space_between_method_call_name_and_opening_parenthesis = false
csharp_space_between_method_call_empty_parameter_list_parentheses = false
csharp_space_between_method_declaration_name_and_open_parenthesis = false
csharp_space_after_comma = true
csharp_space_before_comma = false
csharp_space_after_dot = false
csharp_space_before_dot = false
csharp_space_after_semicolon_in_for_statement = true
csharp_space_before_semicolon_in_for_statement = false
csharp_space_around_declaration_statements = false
csharp_space_before_open_square_brackets = false
csharp_space_between_empty_square_brackets = false
csharp_space_between_square_brackets = false
# Wrapping preferences
csharp_preserve_single_line_statements = true
csharp_preserve_single_line_blocks = true
# ReSharper/Rider custom properties (only honoured in .editorconfig, not .globalconfig)
# Inspection severities
resharper_class_never_instantiated_global_highlighting = none
resharper_class_never_instantiated_local_highlighting = none
resharper_convert_to_primary_constructor_highlighting = none
resharper_cognitive_complexity_threshold = 20
# Blank lines
resharper_blank_lines_around_region = 0
resharper_blank_lines_before_single_line_comment = 1
# Line breaks
resharper_new_line_before_while = true
resharper_place_accessor_attribute_on_same_line = never
resharper_place_accessorholder_attribute_on_same_line = never
resharper_place_field_attribute_on_same_line = never
resharper_wrap_before_binary_opsign = true
resharper_wrap_chained_method_calls = chop_if_long
resharper_wrap_linq_expressions = chop_always
resharper_wrap_ternary_expr_style = chop_always
# Spaces, alignment and usings
resharper_space_within_single_line_array_initializer_braces = true
resharper_alignment_tab_fill_style = use_spaces
resharper_qualified_using_at_nested_scope = true
# Naming (consolidated here from DotSettings + .globalconfig so Roslyn and Rider both enforce).
# Order matters: const and static-readonly fields are PascalCase and must be listed before
# the private-field camelCase rule so they are matched first (mirrors ReSharper's groups).
dotnet_naming_rule.constant_fields_should_be_pascal_case.severity = warning
dotnet_naming_rule.constant_fields_should_be_pascal_case.symbols = constant_fields
dotnet_naming_rule.constant_fields_should_be_pascal_case.style = pascal_case_style
dotnet_naming_symbols.constant_fields.applicable_kinds = field
dotnet_naming_symbols.constant_fields.applicable_accessibilities = *
dotnet_naming_symbols.constant_fields.required_modifiers = const
dotnet_naming_style.pascal_case_style.capitalization = pascal_case
dotnet_naming_rule.static_readonly_fields_should_be_pascal_case.severity = warning
dotnet_naming_rule.static_readonly_fields_should_be_pascal_case.symbols = static_readonly_fields
dotnet_naming_rule.static_readonly_fields_should_be_pascal_case.style = pascal_case_style
dotnet_naming_symbols.static_readonly_fields.applicable_kinds = field
dotnet_naming_symbols.static_readonly_fields.applicable_accessibilities = private
dotnet_naming_symbols.static_readonly_fields.required_modifiers = static,readonly
dotnet_naming_rule.private_fields_should_be_camel_case.severity = warning
dotnet_naming_rule.private_fields_should_be_camel_case.symbols = private_fields
dotnet_naming_rule.private_fields_should_be_camel_case.style = camel_case_style
dotnet_naming_symbols.private_fields.applicable_kinds = field
dotnet_naming_symbols.private_fields.applicable_accessibilities = private
dotnet_naming_style.camel_case_style.capitalization = camel_case
[*.vb]
# Modifier preferences
visual_basic_preferred_modifier_order = Partial,Default,Private,Protected,Public,Friend,NotOverridable,Overridable,MustOverride,Overloads,Overrides,MustInherit,NotInheritable,Static,Shared,Shadows,ReadOnly,WriteOnly,Dim,Const,WithEvents,Widening,Narrowing,Custom,Async:suggestion
[{*.Generated.*.cs,**/Migrations/*.cs,**/*ModelSnapshot.cs}]
generated_code = true generated_code = true
[{tests,samples}/**/*.cs]
dotnet_diagnostic.CS1591.severity = none
+3 -2
View File
@@ -1,2 +1,3 @@
Directory.Packages.props merge=union * text=auto
Directory.Packages.template.props merge=upstream-wins *.png binary
*.cs diff=csharp
+5
View File
@@ -9,6 +9,11 @@ You are a senior software engineer and solution architect. Prioritize correctnes
- When ambiguous or multiple approaches exist, **ask clarifying questions with 2–4 predefined options** (include trade-offs). Only proceed silently when intent is obvious. - When ambiguous or multiple approaches exist, **ask clarifying questions with 2–4 predefined options** (include trade-offs). Only proceed silently when intent is obvious.
- Briefly explain every suggestion: what it does, why, and how it fits the architecture. - Briefly explain every suggestion: what it does, why, and how it fits the architecture.
- When goals conflict (e.g., performance vs readability), **favour performance** unless readability is significantly harmed. - When goals conflict (e.g., performance vs readability), **favour performance** unless readability is significantly harmed.
- **Persist learnings** — when you discover a pattern, resolve a non-obvious issue, or make a decision worth remembering, save it to memory. Use repo memory for project-specific facts and user memory for general preferences. Keep memory up to date when instructions or project conventions change.
## Build & test
- Always build and test the entire solution (pass the solution slnx as a parameter to `dotnet build` and `dotnet test`).
## Documentation ## Documentation
@@ -10,11 +10,17 @@ description: "Use when writing API endpoints, routing, middleware, request/respo
## Endpoints ## Endpoints
- Prefer **Minimal APIs**; use Controllers only when the added structure is justified. - Prefer **Minimal APIs**; use Controllers only when the endpoint group requires action filters, model binding customisation, or exceeds 10 endpoints sharing significant cross-cutting logic.
- Group related endpoints using `MapGroup()` with a shared prefix and tag. - Group related endpoints using `MapGroup()` with a shared prefix and tag.
- Use **typed results** (`TypedResults.Ok()`, `TypedResults.NotFound()`) over untyped `Results` for OpenAPI metadata inference. - Use **typed results** (`TypedResults.Ok()`, `TypedResults.NotFound()`) over untyped `Results` for OpenAPI metadata inference.
- Return **`ProblemDetails`** (RFC 9457) for all error responses — configure via `AddProblemDetails()`. - Return **`ProblemDetails`** (RFC 9457) for all error responses — configure via `AddProblemDetails()`.
## Authorisation
- Apply `.RequireAuthorization()` at the group level for protected resources.
- Reference policy names through `const string` fields on a shared static class (e.g., `.RequireAuthorization(AuthorizationPolicies.RequireAdminRole)`) instead of inline string literals.
- Mark public endpoints explicitly with `.AllowAnonymous()`.
## Request Handling ## Request Handling
- Bind request data with **`[AsParameters]`** for complex parameter sets. - Bind request data with **`[AsParameters]`** for complex parameter sets.
+14 -3
View File
@@ -8,11 +8,22 @@ Code style is enforced by `.editorconfig`, `.globalconfig`, and StyleCop analyze
## Non-Obvious Defaults ## Non-Obvious Defaults
- XML doc comments required on public API in `src/` (suppressed in `tests/` and `samples/`). - XML doc comments required on all `public` and `protected` members in `src/` (suppressed in `tests/` and `samples/`).
- Avoid `null!` (null-forgiving operator) — fix the nullability flow instead of suppressing the warning. - Avoid `null!` (null-forgiving operator) — fix the nullability flow instead of suppressing the warning.
## Comments
Applies to `src/`. Tests keep the guidance in the testing instructions.
- **No comments inside member bodies.** Anything worth saying goes in an XML doc comment on the member that says it.
- Document `private` and `internal` members — the analyzers only *require* docs on exposed elements, they do not object to more. Put the "why" in `<remarks>`.
- If the explanation is about one statement rather than the whole member, extract that statement into a named private method and document that instead.
- For logic inside lambdas or local functions where an XML doc comment is not applicable, extract the logic into a named private method and document that method instead.
- Never state what the code already shows, and never narrate history — a past bug, a change, or an answer to a reviewer belongs in the commit message, where it cannot go stale.
- Sole exception: the justification required beside a narrow analyzer suppression, which has nowhere else to live.
## Patterns ## Patterns
- Prefer **records** for DTOs, value objects, and other immutable data carriers. - Prefer **records** for DTOs, value objects, and other immutable data carriers.
- Use `LoggerMessage`-generated `partial` methods on a `partial class` — never log inline (e.g., `logger.LogInformation(…)`). - Use `LoggerMessage`-generated `partial` methods on a `partial class` — never log inline (e.g., `logger.LogInformation(…)`). Do not make existing types partial without explicit user sign-off. Do not fall back to inline logging.
- If a type cannot be made partial (no user sign-off obtained), do not modify its logging calls — surface the conflict to the user and wait for instruction rather than silently falling back to inline logging. Present at least these options: (1) make the type `partial`; (2) move the `LoggerMessage` methods to a separate type — group reusable messages in one shared class, and keep the rest in a per-type class.
+2 -2
View File
@@ -16,11 +16,11 @@ applyTo: "docker/**,compose*.yaml"
## Build Args ## Build Args
- `RUNTIME_BASE`: `web` (ASP.NET), `app` (console), or `self-contained` - `RUNTIME_BASE`: `web` (ASP.NET), `app` (console), or `self-contained`. If a use case does not match `web`, `app`, or `self-contained`, do not invent a new `RUNTIME_BASE` value — flag this to the user and ask which existing value best fits their scenario.
- `CONFIGURATION`: `Release` (default) or `Debug` - `CONFIGURATION`: `Release` (default) or `Debug`
- `PUBLISHED_PROJECT`: Project name to publish (without path or extension) - `PUBLISHED_PROJECT`: Project name to publish (without path or extension)
- `DATABASE_PROJECT`: EF Core project for migration bundles - `DATABASE_PROJECT`: EF Core project for migration bundles
- `DBCONTEXT`: Optional DbContext name for migrations - `DBCONTEXT`: Optional DbContext name for migrations. If omitted, the migration bundle step must not pass `--context`; EF Core auto-discovers the single DbContext in `DATABASE_PROJECT`.
## Image Selection ## Image Selection
+7 -1
View File
@@ -6,7 +6,9 @@ applyTo: "**/*.{csproj,props,targets}"
## Central Package Management ## Central Package Management
All package versions are declared in `Directory.Packages.props` at the repo root. In `.csproj` files: All package versions are declared in `Directory.Packages.props` at the repo root. In `Directory.Packages.props`, ensure the last child element of the root `<Project>` tag is `<Import Project="Directory.Packages.template.props" />`. `Directory.Packages.template.props` is **READ ONLY**, never edit it. The template provides default `<PackageVersion>` entries; any entry with the same `Include` declared earlier in `Directory.Packages.props` takes precedence over the template default, because MSBuild uses first-definition-wins semantics and the import appears last.
In `.csproj` files:
```xml ```xml
<!-- Correct --> <!-- Correct -->
@@ -22,6 +24,8 @@ To add or update a version, edit `Directory.Packages.props`:
<PackageVersion Include="Newtonsoft.Json" Version="13.0.3" /> <PackageVersion Include="Newtonsoft.Json" Version="13.0.3" />
``` ```
If the package does not exist in the template, simply add a new `<PackageVersion>` entry in `Directory.Packages.props`. No override logic is needed; the entry will be the sole definition.
## Properties Set Centrally (Do Not Override) ## Properties Set Centrally (Do Not Override)
These are configured in the root `Directory.Build.props` — do **not** set them in individual projects: These are configured in the root `Directory.Build.props` — do **not** set them in individual projects:
@@ -37,3 +41,5 @@ Handled automatically via `<InternalsVisibleToSuffix>` in the root props. Defaul
<InternalsVisibleTo Include="MyProject.IntegrationTests" /> <InternalsVisibleTo Include="MyProject.IntegrationTests" />
</ItemGroup> </ItemGroup>
``` ```
This is in addition to the automatically generated entries; do not remove or duplicate the default suffix entries.
+3 -2
View File
@@ -15,9 +15,10 @@ Build configuration is handled by `tests/Directory.Build.props` — do not resta
- Test project: `<ProjectUnderTest>.Tests` (matches InternalsVisibleTo default). - Test project: `<ProjectUnderTest>.Tests` (matches InternalsVisibleTo default).
- Test classes: `<ClassUnderTest>Tests`. - Test classes: `<ClassUnderTest>Tests`.
- Test methods: descriptive names — `MethodName_Condition_ExpectedResult` or similar. - Test methods: must use `MethodName_Condition_ExpectedResult` format. Example: `Add_NegativeNumbers_ThrowsArgumentException`.
## Structure ## Structure
- Follow **Arrange / Act / Assert**. - Follow **Arrange / Act / Assert**.
- Always propose a set of basic tests for new or changed code. - Always propose a set of basic tests for new or changed code. A basic test set must include at minimum: one happy-path test, one test per documented edge case or boundary condition, and one test for each expected exception.
- If no edge cases are explicitly documented, use judgment to identify and cover the most likely boundary conditions (e.g. null inputs, empty collections, zero/max values) and note the assumption in a comment.
+54 -9
View File
@@ -10,29 +10,74 @@ Versioning is **GitVersion-driven** (`GitVersion.yml`). Do not hand-pick version
## Versioning ## Versioning
The root `GitVersion.yml` uses the `TrunkBased/preview1` workflow. Its `Mainline` strategy is what makes stable branches increment per commit rather than holding one version until the next tag.
| Branch | Label | Resulting version | | Branch | Label | Resulting version |
| --- | --- | --- | | --- | --- | --- |
| `main` | — | `MAJOR.MINOR.PATCH` (stable) | | `main`, `release/*` | — | `MAJOR.MINOR.PATCH` (stable; **patch increments on every commit**) |
| `develop` / `dev` / `development` | `beta` | `MAJOR.MINOR.PATCH-beta.N` | | `feature/*` | branch name | `…-<branch>.N` (pre-release; merging bumps **minor**) |
| `release/*`, `hotfix/*`, `feature/*` | branch name | `…-<branch>.N` | | `hotfix/*` | branch name | `…-<branch>.N` (pre-release; merging bumps **patch**) |
- Tags use the prefix `v` (regex `[vV]?` also accepts `V` or none). - Tags use the prefix `v` (regex `[vV]?` also accepts `V` or none).
- Only changes under `src/`, `Directory.Packages.props`, or `GitVersion.yml` increment the version. - Each `src/*` project is versioned **independently**: only changes under that project's own directory, `Directory.Packages.props`, or `GitVersion.yml` increment its version (see `GenerateProjectGitVersionConfig` in `src/Directory.Build.props`, which renders the root `GitVersion.yml` into a per-project copy). A change to one library does not bump a sibling's version.
- Increments are suppressed for already-merged branches and already-tagged commits. - All five packages still share one tag namespace, so a tag rebases every project's `MAJOR.MINOR` at once. Only the patch/pre-release counters diverge per project.
- Increments are suppressed on already-tagged commits, so the tagged commit builds exactly the tagged version.
## Changelog
Release notes are generated at pack time and embedded as `PackageReleaseNotes`. The `GenerateChangelogFromGit` target writes `git log` subjects to `$(ChangeLogPath)`, and `CreateReleaseNotesFromFile` reads that file into the nuspec. Both run before `GenerateNuspec`, and generation is skipped when the repository root has no `.git` directory.
The commit range is resolved in this order, first match wins:
1. `$(ChangeLogFromRef)..HEAD` — when `ChangeLogFromRef` is set.
2. `<tag>..HEAD` — from `git describe --tags --abbrev=0`.
3. `<sha>..HEAD` — the last first-parent merge whose subject matches `$(ChangeLogUpstreamMergePattern)`.
4. `<sha>..HEAD` — the last first-parent merge.
5. No range; the log is capped at `$(ChangeLogCommitLimit)` commits.
Commits are filtered with `--no-merges` and scoped to the project's own directory, plus the directories of its `ProjectReference`s unless `ChangeLogIncludeReferences` is `false`. This mirrors the per-project versioning rule above: a sibling library's commits do not appear in this package's notes.
| Property | Default | Purpose |
| --- | --- | --- |
| `ChangeLogFromRef` | *(empty)* | Explicit range start; overrides the fallback chain |
| `ChangeLogPath` | `$(BaseIntermediateOutputPath)changes.log` | Where the log is written and read from |
| `ChangeLogCommitLimit` | `100` | Cap used only when no range resolves |
| `ChangeLogUpstreamMergePattern` | `from .*/` | Subject matcher for the upstream-merge fallback |
| `ChangeLogIncludeReferences` | `true` | Include `ProjectReference` directories in scoping |
| `GenerateChangelogFromGit` | *(unset)* | Set to `false` to skip generation entirely |
> [!IMPORTANT]
> Step 2 uses the **nearest reachable** tag, not the newest. Packing from a commit that already carries a release tag therefore yields only the commits added since it — often a single entry. Pass `ChangeLogFromRef` to widen the range:
>
> ```shell
> dotnet pack -c Release -p:ChangeLogFromRef=v4.0.0
> ```
To ship hand-written notes instead, disable generation and point `ChangeLogPath` at your own file. Generation must be disabled, otherwise the target overwrites it:
```shell
dotnet pack -c Release -p:GenerateChangelogFromGit=false -p:ChangeLogPath=notes.md
```
Confirm the resolved range in the build output before publishing:
```text
Generated changelog at <path> using range v4.0.0..HEAD.
```
## Procedure ## Procedure
1. **Sync.** `git fetch --all --tags && git status` — confirm clean. 1. **Sync.** `git fetch --all --tags && git status` — confirm clean.
2. **Compute.** `dotnet build -getProperty:Version` — verify the value matches expectations. 2. **Compute.** `dotnet build src\<Project>\<Project>.csproj -getProperty:Version` — verify the value matches expectations for that specific project (there is no single repo-wide version).
3. **Pack.** `dotnet pack -c Release` (or use the [docker-build](../docker-build/SKILL.md) `pack` target). Artifacts land in `artifacts/nuget/`. 3. **Pack.** `dotnet pack -c Release` (or use the [docker-build](../docker-build/SKILL.md) `pack` target). Artifacts land in `artifacts/nuget/`. Check the logged changelog range and pass `ChangeLogFromRef` if it is narrower than the release warrants.
4. **Tag.** `git tag -a v<version> -m "Release v<version>" && git push origin v<version>`. 4. **Tag.** `git tag -a v<version> -m "Release v<version>" && git push origin v<version>`.
5. **Publish** packages to the configured feed. 5. **Publish** packages to the configured feed.
6. **Create the GitHub release** linked to the tag, using the generated changelog as notes. 6. **Create the GitHub release** linked to the tag, using the generated changelog as notes.
For hotfixes: branch from the latest stable tag (`git switch -c hotfix/<name> v<latest-stable>`), follow the procedure, then back-merge into `main` and `develop`. For hotfixes: branch from the latest stable tag (`git switch -c hotfix/<name> v<latest-stable>`), follow the procedure, then merge back into `main`. There is no `develop` branch to reconcile with — this repo is trunk-based.
## Guardrails ## Guardrails
- **Tags are immutable** once pushed; never move or delete them. - **Tags are immutable** once pushed; never move or delete them.
- **Never skip a `PATCH`** — ship a fix forward. - **Never skip a `PATCH`** — ship a fix forward.
- **Do not edit `GitVersion.yml` to force a version.** Address the underlying cause (missing tag, branch base, path filter, commit messages). - **Do not edit `GitVersion.yml` or a generated `src/*/GitVersion.yml` to force a version.** Address the underlying cause (missing tag, branch base, path filter, commit messages). Generated per-project files are gitignored build artifacts, re-derived from the root `GitVersion.yml` on every build — never hand-edit them.
+6
View File
@@ -1156,3 +1156,9 @@ artifacts/**
## Machine-specific overrides ## Machine-specific overrides
compose.override.yaml compose.override.yaml
## Generated per-project GitVersion config (rendered from the root GitVersion.yml)
src/*/GitVersion.yml
## Copilot agent scratch/research notes (ephemeral, not project documentation)
.copilot-tracking/
-152
View File
@@ -20,155 +20,3 @@ dotnet_diagnostic.Serilog004.severity = none # Serilog context property accessor
dotnet_diagnostic.SA1101.severity = none # Prefix local calls with this dotnet_diagnostic.SA1101.severity = none # Prefix local calls with this
dotnet_diagnostic.SA1633.severity = none # File must have header dotnet_diagnostic.SA1633.severity = none # File must have header
dotnet_diagnostic.SA1649.severity = none # File name must match first type name dotnet_diagnostic.SA1649.severity = none # File name must match first type name
# Organize usings
dotnet_sort_system_directives_first = true
dotnet_separate_import_directive_groups = true
csharp_using_directive_placement = inside_namespace:suggestion
csharp_prefer_simple_using_statement = true:suggestion
csharp_style_namespace_declarations = file_scoped:warning
# this. preferences
dotnet_style_qualification_for_field = false:none
dotnet_style_qualification_for_property = false:none
dotnet_style_qualification_for_method = false:none
dotnet_style_qualification_for_event = false:none
# Language keywords vs BCL types preferences
dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion
dotnet_style_predefined_type_for_member_access = true:suggestion
# Parentheses preferences
dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:silent
dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:silent
dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:silent
dotnet_style_parentheses_in_other_operators = never_if_unnecessary:silent
# Modifier preferences
dotnet_style_require_accessibility_modifiers = for_non_interface_members:suggestion
dotnet_style_readonly_field = true:suggestion
# Expression-level preferences
dotnet_style_object_initializer = true:suggestion
dotnet_style_collection_initializer = true:suggestion
dotnet_style_explicit_tuple_names = true:suggestion
dotnet_style_null_propagation = true:suggestion
dotnet_style_coalesce_expression = true:suggestion
dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion
dotnet_style_prefer_inferred_tuple_names = true:suggestion
dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion
dotnet_style_prefer_auto_properties = true:silent
dotnet_style_prefer_conditional_expression_over_assignment = true:suggestion
dotnet_style_prefer_conditional_expression_over_return = true:suggestion
###############################
# Naming Conventions #
###############################
# Style Definitions
dotnet_naming_style.pascal_case_style.capitalization = pascal_case
dotnet_naming_rule.private_instance_fields_rule.style = lower_camel_case_style
dotnet_naming_rule.private_static_fields_rule.style = lower_camel_case_style
# Use PascalCase for constant fields
dotnet_naming_rule.constant_fields_should_be_pascal_case.severity = suggestion
dotnet_naming_rule.constant_fields_should_be_pascal_case.symbols = constant_fields
dotnet_naming_rule.constant_fields_should_be_pascal_case.style = pascal_case_style
dotnet_naming_symbols.constant_fields.applicable_kinds = field
dotnet_naming_symbols.constant_fields.applicable_accessibilities = *
dotnet_naming_symbols.constant_fields.required_modifiers = const
###############################
# C# Coding Conventions #
###############################
# var preferences
csharp_style_var_for_built_in_types = true:suggestion
csharp_style_var_when_type_is_apparent = true:suggestion
csharp_style_var_elsewhere = true:suggestion
# Expression-bodied members
csharp_style_expression_bodied_methods = when_on_single_line :suggestion
csharp_style_expression_bodied_constructors = when_on_single_line :suggestion
csharp_style_expression_bodied_operators = when_on_single_line :suggestion
csharp_style_expression_bodied_properties = when_on_single_line :suggestion
csharp_style_expression_bodied_indexers = when_on_single_line :suggestion
csharp_style_expression_bodied_accessors = when_on_single_line :suggestion
csharp_style_expression_bodied_lambdas = when_on_single_line :suggestion
csharp_style_expression_bodied_local_functions = when_on_single_line :suggestion
# Pattern matching preferences
csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion
csharp_style_pattern_matching_over_as_with_null_check = true:suggestion
# Null-checking preferences
csharp_style_throw_expression = true:suggestion
csharp_style_conditional_delegate_call = true:suggestion
# Modifier preferences
csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:suggestion
# Expression-level preferences
csharp_prefer_braces = true:none
csharp_style_deconstructed_variable_declaration = true:suggestion
csharp_prefer_simple_default_expression = true:suggestion
csharp_style_pattern_local_over_anonymous_function = true:suggestion
csharp_style_inlined_variable_declaration = true:suggestion
# Unused value preferences
csharp_style_unused_value_expression_statement_preference = discard_variable:none
csharp_style_unused_value_assignment_preference = discard_variable:suggestion
## Index and Range preferences
csharp_style_prefer_index_operator = true:suggestion
csharp_style_prefer_range_operator = true:suggestion
csharp_prefer_static_local_function = true:suggestion
csharp_style_prefer_switch_expression = true:suggestion
###############################
# C# Formatting Rules #
###############################
# New line preferences
csharp_new_line_before_open_brace = all
csharp_new_line_before_else = true
csharp_new_line_before_catch = true
csharp_new_line_before_finally = true
csharp_new_line_before_members_in_object_initializers = true
csharp_new_line_before_members_in_anonymous_types = true
csharp_new_line_between_query_expression_clauses = true
# Indentation preferences
csharp_indent_case_contents = true
csharp_indent_switch_labels = true
csharp_indent_labels = flush_left
csharp_indent_block_contents = true
csharp_indent_braces = false
csharp_indent_case_contents_when_block = true
# Space preferences
csharp_space_after_cast = false
csharp_space_after_keywords_in_control_flow_statements = true
csharp_space_between_method_call_parameter_list_parentheses = false
csharp_space_between_method_declaration_parameter_list_parentheses = false
csharp_space_between_parentheses = false
csharp_space_before_colon_in_inheritance_clause = true
csharp_space_after_colon_in_inheritance_clause = true
csharp_space_around_binary_operators = before_and_after
csharp_space_between_method_declaration_empty_parameter_list_parentheses = false
csharp_space_between_method_call_name_and_opening_parenthesis = false
csharp_space_between_method_call_empty_parameter_list_parentheses = false
csharp_space_between_method_declaration_name_and_open_parenthesis = false
csharp_space_after_comma = true
csharp_space_before_comma = false
csharp_space_after_dot = false
csharp_space_before_dot = false
csharp_space_after_semicolon_in_for_statement = true
csharp_space_before_semicolon_in_for_statement = false
csharp_space_around_declaration_statements = false
csharp_space_before_open_square_brackets = false
csharp_space_between_empty_square_brackets = false
csharp_space_between_square_brackets = false
# Wrapping preferences
csharp_preserve_single_line_statements = true
csharp_preserve_single_line_blocks = true
###############################
# VB Coding Conventions #
###############################
# Modifier preferences
visual_basic_preferred_modifier_order = Partial,Default,Private,Protected,Public,Friend,NotOverridable,Overridable,MustOverride,Overloads,Overrides,MustInherit,NotInheritable,Static,Shared,Shadows,ReadOnly,WriteOnly,Dim,Const,WithEvents,Widening,Narrowing,Custom,Async:suggestion
###############################
# Extra Rules #
###############################
# dotnet_naming_rule.private_constants_rule.severity = warning
# dotnet_naming_rule.private_constants_rule.style = upper_camel_case_style
# dotnet_naming_rule.private_constants_rule.symbols = private_constants_symbols
# dotnet_naming_rule.private_instance_fields_rule.severity = warning
dotnet_naming_rule.private_instance_fields_rule.style = lower_camel_case_style
# dotnet_naming_rule.private_instance_fields_rule.symbols = private_instance_fields_symbols
# dotnet_naming_rule.private_static_fields_rule.severity = warning
dotnet_naming_rule.private_static_fields_rule.style = lower_camel_case_style
# dotnet_naming_rule.private_static_fields_rule.symbols = private_static_fields_symbols
# dotnet_naming_style.prefix_private_field_with_underscore.required_prefix = _
+6 -25
View File
@@ -10,6 +10,7 @@
<NoLogo>true</NoLogo> <NoLogo>true</NoLogo>
<!-- Prepend organization name to default namespace --> <!-- Prepend organization name to default namespace -->
<RootNamespace>Kritikos.$(MSBuildProjectName)</RootNamespace> <RootNamespace>Kritikos.$(MSBuildProjectName)</RootNamespace>
<AssemblyName>Kritikos.$(MSBuildProjectName)</AssemblyName>
<!-- Enable global usings based on project type --> <!-- Enable global usings based on project type -->
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<!-- Generate documentation file and ignore warnings for undocumented elements --> <!-- Generate documentation file and ignore warnings for undocumented elements -->
@@ -79,20 +80,12 @@
</PropertyGroup> </PropertyGroup>
<PropertyGroup Label="Project Assets"> <PropertyGroup Label="Project Assets">
<ProjectIcon Condition="Exists('$(MSBuildThisFileDirectory)\icon.png')"> <ProjectIcon Condition="Exists('$(MSBuildThisFileDirectory)icon.png')">$(MSBuildThisFileDirectory)icon.png</ProjectIcon>
$(MSBuildThisFileDirectory)icon.png <ProjectIcon Condition="Exists('$(MSBuildProjectDirectory)\icon.png')">$(MSBuildProjectDirectory)\icon.png</ProjectIcon>
</ProjectIcon>
<ProjectIcon Condition="Exists('$(MSBuildProjectDirectory)\icon.png')">
$(MSBuildProjectDirectory)icon.png
</ProjectIcon>
<ProjectIconExists Condition="$(ProjectIcon) != ''">true</ProjectIconExists> <ProjectIconExists Condition="$(ProjectIcon) != ''">true</ProjectIconExists>
<ProjectReadMe Condition="Exists('$(MSBuildThisFileDirectory)\README.md')"> <ProjectReadMe Condition="Exists('$(MSBuildThisFileDirectory)README.md')">$(MSBuildThisFileDirectory)README.md</ProjectReadMe>
$(MSBuildThisFileDirectory)README.md <ProjectReadMe Condition="Exists('$(MSBuildProjectDirectory)\README.md')">$(MSBuildProjectDirectory)\README.md</ProjectReadMe>
</ProjectReadMe>
<ProjectReadMe Condition="Exists('$(MSBuildProjectDirectory)\README.md')">
$(MSBuildProjectDirectory)README.md
</ProjectReadMe>
<ProjectReadMeExists Condition="$(ProjectReadMe) != ''">true</ProjectReadMeExists> <ProjectReadMeExists Condition="$(ProjectReadMe) != ''">true</ProjectReadMeExists>
</PropertyGroup> </PropertyGroup>
@@ -127,11 +120,6 @@
<EFOptimizeContext>true</EFOptimizeContext> <EFOptimizeContext>true</EFOptimizeContext>
</PropertyGroup> </PropertyGroup>
<!-- Mark assemblies as CLS compliant so the compiler warns on non compliant usage -->
<PropertyGroup Condition="$(IsPackable) == 'true'">
<ClsCompliant>true</ClsCompliant>
<GenerateSBOM>true</GenerateSBOM>
</PropertyGroup>
<ItemGroup> <ItemGroup>
<AssemblyAttribute Include="System.CLSCompliant"> <AssemblyAttribute Include="System.CLSCompliant">
<_Parameter1>$(ClsCompliant)</_Parameter1> <_Parameter1>$(ClsCompliant)</_Parameter1>
@@ -159,13 +147,6 @@
CopyToOutputDirectory="Never" Visible="false" /> CopyToOutputDirectory="Never" Visible="false" />
</ItemGroup> </ItemGroup>
<!-- Project internals are exposed to projects named $(Project).Tests by default -->
<ItemGroup
Condition="@(InternalsVisibleToSuffix->Count()) == 0 AND @(InternalsVisibleTo->Count()) == 0">
<InternalsVisibleToSuffix Include=".Tests" />
<InternalsVisibleToSuffix Include="Tests" />
</ItemGroup>
<PropertyGroup Label="Package"> <PropertyGroup Label="Package">
<PackageId>$(RootNamespace)</PackageId> <PackageId>$(RootNamespace)</PackageId>
<Company>Kritikos IO</Company> <Company>Kritikos IO</Company>
@@ -183,7 +164,7 @@
<EnablePackageValidation>true</EnablePackageValidation> <EnablePackageValidation>true</EnablePackageValidation>
<SymbolPackageFormat>snupkg</SymbolPackageFormat> <SymbolPackageFormat>snupkg</SymbolPackageFormat>
<PackageLicenseExpression>Apache-2.0</PackageLicenseExpression> <PackageLicenseExpression>Apache-2.0</PackageLicenseExpression>
<PackageRequireLicenseAcceptance>true</PackageRequireLicenseAcceptance> <PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
</PropertyGroup> </PropertyGroup>
<ItemGroup Label="Versioning" Condition="'$(IsTestProject)' != 'true'"> <ItemGroup Label="Versioning" Condition="'$(IsTestProject)' != 'true'">
+57 -30
View File
@@ -9,6 +9,12 @@
<None Update="packages.lock.json" Visible="false" /> <None Update="packages.lock.json" Visible="false" />
</ItemGroup> </ItemGroup>
<PropertyGroup>
<ClsCompliant Condition="'$(SkipClsCompliant)' != 'true' AND '$(IsPackable)' != 'false' AND '$(IsTestProject)' != 'true'">true</ClsCompliant>
<ClsCompliant Condition="'$(ClsCompliant)' == ''">false</ClsCompliant>
<GenerateSBOM Condition="'$(IsPackable)' != 'false' AND '$(IsTestProject)' != 'true'">true</GenerateSBOM>
</PropertyGroup>
<ItemGroup <ItemGroup
Condition="'$(UsingMicrosoftNETSdkWeb)' == 'True' AND @(PackageReference->WithMetadataValue('Identity','Microsoft.AspNetCore.OpenApi')->Count()) &gt; 0"> Condition="'$(UsingMicrosoftNETSdkWeb)' == 'True' AND @(PackageReference->WithMetadataValue('Identity','Microsoft.AspNetCore.OpenApi')->Count()) &gt; 0">
<PackageReference Include="Microsoft.Extensions.ApiDescription.Server"> <PackageReference Include="Microsoft.Extensions.ApiDescription.Server">
@@ -29,48 +35,69 @@
AfterTargets="GenerateOpenApiDocuments" AfterTargets="GenerateOpenApiDocuments"
Condition="'$(OpenApiDocumentsDirectory)' != ''"> Condition="'$(OpenApiDocumentsDirectory)' != ''">
<Move SourceFiles="$(OpenApiDocumentsDirectory)/$(MSBuildProjectName).json" <Move SourceFiles="$(OpenApiDocumentsDirectory)/$(MSBuildProjectName).json"
DestinationFiles="$(OpenApiDocumentsDirectory)/$(MSBuildProjectName)-v1.json" DestinationFiles="$(OpenApiDocumentsDirectory)/$(MSBuildProjectName)_v1.json"
Condition="Exists('$(OpenApiDocumentsDirectory)/$(MSBuildProjectName).json')" /> Condition="Exists('$(OpenApiDocumentsDirectory)/$(MSBuildProjectName).json')" />
</Target> </Target>
<Target Name="SetHierarchicalPackageOutputPath" <!--
BeforeTargets="_GetAbsoluteOutputPathsForPack" OpenApiDocumentsDirectory tracks $(ArtifactsPath), which developers may override to a
Condition="'$(ArtifactsPath)' != '' AND '$(PackageVersion)' != ''"> machine-specific location. Client generators (e.g. a checked-in .refitter file) need a
<PropertyGroup> stable, repo-relative path, so mirror the renamed document(s) into the repo's own
<PackageOutputPath>$(ArtifactsPath)/nuget/$(PackageId)/$(PackageVersion)</PackageOutputPath> artifacts/OpenApi folder regardless of where ArtifactsPath actually points.
</PropertyGroup>
Uses a glob (not a single "_v1.json" name) because a project may define multiple named
OpenAPI documents (AddOpenApi("v1"), AddOpenApi("v2"), ...), each emitted as its own
"$(MSBuildProjectName)_{documentName}.json" file.
-->
<Target Name="CopyOpenApiDocumentsToRepoArtifacts"
AfterTargets="RenameOpenApiDocuments"
Condition="'$(OpenApiDocumentsDirectory)' != ''">
<ItemGroup>
<OpenApiDocumentToCopy Include="$(OpenApiDocumentsDirectory)/$(MSBuildProjectName)*.json" />
</ItemGroup>
<Copy SourceFiles="@(OpenApiDocumentToCopy)"
DestinationFolder="$(MSBuildThisFileDirectory)artifacts/OpenApi"
SkipUnchangedFiles="true"
Condition="@(OpenApiDocumentToCopy->Count()) &gt; 0" />
</Target> </Target>
<Target Name="AddInternalsVisibleTo" BeforeTargets="BeforeCompile"> <Target Name="AddInternalsVisibleTo" BeforeTargets="BeforeCompile">
<!-- <!--
Add an ItemGroup with tags in the following format: Exposes assembly internals to friend assemblies.
<InternalsVisibleTo Include="CustomTest1" />
-> [assembly: InternalsVisibleTo("CustomTest1")]
<InternalsVisibleTo Include="CustomTest2, PublicKey=abc" />
-> [assembly: InternalsVisibleTo("CustomTest2, PublicKey=abc")]
<InternalsVisibleTo Include="$(AssemblyName).Custom" />
-> [assembly: InternalsVisibleTo("ClassLibrary1.Custom")]
on a project with assembly name ClasLibrary1: The .NET SDK already turns <InternalsVisibleTo Include="..." /> items into
[assembly: InternalsVisibleTo("...")] attributes in its GetAssemblyAttributes
target (including strong-name PublicKey handling via PublicKey/Key metadata).
This target must therefore NOT emit those attributes itself - doing so emits
every friend assembly twice.
Instead it only layers the project-local convention on top of the SDK:
* translate <InternalsVisibleToSuffix> entries into InternalsVisibleTo items
so the SDK can emit them, and
* apply a sensible default when a project declared no friend assemblies.
Examples on an assembly named "ClassLibrary1":
<InternalsVisibleTo Include="CustomTest1" /> (handled by the SDK)
-> [assembly: InternalsVisibleTo("CustomTest1")]
<InternalsVisibleToSuffix Include=".Tests" /> (handled here)
-> [assembly: InternalsVisibleTo("ClassLibrary1.Tests")]
Running at build time (before GetAssemblyAttributes) means the counts below
see items declared in both imported props and the project body, so an
explicit InternalsVisibleTo correctly suppresses the default suffix.
-->
<!-- Default: expose internals to "<AssemblyName>.Tests" when the project has
not declared any friend assemblies of its own. -->
<ItemGroup Condition="@(InternalsVisibleTo->Count()) == 0 AND @(InternalsVisibleToSuffix->Count()) == 0">
<InternalsVisibleToSuffix Include=".Tests" /> <InternalsVisibleToSuffix Include=".Tests" />
-> [assembly: InternalsVisibleTo("ClassLibrary1.Tests")]
<InternalsVisibleToSuffix Include=".FunctionalTests" />
-> [assembly: InternalsVisibleTo("ClassLibrary1.FunctionalTests")]
-->
<!-- Handle InternalsVisibleTo -->
<ItemGroup Condition="'@(InternalsVisibleTo->Count())' &gt; 0">
<AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleTo">
<_Parameter1>%(InternalsVisibleTo.Identity)</_Parameter1>
</AssemblyAttribute>
</ItemGroup> </ItemGroup>
<!-- Handle InternalsVisibleToSuffix --> <!-- Translate the suffix convention into InternalsVisibleTo items for the SDK,
skipping the current assembly (e.g. a "*.Tests" project itself). -->
<ItemGroup Condition="@(InternalsVisibleToSuffix->Count()) &gt; 0"> <ItemGroup Condition="@(InternalsVisibleToSuffix->Count()) &gt; 0">
<AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleTo" <InternalsVisibleTo Include="$(AssemblyName)%(InternalsVisibleToSuffix.Identity)"
Condition="$(AssemblyName.EndsWith(%(InternalsVisibleToSuffix.Identity))) == 'false'"> Condition="$(AssemblyName.EndsWith(%(InternalsVisibleToSuffix.Identity))) == 'false'" />
<_Parameter1>$(AssemblyName)%(InternalsVisibleToSuffix.Identity)</_Parameter1>
</AssemblyAttribute>
</ItemGroup> </ItemGroup>
</Target> </Target>
+2 -2
View File
@@ -1,9 +1,9 @@
<Project> <Project>
<ItemGroup Label="Packages"> <ItemGroup Label="Packages">
<PackageVersion Include="GitVersion.MsBuild" Version="6.7.0" /> <PackageVersion Include="GitVersion.MsBuild" Version="6.8.2" />
<PackageVersion Include="Microsoft.Sbom.Targets" Version="4.1.5" /> <PackageVersion Include="Microsoft.Sbom.Targets" Version="4.1.5" />
<PackageVersion Include="NewStyleCop.Analyzers" Version="1.2.1" /> <PackageVersion Include="NewStyleCop.Analyzers" Version="1.2.1" />
<PackageVersion Include="NSubstitute.Analyzers.CSharp" Version="1.0.17" /> <PackageVersion Include="NSubstitute.Analyzers.CSharp" Version="1.0.17" />
<PackageVersion Include="Microsoft.Extensions.ApiDescription.Server" Version="10.0.5" /> <PackageVersion Include="Microsoft.Extensions.ApiDescription.Server" Version="10.0.10" />
</ItemGroup> </ItemGroup>
</Project> </Project>
+36 -17
View File
@@ -1,27 +1,46 @@
workflow: GitHubFlow/v1 workflow: TrunkBased/preview1
mode: ContinuousDelivery
tag-prefix: '[vV]?' tag-prefix: '[vV]?'
ignore: ignore:
paths: paths:
- ^(?!src\/|Directory\.Packages\.props|GitVersion.yml).* - ^(?!src\/|Directory\.Packages\.props|GitVersion.yml).*
branches: branches:
develop:
label: 'beta'
regex: '^(dev|develop|development)$'
source-branches:
- main
feature:
mode: ContinuousDelivery
source-branches:
- develop
- main
hotfix:
regex: ^hotfix?[\/-](?<BranchName>.+)
mode: ContinuousDelivery
release: release:
mode: ContinuousDeployment
label: ''
increment: Patch
regex: ^releases?[\/-](?<BranchName>.+)
source-branches:
- main
is-release-branch: true
is-main-branch: true
pre-release-weight: 55000
develop:
mode: ContinuousDelivery mode: ContinuousDelivery
label: alpha
increment: Minor
regex: ^develop$
source-branches:
- main
prevent-increment:
when-current-commit-tagged: false
pre-release-weight: 0
feature:
source-branches:
- main
- develop
- release
hotfix:
source-branches:
- main
- release
pull-request:
source-branches:
- main
- develop
- release
- feature
- hotfix
prevent-increment: prevent-increment:
of-merged-branch: true of-merged-branch: true
when-branch-merged: true
when-current-commit-tagged: true when-current-commit-tagged: true
+1 -79
View File
@@ -1,4 +1,4 @@
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation"> <wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:Boolean x:Key="/Default/CodeEditing/GenerateMemberBody/DebuggerStepThroughAccessors/@EntryValue">True</s:Boolean> <s:Boolean x:Key="/Default/CodeEditing/GenerateMemberBody/DebuggerStepThroughAccessors/@EntryValue">True</s:Boolean>
<s:String x:Key="/Default/CodeEditing/GenerateMemberBody/DocumentationGenerationKind/@EntryValue">Inherit</s:String> <s:String x:Key="/Default/CodeEditing/GenerateMemberBody/DocumentationGenerationKind/@EntryValue">Inherit</s:String>
<s:Boolean x:Key="/Default/CodeEditing/GenerateMemberBody/PlaceBackingFieldAboveProperty/@EntryValue">True</s:Boolean> <s:Boolean x:Key="/Default/CodeEditing/GenerateMemberBody/PlaceBackingFieldAboveProperty/@EntryValue">True</s:Boolean>
@@ -14,14 +14,8 @@
<s:Boolean x:Key="/Default/CodeEditing/TypingAssist/CSharpAnnotationTypingAssist/IsEnabledAtOtherPositions/@EntryValue">False</s:Boolean> <s:Boolean x:Key="/Default/CodeEditing/TypingAssist/CSharpAnnotationTypingAssist/IsEnabledAtOtherPositions/@EntryValue">False</s:Boolean>
<s:Boolean x:Key="/Default/CodeEditing/TypingAssist/CSharpAnnotationTypingAssist/IsInsertNullCheckWhenAlreadyAnnotated/@EntryValue">False</s:Boolean> <s:Boolean x:Key="/Default/CodeEditing/TypingAssist/CSharpAnnotationTypingAssist/IsInsertNullCheckWhenAlreadyAnnotated/@EntryValue">False</s:Boolean>
<s:Int64 x:Key="/Default/CodeInspection/CognitiveComplexityAnalysis/CSharpThreshold/@EntryValue">20</s:Int64>
<s:String x:Key="/Default/CodeInspection/GeneratedCode/GeneratedFileMasks/=_002AModelSnapshot_002Ecs/@EntryIndexedValue">*ModelSnapshot.cs</s:String>
<s:String x:Key="/Default/CodeInspection/GeneratedCode/GeneratedFileMasks/=Migrations_002F_002A/@EntryIndexedValue">Migrations/*</s:String>
<s:Boolean x:Key="/Default/CodeInspection/Highlighting/CalculateInheritedTypeMembers/@EntryValue">True</s:Boolean> <s:Boolean x:Key="/Default/CodeInspection/Highlighting/CalculateInheritedTypeMembers/@EntryValue">True</s:Boolean>
<s:Boolean x:Key="/Default/CodeInspection/Highlighting/DoNotShowVsBulb/@EntryValue">False</s:Boolean> <s:Boolean x:Key="/Default/CodeInspection/Highlighting/DoNotShowVsBulb/@EntryValue">False</s:Boolean>
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=ClassNeverInstantiated_002EGlobal/@EntryIndexedValue">DO_NOT_SHOW</s:String>
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=ClassNeverInstantiated_002ELocal/@EntryIndexedValue">DO_NOT_SHOW</s:String>
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=ConvertToPrimaryConstructor/@EntryIndexedValue">DO_NOT_SHOW</s:String>
<s:Boolean x:Key="/Default/CodeInspection/Highlighting/MergeVsBulbItemsIntoReSharperBulb/@EntryValue">True</s:Boolean> <s:Boolean x:Key="/Default/CodeInspection/Highlighting/MergeVsBulbItemsIntoReSharperBulb/@EntryValue">True</s:Boolean>
<s:Boolean x:Key="/Default/CodeInspection/Highlighting/ReadSettingsFromFileLevel/@EntryValue">True</s:Boolean> <s:Boolean x:Key="/Default/CodeInspection/Highlighting/ReadSettingsFromFileLevel/@EntryValue">True</s:Boolean>
@@ -29,83 +23,12 @@
<s:String x:Key="/Default/CodeInspection/Highlighting/SweaWarningsMode/@EntryValue">ShowAndRun</s:String> <s:String x:Key="/Default/CodeInspection/Highlighting/SweaWarningsMode/@EntryValue">ShowAndRun</s:String>
<s:String x:Key="/Default/CodeInspection/XmlDocInspections/TypeAccessibility/@EntryValue">None</s:String> <s:String x:Key="/Default/CodeInspection/XmlDocInspections/TypeAccessibility/@EntryValue">None</s:String>
<s:String x:Key="/Default/CodeInspection/XmlDocInspections/TypeMemberAccessibility/@EntryValue">None</s:String> <s:String x:Key="/Default/CodeInspection/XmlDocInspections/TypeMemberAccessibility/@EntryValue">None</s:String>
<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CommonFormatter/AUTODETECT_INDENT_SETTINGS/@EntryValue">True</s:Boolean>
<s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/ALIGNMENT_TAB_FILL_STYLE/@EntryValue">USE_SPACES</s:String>
<s:Int64 x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/BLANK_LINES_AROUND_REGION/@EntryValue">0</s:Int64>
<s:Int64 x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/BLANK_LINES_BEFORE_SINGLE_LINE_COMMENT/@EntryValue">1</s:Int64>
<s:Int64 x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/BLANK_LINES_BETWEEN_USING_GROUPS/@EntryValue">1</s:Int64>
<s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/PLACE_ACCESSOR_ATTRIBUTE_ON_SAME_LINE_EX/@EntryValue">NEVER</s:String>
<s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/PLACE_ACCESSORHOLDER_ATTRIBUTE_ON_SAME_LINE_EX/@EntryValue">NEVER</s:String>
<s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/PLACE_FIELD_ATTRIBUTE_ON_SAME_LINE_EX/@EntryValue">NEVER</s:String>
<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/PLACE_WHILE_ON_NEW_LINE/@EntryValue">True</s:Boolean>
<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/SPACE_AFTER_TYPECAST_PARENTHESES/@EntryValue">False</s:Boolean>
<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/SPACE_WITHIN_SINGLE_LINE_ARRAY_INITIALIZER_BRACES/@EntryValue">True</s:Boolean>
<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/WRAP_BEFORE_BINARY_OPSIGN/@EntryValue">True</s:Boolean>
<s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/WRAP_CHAINED_METHOD_CALLS/@EntryValue">CHOP_IF_LONG</s:String>
<s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/WRAP_LINQ_EXPRESSIONS/@EntryValue">CHOP_ALWAYS</s:String>
<s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/WRAP_TERNARY_EXPR_STYLE/@EntryValue">CHOP_ALWAYS</s:String>
<s:Boolean x:Key="/Default/CodeStyle/CSharpUsing/QualifiedUsingAtNestedScope/@EntryValue">True</s:Boolean>
<s:Boolean x:Key="/Default/CodeStyle/EditorConfig/EnableStyleCopSupport/@EntryValue">True</s:Boolean> <s:Boolean x:Key="/Default/CodeStyle/EditorConfig/EnableStyleCopSupport/@EntryValue">True</s:Boolean>
<s:Boolean x:Key="/Default/CodeStyle/EditorConfig/ShowEditorConfigStatusBarIndicator/@EntryValue">True</s:Boolean> <s:Boolean x:Key="/Default/CodeStyle/EditorConfig/ShowEditorConfigStatusBarIndicator/@EntryValue">True</s:Boolean>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=PrivateInstanceFields/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=PrivateStaticFields/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/JavaScriptNaming/UserRules/=JS_005FBLOCK_005FSCOPE_005FCONSTANT/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/JavaScriptNaming/UserRules/=JS_005FBLOCK_005FSCOPE_005FFUNCTION/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/JavaScriptNaming/UserRules/=JS_005FBLOCK_005FSCOPE_005FVARIABLE/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/JavaScriptNaming/UserRules/=JS_005FCLASS/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/JavaScriptNaming/UserRules/=JS_005FCONSTRUCTOR/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/JavaScriptNaming/UserRules/=JS_005FFUNCTION/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/JavaScriptNaming/UserRules/=JS_005FGLOBAL_005FVARIABLE/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/JavaScriptNaming/UserRules/=JS_005FLABEL/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/JavaScriptNaming/UserRules/=JS_005FLOCAL_005FCONSTRUCTOR/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/JavaScriptNaming/UserRules/=JS_005FLOCAL_005FVARIABLE/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/JavaScriptNaming/UserRules/=JS_005FOBJECT_005FPROPERTY_005FOF_005FFUNCTION/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/JavaScriptNaming/UserRules/=JS_005FPARAMETER/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/JavaScriptNaming/UserRules/=TS_005FCLASS/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/JavaScriptNaming/UserRules/=TS_005FENUM/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/JavaScriptNaming/UserRules/=TS_005FENUM_005FMEMBER/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/JavaScriptNaming/UserRules/=TS_005FINTERFACE/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="I" Suffix="" Style="AaBb" /&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/JavaScriptNaming/UserRules/=TS_005FMIXED_005FENUM/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/JavaScriptNaming/UserRules/=TS_005FMODULE/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/JavaScriptNaming/UserRules/=TS_005FMODULE_005FEXPORTED/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/JavaScriptNaming/UserRules/=TS_005FMODULE_005FLOCAL/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/JavaScriptNaming/UserRules/=TS_005FPRIVATE_005FMEMBER_005FACCESSOR/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/JavaScriptNaming/UserRules/=TS_005FPRIVATE_005FSTATIC_005FTYPE_005FFIELD/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/JavaScriptNaming/UserRules/=TS_005FPRIVATE_005FTYPE_005FFIELD/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/JavaScriptNaming/UserRules/=TS_005FPRIVATE_005FTYPE_005FMETHOD/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/JavaScriptNaming/UserRules/=TS_005FPROTECTED_005FMEMBER_005FACCESSOR/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/JavaScriptNaming/UserRules/=TS_005FPROTECTED_005FSTATIC_005FTYPE_005FFIELD/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/JavaScriptNaming/UserRules/=TS_005FPROTECTED_005FTYPE_005FFIELD/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/JavaScriptNaming/UserRules/=TS_005FPROTECTED_005FTYPE_005FMETHOD/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/JavaScriptNaming/UserRules/=TS_005FPUBLIC_005FMEMBER_005FACCESSOR/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/JavaScriptNaming/UserRules/=TS_005FPUBLIC_005FSTATIC_005FTYPE_005FFIELD/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/JavaScriptNaming/UserRules/=TS_005FPUBLIC_005FTYPE_005FFIELD/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/JavaScriptNaming/UserRules/=TS_005FPUBLIC_005FTYPE_005FMETHOD/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/JavaScriptNaming/UserRules/=TS_005FTYPE_005FALIAS/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/JavaScriptNaming/UserRules/=TS_005FTYPE_005FPARAMETER/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="T" Suffix="" Style="AaBb" /&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/WebNaming/UserRules/=ASP_005FFIELD/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/WebNaming/UserRules/=ASP_005FHTML_005FCONTROL/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/WebNaming/UserRules/=ASP_005FTAG_005FNAME/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/WebNaming/UserRules/=ASP_005FTAG_005FPREFIX/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/XamlNaming/UserRules/=NAMESPACE_005FALIAS/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /&gt;</s:String> <s:String x:Key="/Default/CodeStyle/Naming/XamlNaming/UserRules/=NAMESPACE_005FALIAS/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/XamlNaming/UserRules/=XAML_005FFIELD/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /&gt;</s:String> <s:String x:Key="/Default/CodeStyle/Naming/XamlNaming/UserRules/=XAML_005FFIELD/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/XamlNaming/UserRules/=XAML_005FRESOURCE/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /&gt;</s:String> <s:String x:Key="/Default/CodeStyle/Naming/XamlNaming/UserRules/=XAML_005FRESOURCE/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /&gt;</s:String>
<s:String x:Key="/Default/CustomTools/CustomToolsData/@EntryValue"></s:String>
<s:String x:Key="/Default/Environment/PerformanceGuide/SwitchBehaviour/=AutoRecoverer/@EntryIndexedValue">LIVE_MONITOR</s:String>
<s:String x:Key="/Default/Environment/PerformanceGuide/SwitchBehaviour/=Format/@EntryIndexedValue">LIVE_MONITOR</s:String>
<s:String x:Key="/Default/Environment/PerformanceGuide/SwitchBehaviour/=Roslyn_002Dswea/@EntryIndexedValue">DO_NOTHING</s:String>
<s:String x:Key="/Default/Environment/PerformanceGuide/SwitchBehaviour/=ShowAnnotations/@EntryIndexedValue">LIVE_MONITOR</s:String>
<s:String x:Key="/Default/Environment/PerformanceGuide/SwitchBehaviour/=SolExp_002DTrack/@EntryIndexedValue">LIVE_MONITOR</s:String>
<s:String x:Key="/Default/Environment/PerformanceGuide/SwitchBehaviour/=StartPage_002DIsDownloadRefreshEnabled/@EntryIndexedValue">LIVE_MONITOR</s:String>
<s:String x:Key="/Default/Environment/PerformanceGuide/SwitchBehaviour/=StartPage_002DOnEnvironmentStatup/@EntryIndexedValue">LIVE_MONITOR</s:String>
<s:String x:Key="/Default/Environment/PerformanceGuide/SwitchBehaviour/=SyncSettings/@EntryIndexedValue">LIVE_MONITOR</s:String>
<s:String x:Key="/Default/Environment/PerformanceGuide/SwitchBehaviour/=TextEditor_002DCodeLens/@EntryIndexedValue">LIVE_MONITOR</s:String>
<s:String x:Key="/Default/Environment/PerformanceGuide/SwitchBehaviour/=TextEditor_002DTrackChanges_002D2/@EntryIndexedValue">LIVE_MONITOR</s:String>
<s:String x:Key="/Default/Environment/PerformanceGuide/SwitchBehaviour/=VCS/@EntryIndexedValue">LIVE_MONITOR</s:String>
<s:String x:Key="/Default/Environment/PerformanceGuide/SwitchBehaviour/=VsBulb/@EntryIndexedValue">DO_NOTHING</s:String>
<s:String x:Key="/Default/Environment/PerformanceGuide/SwitchBehaviour/=XAML_0020Designer/@EntryIndexedValue">LIVE_MONITOR</s:String>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpKeepExistingMigration/@EntryIndexedValue">True</s:Boolean> <s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpKeepExistingMigration/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpPlaceEmbeddedOnSameLineMigration/@EntryIndexedValue">True</s:Boolean> <s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpPlaceEmbeddedOnSameLineMigration/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpUseContinuousIndentInsideBracesMigration/@EntryIndexedValue">True</s:Boolean> <s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpUseContinuousIndentInsideBracesMigration/@EntryIndexedValue">True</s:Boolean>
@@ -115,6 +38,5 @@
<s:Boolean x:Key="/Default/Environment/UnitTesting/DisabledProviders/=Testing_0020Platform/@EntryIndexedValue">False</s:Boolean> <s:Boolean x:Key="/Default/Environment/UnitTesting/DisabledProviders/=Testing_0020Platform/@EntryIndexedValue">False</s:Boolean>
<s:Boolean x:Key="/Default/Environment/UnitTesting/DisabledProviders/=VsTest/@EntryIndexedValue">False</s:Boolean> <s:Boolean x:Key="/Default/Environment/UnitTesting/DisabledProviders/=VsTest/@EntryIndexedValue">False</s:Boolean>
<s:Boolean x:Key="/Default/Environment/UnitTesting/TestingPlatformTestProvider/IgnoreProjectsSupportedByOtherProviders/@EntryValue">False</s:Boolean> <s:Boolean x:Key="/Default/Environment/UnitTesting/TestingPlatformTestProvider/IgnoreProjectsSupportedByOtherProviders/@EntryValue">False</s:Boolean>
<s:Boolean x:Key="/Default/ReSpeller/ReSpellerEnabled/@EntryValue">False</s:Boolean> <s:Boolean x:Key="/Default/ReSpeller/ReSpellerEnabled/@EntryValue">False</s:Boolean>
</wpf:ResourceDictionary> </wpf:ResourceDictionary>
+72 -2
View File
@@ -1,9 +1,79 @@
<Project> <Project>
<ImportGroup Condition="Exists($([MSBuild]::GetPathOfFileAbove('Directory.Build.props', '$(MSBuildThisFileDirectory)../'))) == 'true'"> <ImportGroup
<Import Project="$([MSBuild]::GetPathOfFileAbove('Directory.Build.props', '$(MSBuildThisFileDirectory)../'))" /> Condition="Exists($([MSBuild]::GetPathOfFileAbove('Directory.Build.props', '$(MSBuildThisFileDirectory)../'))) == 'true'">
<Import
Project="$([MSBuild]::GetPathOfFileAbove('Directory.Build.props', '$(MSBuildThisFileDirectory)../'))" />
</ImportGroup> </ImportGroup>
<PropertyGroup Label="Package"> <PropertyGroup Label="Package">
<PackageProjectUrl>http://localhost</PackageProjectUrl> <PackageProjectUrl>http://localhost</PackageProjectUrl>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Label="GitVersion per-project scoping">
<GitVersionTemplateFile>$(MSBuildThisFileDirectory)..\GitVersion.yml</GitVersionTemplateFile>
<_GitVersionIgnorePathsRegex>(paths:\s*\r?\n\s*- ).+</_GitVersionIgnorePathsRegex>
</PropertyGroup>
<!--
GitVersion.MsBuild runs `gitversion "$(MSBuildProjectDirectory)"`, and GitVersion resolves its
config by
walking up from that directory to the repo root, using the first GitVersion.yml it finds. Rendering
one
here (rewriting the repo-root GitVersion.yml's ignore.paths entry, so there is a single
hand-maintained
file) scopes ignore.paths to this project's own directory plus the full transitive closure of its
ProjectReference dependencies, so a change anywhere upstream in the dependency graph also counts
toward
this project's version. Generated file is gitignored (see .gitignore).
-->
<Target Name="_CollectGitVersionTransitiveReferences" Returns="@(_GitVersionTransitiveRef)">
<ItemGroup>
<!-- Resolve to FullPath here, before crossing the MSBuild task-output boundary below:
relative
Includes from an intermediate project resolve against the wrong directory once passed through. -->
<_GitVersionTransitiveRef Include="@(ProjectReference->'%(FullPath)')" />
</ItemGroup>
<MSBuild Projects="@(ProjectReference)" Targets="_CollectGitVersionTransitiveReferences"
Condition="'@(ProjectReference)' != ''" SkipNonexistentTargets="true">
<Output TaskParameter="TargetOutputs" ItemName="_GitVersionTransitiveRef" />
</MSBuild>
</Target>
<Target Name="GenerateProjectGitVersionConfig" BeforeTargets="RunGitVersion"
Condition="Exists('$(GitVersionTemplateFile)')">
<MSBuild Projects="$(MSBuildProjectFullPath)" Targets="_CollectGitVersionTransitiveReferences"
Condition="'@(ProjectReference)' != ''" SkipNonexistentTargets="true">
<Output TaskParameter="TargetOutputs" ItemName="_GitVersionScopeProjectRef" />
</MSBuild>
<ItemGroup>
<_GitVersionScopePath Include="$(MSBuildProjectDirectory)" />
<_GitVersionScopePath Include="@(_GitVersionScopeProjectRef->'%(RootDir)%(Directory)')" />
</ItemGroup>
<ItemGroup>
<_GitVersionScopePath>
<EscapedPath>$([MSBuild]::EnsureTrailingSlash($([MSBuild]::MakeRelative('$(MSBuildThisFileDirectory)..\',
'%(Identity)'))).Replace('\', '/').Replace('.', '\.').Replace('/', '\/'))</EscapedPath>
</_GitVersionScopePath>
</ItemGroup>
<PropertyGroup>
<_GitVersionIgnorePattern>^(?!@(_GitVersionScopePath->'%(EscapedPath)',
'|')|Directory\.Packages\.props|GitVersion\.yml).*</_GitVersionIgnorePattern>
<_GitVersionTemplateContent>$([System.IO.File]::ReadAllText('$(GitVersionTemplateFile)'))</_GitVersionTemplateContent>
<_GitVersionRenderedContent>$([System.Text.RegularExpressions.Regex]::Replace('$(_GitVersionTemplateContent)',
'$(_GitVersionIgnorePathsRegex)', '$1$(_GitVersionIgnorePattern)'))</_GitVersionRenderedContent>
</PropertyGroup>
<Error Condition="'$(_GitVersionRenderedContent)' == '$(_GitVersionTemplateContent)'"
Text="GenerateProjectGitVersionConfig: could not find an ignore.paths entry to rewrite in $(GitVersionTemplateFile) for $(MSBuildProjectName) -- check its ignore.paths structure." />
<WriteLinesToFile File="$(MSBuildProjectDirectory)\GitVersion.yml"
Lines="$(_GitVersionRenderedContent)"
Overwrite="true" WriteOnlyWhenDifferent="true" />
</Target>
<PropertyGroup Label="Changelog per-project scoping">
<!-- GenerateChangelogFromGit (root Directory.Build.targets) walks direct ProjectReference
directories when this is true. A dependency's own changes belong in its own changelog/version,
not copied here (that would misattribute a dependency's commit as this project's own change):
scope to this project's own directory only. -->
<ChangeLogIncludeReferences>false</ChangeLogIncludeReferences>
</PropertyGroup>
</Project> </Project>
+21
View File
@@ -0,0 +1,21 @@
<Project>
<ImportGroup
Condition="Exists($([MSBuild]::GetPathOfFileAbove('Directory.Build.targets', '$(MSBuildThisFileDirectory)../'))) == 'true'">
<Import
Project="$([MSBuild]::GetPathOfFileAbove('Directory.Build.targets', '$(MSBuildThisFileDirectory)../'))" />
</ImportGroup>
<!-- Overrides the root's CreateReleaseNotesFromFile: its Condition="Exists('$(ChangeLogPath)')" is
evaluated before its own DependsOnTargets="GenerateChangelogFromGit" has run, so on a clean build the file
never exists yet and PackageReleaseNotes silently never gets set. Moving the existence check onto the
task (evaluated after the dependency runs) instead of the target fixes the ordering. -->
<Target Name="CreateReleaseNotesFromFile" BeforeTargets="GenerateNuspec"
DependsOnTargets="GenerateChangelogFromGit">
<ReadLinesFromFile File="$(ChangeLogPath)" Condition="Exists('$(ChangeLogPath)')">
<Output TaskParameter="Lines" ItemName="ReleaseNoteLines" />
</ReadLinesFromFile>
<PropertyGroup Condition="Exists('$(ChangeLogPath)')">
<PackageReleaseNotes>@(ReleaseNoteLines, '%0a')</PackageReleaseNotes>
</PropertyGroup>
</Target>
</Project>