Skip to content

Commit b89b7cb

Browse files
authored
Merge pull request #4349 from JoeRobich/build-net6-assets
Support building launch assets for NET6-NET9 projects
2 parents e8cfe10 + 84da799 commit b89b7cb

File tree

3 files changed

+46
-24
lines changed

3 files changed

+46
-24
lines changed

src/assets.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ export class AssetGenerator {
161161
const startupProjectDir = path.dirname(this.startupProject.Path);
162162
const relativeProjectDir = path.join('${workspaceFolder}', path.relative(this.workspaceFolder.uri.fsPath, startupProjectDir));
163163
const configurationName = 'Debug';
164-
const targetFramework = protocol.findNetCoreAppTargetFramework(this.startupProject) ?? protocol.findNet5TargetFramework(this.startupProject);
164+
const targetFramework = protocol.findNetCoreTargetFramework(this.startupProject);
165165
const result = path.join(relativeProjectDir, `bin/${configurationName}/${targetFramework.ShortName}/${this.startupProject.AssemblyName}.dll`);
166166
return result;
167167
}

src/omnisharp/protocol.ts

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -865,27 +865,32 @@ export function findNetFrameworkTargetFramework(project: MSBuildProject): Target
865865
return project.TargetFrameworks.find(tf => regexp.test(tf.ShortName));
866866
}
867867

868-
export function findNet5TargetFramework(project: MSBuildProject): TargetFramework {
869-
const targetFramework = project.TargetFrameworks.find(tf => tf.ShortName.startsWith('net5'));
870-
// Temprorary workaround until changes to support the net5.0 TFM is settled. Some NuGet
871-
// builds report the shortname as net50.
872-
if (targetFramework !== undefined) {
873-
targetFramework.ShortName = "net5.0";
874-
}
875-
return targetFramework;
868+
export function findNetCoreTargetFramework(project: MSBuildProject): TargetFramework {
869+
return findNetCoreAppTargetFramework(project) ?? findModernNetFrameworkTargetFramework(project);
876870
}
877871

878872
export function findNetCoreAppTargetFramework(project: MSBuildProject): TargetFramework {
879873
return project.TargetFrameworks.find(tf => tf.ShortName.startsWith('netcoreapp'));
880874
}
881875

876+
export function findModernNetFrameworkTargetFramework(project: MSBuildProject): TargetFramework {
877+
let regexp = new RegExp('^net[5-9]');
878+
const targetFramework = project.TargetFrameworks.find(tf => regexp.test(tf.ShortName));
879+
880+
// Shortname is being reported as net50 instead of net5.0
881+
if (targetFramework !== undefined && targetFramework.ShortName.charAt(4) !== ".") {
882+
targetFramework.ShortName = targetFramework.ShortName.substr(0, 4) + "." + targetFramework.ShortName.substr(4);
883+
}
884+
885+
return targetFramework;
886+
}
887+
882888
export function findNetStandardTargetFramework(project: MSBuildProject): TargetFramework {
883889
return project.TargetFrameworks.find(tf => tf.ShortName.startsWith('netstandard'));
884890
}
885891

886892
export function isDotNetCoreProject(project: MSBuildProject): Boolean {
887-
return findNet5TargetFramework(project) !== undefined ||
888-
findNetCoreAppTargetFramework(project) !== undefined ||
893+
return findNetCoreTargetFramework(project) !== undefined ||
889894
findNetStandardTargetFramework(project) !== undefined ||
890895
findNetFrameworkTargetFramework(project) !== undefined;
891896
}
@@ -928,8 +933,7 @@ export function findExecutableMSBuildProjects(projects: MSBuildProject[]) {
928933
let result: MSBuildProject[] = [];
929934

930935
projects.forEach(project => {
931-
const projectIsNotNetFramework = findNetCoreAppTargetFramework(project) !== undefined
932-
|| findNet5TargetFramework(project) !== undefined
936+
const projectIsNotNetFramework = findNetCoreTargetFramework(project) !== undefined
933937
|| project.IsBlazorWebAssemblyStandalone;
934938

935939
if (project.IsExe && projectIsNotNetFramework) {

test/featureTests/assets.test.ts

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -73,17 +73,35 @@ suite("Asset generation: csproj", () => {
7373
segments.should.deep.equal(['${workspaceFolder}', 'bin', 'Debug', 'netcoreapp1.0', 'testApp.dll']);
7474
});
7575

76-
test("Create launch.json for NET 5 project opened in workspace", () => {
77-
let rootPath = path.resolve('testRoot');
78-
let info = createMSBuildWorkspaceInformation(path.join(rootPath, 'testApp.csproj'), 'testApp', 'net5.0', /*isExe*/ true);
79-
let generator = new AssetGenerator(info, createMockWorkspaceFolder(rootPath));
80-
generator.setStartupProject(0);
81-
let launchJson = parse(generator.createLaunchJsonConfigurations(ProgramLaunchType.Console), undefined, { disallowComments: true });
82-
let programPath = launchJson[0].program;
83-
84-
// ${workspaceFolder}/bin/Debug/net5.0/testApp.dll
85-
let segments = programPath.split(path.posix.sep);
86-
segments.should.deep.equal(['${workspaceFolder}', 'bin', 'Debug', 'net5.0', 'testApp.dll']);
76+
[5, 6, 7, 8, 9].forEach(version => {
77+
const shortName = `net${version}.0`;
78+
const alternameShortName = `net${version}0`;
79+
80+
test(`Create launch.json for NET ${version} project opened in workspace with shortname '${shortName}'`, () => {
81+
let rootPath = path.resolve('testRoot');
82+
let info = createMSBuildWorkspaceInformation(path.join(rootPath, 'testApp.csproj'), 'testApp', shortName, /*isExe*/ true);
83+
let generator = new AssetGenerator(info, createMockWorkspaceFolder(rootPath));
84+
generator.setStartupProject(0);
85+
let launchJson = parse(generator.createLaunchJsonConfigurations(ProgramLaunchType.Console), undefined, { disallowComments: true });
86+
let programPath = launchJson[0].program;
87+
88+
// ${workspaceFolder}/bin/Debug/net#.0/testApp.dll
89+
let segments = programPath.split(path.posix.sep);
90+
segments.should.deep.equal(['${workspaceFolder}', 'bin', 'Debug', shortName, 'testApp.dll']);
91+
});
92+
93+
test(`Create launch.json for NET ${version} project opened in workspace with shortname '${alternameShortName}'`, () => {
94+
let rootPath = path.resolve('testRoot');
95+
let info = createMSBuildWorkspaceInformation(path.join(rootPath, 'testApp.csproj'), 'testApp', alternameShortName, /*isExe*/ true);
96+
let generator = new AssetGenerator(info, createMockWorkspaceFolder(rootPath));
97+
generator.setStartupProject(0);
98+
let launchJson = parse(generator.createLaunchJsonConfigurations(ProgramLaunchType.Console), undefined, { disallowComments: true });
99+
let programPath = launchJson[0].program;
100+
101+
// ${workspaceFolder}/bin/Debug/net#.0/testApp.dll
102+
let segments = programPath.split(path.posix.sep);
103+
segments.should.deep.equal(['${workspaceFolder}', 'bin', 'Debug', shortName, 'testApp.dll']);
104+
});
87105
});
88106

89107
test("Create launch.json for nested project opened in workspace", () => {

0 commit comments

Comments
 (0)