-
Notifications
You must be signed in to change notification settings - Fork 62
Expand file tree
/
Copy pathNetSdkDebugHelper.ts
More file actions
145 lines (125 loc) · 7.45 KB
/
NetSdkDebugHelper.ts
File metadata and controls
145 lines (125 loc) · 7.45 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See LICENSE.md in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { composeArgs, withNamedArg } from "@microsoft/vscode-processutils";
import * as path from "path";
import { WorkspaceFolder, commands, l10n, tasks } from "vscode";
import { ext } from "../../extensionVariables";
import { NetChooseBuildTypeContext, netContainerBuild } from "../../scaffolding/wizard/net/NetContainerBuild";
import { AllNetContainerBuildOptions, NetContainerBuildOptionsKey } from "../../scaffolding/wizard/net/NetSdkChooseBuildStep";
import { NetSdkRunTaskDefinition, netSdkRunTaskProvider } from "../../tasks/netSdk/NetSdkRunTaskProvider";
import { normalizeArchitectureToRidArchitecture, normalizeOsToRidOs } from "../../tasks/netSdk/netSdkTaskUtils";
import { NetCoreTaskHelper } from "../../tasks/netcore/NetCoreTaskHelper";
import { getNetCoreProjectInfo } from "../../utils/netCoreUtils";
import { getDockerOSType } from "../../utils/osUtils";
import { PlatformOS } from "../../utils/platform";
import { resolveVariables, unresolveWorkspaceFolder } from "../../utils/resolveVariables";
import { DockerDebugContext, DockerDebugScaffoldContext, ResolvedDebugConfiguration, inferContainerName } from "../DebugHelper";
import { DockerDebugConfiguration } from "../DockerDebugConfigurationProvider";
import { NetCoreDebugHelper, NetCoreDebugScaffoldingOptions, NetCoreProjectProperties } from "../netcore/NetCoreDebugHelper";
interface NetSdkProjectProperties extends NetCoreProjectProperties {
containerWorkingDirectory: string;
isSdkContainerSupportEnabled: boolean;
imageName: string;
}
export class NetSdkDebugHelper extends NetCoreDebugHelper {
public override async provideDebugConfigurations(context: DockerDebugScaffoldContext, options?: NetCoreDebugScaffoldingOptions): Promise<DockerDebugConfiguration[]> {
const configurations: DockerDebugConfiguration[] = [];
const netCoreBuildContext: NetChooseBuildTypeContext = {
...context.actionContext,
scaffoldType: 'debugging',
workspaceFolder: context.folder,
};
await netContainerBuild(netCoreBuildContext); // prompt user whether to use .NET container SDK build
if (netCoreBuildContext?.containerBuildOption === AllNetContainerBuildOptions[1]) {
options = options || {};
options.appProject = options.appProject || await NetCoreTaskHelper.inferAppProject(context); // This method internally checks the user-defined input first
configurations.push({
name: 'Containers: .NET Container SDK Launch',
type: 'docker',
request: 'launch',
netCore: {
appProject: unresolveWorkspaceFolder(options.appProject, context.folder),
buildWithSdk: true,
},
});
} else {
await commands.executeCommand('vscode-containers.configure');
}
return configurations;
}
public override async resolveDebugConfiguration(context: DockerDebugContext, debugConfiguration: DockerDebugConfiguration): Promise<ResolvedDebugConfiguration | undefined> {
try {
return await super.resolveDebugConfiguration(context, debugConfiguration);
} catch (error) {
await ext.context.workspaceState.update(NetContainerBuildOptionsKey, '');
throw error;
}
}
public async afterResolveDebugConfiguration(context: DockerDebugContext, debugConfiguration: DockerDebugConfiguration): Promise<void> {
const runDefinition: Omit<NetSdkRunTaskDefinition, "type"> = {
netCore: {
appProject: debugConfiguration.netCore.appProject,
},
dockerRun: {
image: context.runDefinition.dockerRun.image,
}
};
const { task, promise } = netSdkRunTaskProvider.createNetSdkRunTask(runDefinition);
await tasks.executeTask(task);
await promise;
}
protected override async loadExternalInfo(context: DockerDebugContext, debugConfiguration: DockerDebugConfiguration): Promise<{ configureSsl: boolean, containerName: string, platformOS: PlatformOS }> {
const projectProperties = await this.getProjectProperties(debugConfiguration, context.folder);
debugConfiguration.netCore.appOutput = await this.normalizeAppOutput(projectProperties.containerWorkingDirectory, projectProperties.isSdkContainerSupportEnabled);
context.runDefinition = {
...context.runDefinition,
dockerRun: {
containerName: inferContainerName(debugConfiguration, context, projectProperties.imageName, "dev"),
image: projectProperties.imageName,
},
netCore: {
enableDebugging: true,
}
};
return {
configureSsl: false,
containerName: context.runDefinition.dockerRun.containerName,
platformOS: await getDockerOSType() === "windows" ? 'Windows' : 'Linux',
};
}
protected override inferAppContainerOutput(appOutput: string, platformOS: PlatformOS): string {
return appOutput;
}
protected override async getProjectProperties(debugConfiguration: DockerDebugConfiguration, folder?: WorkspaceFolder): Promise<NetSdkProjectProperties> {
const ridOS = await normalizeOsToRidOs();
const ridArchitecture = await normalizeArchitectureToRidArchitecture();
const additionalProperties = composeArgs(
withNamedArg('-p:ContainerRuntimeIdentifier', `"${ridOS}-${ridArchitecture}"`, { assignValue: true }), // We have to pre-quote the RID because we cannot simultaneously use `assignValue` and `shouldQuote`
)();
const resolvedAppProject = resolveVariables(debugConfiguration.netCore?.appProject, folder);
const projectInfo = await getNetCoreProjectInfo(resolvedAppProject, additionalProperties);
if (!projectInfo.enableSdkContainerSupport) {
throw new Error(l10n.t("Your current project configuration or .NET SDK version doesn't support SDK Container build. Please choose a compatible project or update .NET SDK."));
}
return {
assemblyName: projectInfo.assemblyName,
targetFramework: projectInfo.targetFrameworks[0],
appOutput: projectInfo.assemblyRelativeOutputPath,
containerWorkingDirectory: projectInfo.assemblyContainerPath,
isSdkContainerSupportEnabled: projectInfo.enableSdkContainerSupport,
imageName: projectInfo.imageName,
};
}
private async normalizeAppOutput(unnormalizedContainerWorkingDirectory: string, isSdkContainerSupportEnabled: boolean): Promise<string> {
if (isSdkContainerSupportEnabled) {
return await getDockerOSType() === 'windows'
? path.win32.normalize(unnormalizedContainerWorkingDirectory)
: path.posix.normalize(unnormalizedContainerWorkingDirectory);
} else {
throw new Error(l10n.t("Your current project configuration or .NET SDK version doesn't support SDK Container build. Please choose a compatible project or update .NET SDK."));
}
}
}
export const netSdkDebugHelper = new NetSdkDebugHelper();