Azure / Azure/azure-functions-core-tools

[In-Proc] Remove .NET 6 in-proc target

Open
#4,802 0 comments 0 reactions 0 assignees View on GitHub
design
Dominant language
C#
Stars
1.5k
Forks
498
Avg merge
4d 20h
Merged PRs (30d)
14

Description

## Background

The Azure Functions host will eventually stop servicing .NET 6 in-process. Once that happens, the `in-proc` branch of Core Tools should target **.NET 8 only** for in-proc support. This issue tracks the planning and work required to cleanly remove the `net6.0` target framework from the in-proc build.

The codebase currently multi-targets `net6.0` and `net8.0`, with net6-specific logic spread across ~18 files spanning the CLI project, build system, CI pipelines, static resources, and tests.

## Scope

This change applies **only** to the `in-proc` branch. The `main` branch (OOP/isolated) is unaffected.

## Work Items

### 1. Project files — remove `net6.0` from `TargetFrameworks`

- **`src/Azure.Functions.Cli/Azure.Functions.Cli.csproj`**
- Change `net6.0;net8.0` → `net8.0`
- Remove the `net6.0`-only `PropertyGroup` (lines 23-27) that gates `IsPackable`, `PackAsTool`, and `ToolCommandName` — move these to the default or the `net8.0` condition.
- Remove the `net8.0`-only `false` group (lines 28-30) since net8 becomes the only TFM and should now be packable.
- Remove the `net6.0` conditional `ItemGroup` for `System.Text.Json` (v6.0.11). Keep the `net8.0` group or make it unconditional.
- **`test/Azure.Functions.Cli.Tests/Azure.Functions.Cli.Tests.csproj`**
- Change `net6.0;net8.0` → `net8.0`

### 2. C# code — remove net6 constants, helpers, and conditional logic

- **`src/Azure.Functions.Cli/Common/TargetFramework.cs`**
- Remove `public const string net6 = "net6.0";`
- **`src/Azure.Functions.Cli/Helpers/TargetFrameworkHelper.cs`**
- Remove `TargetFramework.net6` from `supportedTargetFrameworks` and `supportedInProcTargetFrameworks` arrays.
- **`src/Azure.Functions.Cli/Common/Utilities.cs`**
- Remove `#if NET6_0` preprocessor branch (line ~50).
- **`src/Azure.Functions.Cli/Actions/HostActions/StartHostAction.cs`**
- Remove unused `Net6FrameworkDescriptionPrefix` constant.
- **`src/Azure.Functions.Cli/Actions/LocalActions/InitAction.cs`**
- Change `DefaultInProcTargetFramework` from `net6` to `net8`.
- Update `ValidateTargetFramework` fallback.
- Update Dockerfile selection logic that falls through to net6 isolated Dockerfile.
- **`src/Azure.Functions.Cli/Helpers/DotnetHelpers.cs`**
- Remove/update comment about .NET 6.0 `dotnet new` short name behavior.
- **`src/Azure.Functions.Cli/Actions/AzureActions/PublishFunctionAppAction.cs`**
- Remove help text referencing `.NET 6`.

### 3. Build system — remove `--inproc6` path

- **`build/BuildSteps.cs`**
- Remove `Net6TargetFramework` constant and `Net6TargetFrameworkArgument` (`--inproc6`).
- Simplify `Initialize()` — default target framework is always `net8.0`.
- Remove conditional `NoWorkers` flag that was net6-specific.
- Remove/simplify language worker removal logic tied to the net6 build.
- **`build/Settings.cs`**
- Change default `TargetFramework` from `"net6.0"` to `"net8.0"` (line ~180, used for nupkg publish path).
- **`build.ps1`**
- Remove `inproc6` artifact target framework option.
- **`pipelineUtilities.psm1`**
- Remove .NET 6.0 SDK entry from `$DotnetSDKVersionRequirements`.
- **`validateWorkerVersions.ps1`**
- Remove `"net6.0" { "6" }` case from the TFM → digit switch.
- Default `$TargetFramework` parameter to `"net8.0"` (already the default — just verify).

### 4. CI/CD pipelines — remove inproc6 build jobs

- **`eng/ci/public-build.yml`**
- Remove the `BuildInproc6` job and its `artifactTargetFramework: inproc6` / `tfm: net6.0` parameters.
- **`eng/ci/official-build.yml`**
- Remove the `BuildInproc6` job, the `func-cli-inproc6` artifact publication step, and related `targetPath` entries.
- **`eng/ci/templates/public/jobs/build-test-public.yml`**
- Remove `.NET 6.0` SDK install steps.
- **`eng/ci/templates/official/jobs/build-test.yml`**
- Remove `.NET 6.0` SDK install steps.

### 5. NuGet packaging

- **`src/Azure.Functions.Cli/Azure.Functions.Cli.nuspec`**
- Currently uses `$targetFramework$` which resolves to `net6.0` since only the net6 build was packable. After the change, this will resolve to `net8.0`. Verify the nuspec paths and NuGet tool pack still work correctly.
- **`src/Azure.Functions.Cli/Azure.Functions.Cli.csproj`**
- Ensure `NuspecProperties` passes the correct `targetFramework` value.

### 6. Static resources

- **`src/Azure.Functions.Cli/StaticResources/stacks.json`**
- Remove the `.NET 6 In-process` / `dotnet6` stack entry (lines ~243-290).
- Evaluate whether `.NET 6 Isolated` (`dotnet6isolated`, lines ~145-198) should also be removed — this depends on OOP servicing, not just in-proc. May be out of scope.
- **`src/Azure.Functions.Cli/StaticResources/Dockerfile.dotnetIsolated`**
- This is the net6 isolated Dockerfile (`dotnet-isolated:4-dotnet-isolated6.0`). Evaluate whether it should be removed or kept for OOP compatibility.
- **`src/Azure.Functions.Cli/StaticResources/Dockerfile.dotnet`**
- This is the net6 in-proc Dockerfile. Remove it.

### 7. Tests

- **`test/Azure.Functions.Cli.Tests/E2E/InitTests.cs`**
- Update assertion that expects `"Valid options are net8.0, net6.0"` — net6 will no longer be valid.
- Remove `[InlineData("dotnet-isolated", "4", "net6.0")]` test case for Dockerfile init.
- **`test/Azure.Functions.Cli.Tests/ZipHelperTests.cs`**
- Remove/update comment referencing net6.

### 8. VS Code workspace config (optional / local-only)

- **`.vscode/launch.json`** — Update debug program path from `net6.0` to `net8.0`.
- **`.vscode/tasks.json`** — Remove `"net6.0"` from the `pickString` publish target framework options.

## Sequencing / Prerequisites

1. **Confirm host EOL date for .NET 6 in-proc** — align this work with the host team's timeline.
2. **Land the per-TFM InProc package split first** (see related issue) — this allows us to stop updating the net6 InProc version immediately, even before fully removing it.
3. **Coordinate with downstream consumers** (VS, VS Code extension, VS for Mac) that may depend on the net6 build artifacts (`func-cli-inproc6`).
4. **Execute the removal** per the work items above.
5. **Validate** — full CI pass, `func start` with .NET 8 in-proc app, NuGet pack, publish across all RIDs.

## Risk / Open Questions

- **NuGet tool packaging** — The `PackAsTool` property was gated on `net6.0`. After moving it to `net8.0`, verify the global tool install (`dotnet tool install -g Azure.Functions.CoreTools`) still works.
- **Downstream artifact names** — Pipelines publish artifacts like `func-cli-inproc6`. Consumers that reference this artifact name will break. Requires coordination.
- **Isolated .NET 6 support** — Removing net6 *in-proc* doesn't necessarily mean removing net6 *isolated* stacks/Dockerfiles. Clarify scope with the team.

Contributor guide

Open the contributing guide

Research direction

Start by confirming the host EOL timeline, the related per-TFM InProc package split, and downstream consumers of func-cli-inproc6. Then inspect the listed project files, BuildSteps.cs, pipeline definitions, static resources, and InitTests.cs to map the net6 paths. Done means net8-only in-proc builds, working NuGet packaging and publishing, updated resources and tests, and a full CI pass without breaking isolated support.

Written by the indexing model from the issue text.

Assessment

Tech stack
azure, csharp, docker, github-actions, powershell
Domain
build-system, ci-cd, cli, release, testing
Issue type
Refactor
Difficulty
5/5
Estimated time
Over a week
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
30/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.