Skip to content

Commit 075c94a

Browse files
committed
Refactor and add tasks to acquire xaml dependencies
1 parent a4075e3 commit 075c94a

File tree

3 files changed

+87
-80
lines changed

3 files changed

+87
-80
lines changed

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@
4141
"omniSharp": "1.39.11",
4242
"razor": "7.0.0-preview.24178.4",
4343
"razorOmnisharp": "7.0.0-preview.23363.1",
44-
"razorTelemetry": "7.0.0-preview.24178.4"
44+
"razorTelemetry": "7.0.0-preview.24178.4",
45+
"xamlDesignTools": "17.11.34810.23"
4546
},
4647
"main": "./dist/extension",
4748
"l10n": "./l10n",

tasks/offlinePackagingTasks.ts

Lines changed: 84 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import {
2424
nugetTempPath,
2525
rootPath,
2626
devKitDependenciesDirectory,
27+
xamlDesignToolsDirectory,
2728
} from '../tasks/projectPaths';
2829
import { getPackageJSON } from '../tasks/packageJson';
2930
import { createPackageAsync } from '../tasks/vsceTasks';
@@ -56,6 +57,35 @@ export const platformSpecificPackages: VSIXPlatformInfo[] = [
5657
{ vsceTarget: 'darwin-arm64', rid: 'osx-arm64', platformInfo: new PlatformInformation('darwin', 'arm64') },
5758
];
5859

60+
interface NugetPackageInfo {
61+
getPackageName: (platformInfo: VSIXPlatformInfo | undefined) => string;
62+
packageJsonName: string;
63+
getPackageContentPath: (platformInfo: VSIXPlatformInfo | undefined) => string;
64+
vsixOutputPath: string;
65+
}
66+
67+
// Set of NuGet packages that we need to download and install.
68+
export const nugetPackageInfo: { [key: string]: NugetPackageInfo } = {
69+
roslyn: {
70+
getPackageName: (platformInfo) => `Microsoft.CodeAnalysis.LanguageServer.${platformInfo?.rid ?? 'neutral'}`,
71+
packageJsonName: 'roslyn',
72+
getPackageContentPath: (platformInfo) => path.join('content', 'LanguageServer', platformInfo?.rid ?? 'neutral'),
73+
vsixOutputPath: languageServerDirectory,
74+
},
75+
roslynDevKit: {
76+
getPackageName: (_platformInfo) => 'Microsoft.VisualStudio.LanguageServices.DevKit',
77+
packageJsonName: 'roslyn',
78+
getPackageContentPath: (_platformInfo) => 'content',
79+
vsixOutputPath: devKitDependenciesDirectory,
80+
},
81+
xamlDesignTools: {
82+
getPackageName: (_platformInfo) => 'Microsoft.VisualStudio.DesignToolsBase',
83+
packageJsonName: 'xamlDesignTools',
84+
getPackageContentPath: (_platformInfo) => '',
85+
vsixOutputPath: xamlDesignToolsDirectory,
86+
},
87+
};
88+
5989
const vsixTasks: string[] = [];
6090
for (const p of platformSpecificPackages) {
6191
let platformName: string;
@@ -100,11 +130,12 @@ gulp.task('installDependencies', async () => {
100130
const packageJSON = getPackageJSON();
101131

102132
const platform = await PlatformInformation.GetCurrent();
133+
const vsixPlatformInfo = platformSpecificPackages.find(
134+
(p) => p.platformInfo.platform === platform.platform && p.platformInfo.architecture === platform.architecture
135+
)!;
103136

104137
try {
105-
await installRoslyn(packageJSON, platform);
106-
await installDebugger(packageJSON, platform);
107-
await installRazor(packageJSON, platform);
138+
acquireAndInstallAllNugetPackages(vsixPlatformInfo, packageJSON, true);
108139
} catch (err) {
109140
const message = (err instanceof Error ? err.stack : err) ?? '<unknown error>';
110141
// NOTE: Extra `\n---` at the end is because gulp will print this message following by the
@@ -113,52 +144,75 @@ gulp.task('installDependencies', async () => {
113144
}
114145
});
115146

147+
// Defines a special task to acquire all the platform specific Roslyn packages.
148+
// All packages need to be saved to the consumption AzDo artifacts feed, for non-platform
149+
// specific packages this only requires running the installDependencies tasks. However for Roslyn packages
150+
// we need to acquire the nuget packages once for each platform to ensure they get saved to the feed.
116151
gulp.task(
117152
'updateRoslynVersion',
118153
// Run the fetch of all packages, and then also installDependencies after
119154
gulp.series(async () => {
120155
const packageJSON = getPackageJSON();
121156

122157
// Fetch the neutral package that we don't otherwise have in our platform list
123-
await acquireRoslyn(packageJSON, undefined, true);
158+
await acquireNugetPackage(nugetPackageInfo.roslyn, undefined, packageJSON, true);
124159

125160
// And now fetch each platform specific
126161
for (const p of platformSpecificPackages) {
127-
await acquireRoslyn(packageJSON, p.platformInfo, true);
162+
await acquireNugetPackage(nugetPackageInfo.roslyn, p, packageJSON, true);
128163
}
129164

130165
// Also pull in the Roslyn DevKit dependencies nuget package.
131-
await acquireRoslynDevKit(packageJSON, true);
166+
await acquireNugetPackage(nugetPackageInfo.RoslynDevKit, undefined, packageJSON, true);
132167
}, 'installDependencies')
133168
);
134169

135-
// Install Tasks
136-
async function installRoslyn(packageJSON: any, platformInfo?: PlatformInformation) {
137-
// Install the Roslyn language server bits.
138-
const { packagePath, serverPlatform } = await acquireRoslyn(packageJSON, platformInfo, false);
139-
await installNuGetPackage(
140-
packagePath,
141-
path.join('content', 'LanguageServer', serverPlatform),
142-
languageServerDirectory
143-
);
170+
async function acquireAndInstallAllNugetPackages(
171+
platformInfo: VSIXPlatformInfo | undefined,
172+
packageJSON: any,
173+
interactive: boolean
174+
) {
175+
for (const key in nugetPackageInfo) {
176+
const nugetPackage = nugetPackageInfo[key];
177+
const packagePath = await acquireNugetPackage(nugetPackage, platformInfo, packageJSON, interactive);
178+
await installNuGetPackage(packagePath, nugetPackage, platformInfo);
179+
}
180+
}
144181

145-
// Install Roslyn DevKit dependencies.
146-
const roslynDevKitPackagePath = await acquireRoslynDevKit(packageJSON, false);
147-
await installNuGetPackage(roslynDevKitPackagePath, 'content', devKitDependenciesDirectory);
182+
async function acquireNugetPackage(
183+
nugetPackageInfo: NugetPackageInfo,
184+
platformInfo: VSIXPlatformInfo | undefined,
185+
packageJSON: any,
186+
interactive: boolean
187+
) {
188+
const packageVersion = packageJSON.defaults[nugetPackageInfo.packageJsonName];
189+
const packageName = nugetPackageInfo.getPackageName(platformInfo);
190+
const packagePath = await restoreNugetPackage(packageName, packageVersion, interactive);
191+
return packagePath;
148192
}
149193

150-
async function installNuGetPackage(pathToPackage: string, contentPath: string, outputPath: string) {
194+
async function installNuGetPackage(
195+
pathToPackage: string,
196+
nugetPackageInfo: NugetPackageInfo,
197+
platformInfo: VSIXPlatformInfo | undefined
198+
) {
151199
// Get the directory containing the content.
152-
const contentDirectory = path.join(pathToPackage, contentPath);
200+
const pathToContentInNugetPackage = nugetPackageInfo.getPackageContentPath(platformInfo);
201+
const contentDirectory = path.join(pathToPackage, pathToContentInNugetPackage);
153202
if (!fs.existsSync(contentDirectory)) {
154-
throw new Error(`Failed to find NuGet package content at ${contentDirectory}`);
203+
throw new Error(
204+
`Failed to find NuGet package content at ${contentDirectory} for ${nugetPackageInfo.getPackageName(
205+
platformInfo
206+
)}`
207+
);
155208
}
156209

157210
const numFilesToCopy = fs.readdirSync(contentDirectory).length;
158211

159212
console.log(`Extracting content from ${contentDirectory}`);
160213

161-
// Copy the files to the language server directory.
214+
// Copy the files to the specified output directory.
215+
const outputPath = nugetPackageInfo.vsixOutputPath;
162216
fs.mkdirSync(outputPath);
163217
fsextra.copySync(contentDirectory, outputPath);
164218
const numCopiedFiles = fs.readdirSync(outputPath).length;
@@ -169,43 +223,6 @@ async function installNuGetPackage(pathToPackage: string, contentPath: string, o
169223
}
170224
}
171225

172-
async function acquireRoslyn(
173-
packageJSON: any,
174-
platformInfo: PlatformInformation | undefined,
175-
interactive: boolean
176-
): Promise<{ packagePath: string; serverPlatform: string }> {
177-
const roslynVersion = packageJSON.defaults.roslyn;
178-
179-
// Find the matching server RID for the current platform.
180-
let serverPlatform: string;
181-
if (platformInfo === undefined) {
182-
serverPlatform = 'neutral';
183-
} else {
184-
serverPlatform = platformSpecificPackages.find(
185-
(p) =>
186-
p.platformInfo.platform === platformInfo.platform &&
187-
p.platformInfo.architecture === platformInfo.architecture
188-
)!.rid;
189-
}
190-
191-
const packagePath = await acquireNugetPackage(
192-
`Microsoft.CodeAnalysis.LanguageServer.${serverPlatform}`,
193-
roslynVersion,
194-
interactive
195-
);
196-
return { packagePath, serverPlatform };
197-
}
198-
199-
async function acquireRoslynDevKit(packageJSON: any, interactive: boolean): Promise<string> {
200-
const roslynVersion = packageJSON.defaults.roslyn;
201-
const packagePath = await acquireNugetPackage(
202-
`Microsoft.VisualStudio.LanguageServices.DevKit`,
203-
roslynVersion,
204-
interactive
205-
);
206-
return packagePath;
207-
}
208-
209226
async function installRazor(packageJSON: any, platformInfo: PlatformInformation) {
210227
if (platformInfo === undefined) {
211228
const platformNeutral = new PlatformInformation('neutral', 'neutral');
@@ -243,7 +260,7 @@ async function installPackageJsonDependency(
243260
}
244261
}
245262

246-
async function acquireNugetPackage(packageName: string, packageVersion: string, interactive: boolean): Promise<string> {
263+
async function restoreNugetPackage(packageName: string, packageVersion: string, interactive: boolean): Promise<string> {
247264
packageName = packageName.toLocaleLowerCase();
248265
const packageOutputPath = path.join(nugetTempPath, packageName, packageVersion);
249266
if (fs.existsSync(packageOutputPath)) {
@@ -310,13 +327,7 @@ async function doPackageOffline(vsixPlatform: VSIXPlatformInfo | undefined) {
310327
if (vsixPlatform === undefined) {
311328
await buildVsix(packageJSON, packedVsixOutputRoot, prerelease);
312329
} else {
313-
await buildVsix(
314-
packageJSON,
315-
packedVsixOutputRoot,
316-
prerelease,
317-
vsixPlatform.vsceTarget,
318-
vsixPlatform.platformInfo
319-
);
330+
await buildVsix(packageJSON, packedVsixOutputRoot, prerelease, vsixPlatform);
320331
}
321332
} catch (err) {
322333
const message = (err instanceof Error ? err.stack : err) ?? '<unknown error>';
@@ -340,22 +351,16 @@ async function cleanAsync() {
340351
]);
341352
}
342353

343-
async function buildVsix(
344-
packageJSON: any,
345-
outputFolder: string,
346-
prerelease: boolean,
347-
vsceTarget?: string,
348-
platformInfo?: PlatformInformation
349-
) {
350-
await installRoslyn(packageJSON, platformInfo);
354+
async function buildVsix(packageJSON: any, outputFolder: string, prerelease: boolean, platformInfo?: VSIXPlatformInfo) {
355+
await acquireAndInstallAllNugetPackages(platformInfo, packageJSON, false);
351356

352357
if (platformInfo != null) {
353-
await installRazor(packageJSON, platformInfo);
354-
await installDebugger(packageJSON, platformInfo);
358+
await installRazor(packageJSON, platformInfo.platformInfo);
359+
await installDebugger(packageJSON, platformInfo.platformInfo);
355360
}
356361

357-
const packageFileName = getPackageName(packageJSON, vsceTarget);
358-
await createPackageAsync(outputFolder, prerelease, packageFileName, vsceTarget);
362+
const packageFileName = getPackageName(packageJSON, platformInfo?.vsceTarget);
363+
await createPackageAsync(outputFolder, prerelease, packageFileName, platformInfo?.vsceTarget);
359364
}
360365

361366
function getPackageName(packageJSON: any, vscodePlatformId?: string) {

tasks/projectPaths.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ export const packedVsixOutputRoot = commandLineOptions.outputFolder || path.join
1616
export const nugetTempPath = path.join(rootPath, 'out', '.nuget');
1717
export const languageServerDirectory = path.join(rootPath, '.roslyn');
1818
export const devKitDependenciesDirectory = path.join(rootPath, '.roslynDevKit');
19+
export const xamlDesignToolsDirectory = path.join(rootPath, '.xamlDesignTools');
1920

2021
export const codeExtensionPath = commandLineOptions.codeExtensionPath || rootPath;
2122

0 commit comments

Comments
 (0)