Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/copilot-instructions.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ Testing:
- Examples:
- `dotnet test test/dotnet.Tests/dotnet.Tests.csproj --filter "Name~ItShowsTheAppropriateMessageToTheUser"`
- `dotnet exec artifacts/bin/redist/Debug/dotnet.Tests.dll -method "*ItShowsTheAppropriateMessageToTheUser*"`
- For incremental test runs of `dotnet.Tests` (avoids slow full `build.cmd`), see the skill at `.github/copilot/skills/incremental-test.md`. In short: build only the modified projects, copy their output DLLs into the redist SDK layout, then run the tests.
- To test CLI command changes:
- Build the redist SDK: `./build.sh` from repo root
- Create a dogfood environment: `source eng/dogfood.sh`
Expand Down
103 changes: 103 additions & 0 deletions .github/copilot/skills/incremental-test.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
# Incremental Test Runner for dotnet.Tests

This skill enables fast incremental test runs of `dotnet.Tests` without a full `build.cmd` rebuild.
Use it after making source code changes to quickly build only the modified projects and deploy their outputs into the redist SDK layout so tests can run against them.

## Prerequisites

A full build must have been completed at least once (via `build.cmd` or `build.sh`) so that the redist SDK layout exists at `artifacts\bin\redist\Debug\dotnet\sdk\<version>\`.

Comment thread
jjonescz marked this conversation as resolved.
Outdated
## When to use

Use this skill when you need to run `dotnet.Tests` after modifying source code in one or more SDK projects. It avoids the slow full `build.cmd` by only rebuilding the changed projects and copying their output DLLs into the redist layout.

## Workflow

### Step 1: Identify modified projects

Determine which projects have been modified. Use context from:
- The files you just edited in this session.
- Or `git status`/`git diff` to find changed `.cs` files and map them to their `.csproj` projects.

### Step 2: Build modified projects

Build each modified project individually using the repo-local dotnet:

```
.\.dotnet\dotnet build <path-to-project.csproj>
```
Comment thread
jjonescz marked this conversation as resolved.

For example:
```
.\.dotnet\dotnet build src\Cli\Microsoft.DotNet.Cli.Utils\Microsoft.DotNet.Cli.Utils.csproj
```

If the `dotnet` CLI project itself was modified, build it:
```
.\.dotnet\dotnet build src\Cli\dotnet\dotnet.csproj
```

### Step 3: Copy output DLLs to the redist SDK layout

Discover the SDK version directory name:
```powershell
$sdkVersion = (Get-ChildItem artifacts\bin\redist\Debug\dotnet\sdk -Directory).Name
Comment thread
jjonescz marked this conversation as resolved.
Outdated
```

For each modified project, copy its output DLL (and any satellite assemblies) from the project's build output to the redist SDK directory:

```
Source: artifacts\bin\<ProjectName>\Debug\net10.0\<AssemblyName>.dll
Target: artifacts\bin\redist\Debug\dotnet\sdk\<version>\
```

For example:
```powershell
Copy-Item artifacts\bin\Microsoft.DotNet.ProjectTools\Debug\net10.0\Microsoft.DotNet.ProjectTools.dll artifacts\bin\redist\Debug\dotnet\sdk\$sdkVersion\
Copy-Item artifacts\bin\Microsoft.DotNet.Cli.Utils\Debug\net10.0\Microsoft.DotNet.Cli.Utils.dll artifacts\bin\redist\Debug\dotnet\sdk\$sdkVersion\
```

The `dotnet` project is special — it builds into `artifacts\bin\dotnet\Debug\net10.0\` and its `dotnet.dll` must be copied to the SDK directory:
```powershell
Copy-Item artifacts\bin\dotnet\Debug\net10.0\dotnet.dll artifacts\bin\redist\Debug\dotnet\sdk\$sdkVersion\
```

**Important notes:**
- Only copy DLLs that are **already present** in the target directory. If a DLL doesn't exist in the redist SDK dir, it probably doesn't belong there.
Comment thread
jjonescz marked this conversation as resolved.
Outdated
- Some projects multi-target (e.g., `net10.0` and `net472`). Always use the `net10.0` output.
- If localization resource DLLs were changed (in subdirectories like `cs\`, `de\`, etc.), copy those too.

### Step 4: Build the test project (if test code was modified)

The test project `test\dotnet.Tests\dotnet.Tests.csproj` outputs directly to `artifacts\bin\redist\Debug\` (via `TestHostFolder`), so just build it:

```
.\.dotnet\dotnet build test\dotnet.Tests\dotnet.Tests.csproj
```

### Step 5: Run the tests

Run specific tests:
```
.\.dotnet\dotnet exec artifacts\bin\redist\Debug\dotnet.Tests.dll -method "*TestMethodName*"
```

Or run filtered tests via `dotnet test`:
```
.\.dotnet\dotnet test test\dotnet.Tests\dotnet.Tests.csproj --no-build --filter "Name~TestMethodName"
```

## Common project paths

| Assembly | Project Path |
|---|---|
| `dotnet.dll` | `src\Cli\dotnet\dotnet.csproj` |
| `Microsoft.DotNet.Cli.Utils.dll` | `src\Cli\Microsoft.DotNet.Cli.Utils\Microsoft.DotNet.Cli.Utils.csproj` |
| `Microsoft.DotNet.Cli.Definitions.dll` | `src\Cli\Microsoft.DotNet.Cli.Definitions\Microsoft.DotNet.Cli.Definitions.csproj` |
| `Microsoft.DotNet.Cli.CoreUtils.dll` | `src\Cli\Microsoft.DotNet.Cli.CoreUtils\Microsoft.DotNet.Cli.CoreUtils.csproj` |
| `Microsoft.DotNet.Configurer.dll` | `src\Cli\Microsoft.DotNet.Configurer\Microsoft.DotNet.Configurer.csproj` |
| `Microsoft.DotNet.ProjectTools.dll` | `src\Microsoft.DotNet.ProjectTools\Microsoft.DotNet.ProjectTools.csproj` |
| `Microsoft.DotNet.NativeWrapper.dll` | `src\Resolvers\Microsoft.DotNet.NativeWrapper\Microsoft.DotNet.NativeWrapper.csproj` |
| `Microsoft.DotNet.TemplateLocator.dll` | `src\Microsoft.DotNet.TemplateLocator\Microsoft.DotNet.TemplateLocator.csproj` |
| `Microsoft.DotNet.InternalAbstractions.dll` | `src\Cli\Microsoft.DotNet.InternalAbstractions\Microsoft.DotNet.InternalAbstractions.csproj` |
| `dotnet.Tests.dll` | `test\dotnet.Tests\dotnet.Tests.csproj` |
Loading