@@ -23,6 +23,7 @@ import {
2323 languageServerDirectory ,
2424 nugetTempPath ,
2525 rootPath ,
26+ devKitDependenciesDirectory ,
2627} from '../tasks/projectPaths' ;
2728import { getPackageJSON } from '../tasks/packageJson' ;
2829import { createPackageAsync } from '../tasks/vsceTasks' ;
@@ -122,27 +123,46 @@ gulp.task(
122123 for ( const p of platformSpecificPackages ) {
123124 await acquireRoslyn ( packageJSON , p . platformInfo , true ) ;
124125 }
126+
127+ // Also pull in the Roslyn DevKit dependencies nuget package.
128+ await acquireRoslynDevKit ( packageJSON , true ) ;
125129 } , 'installDependencies' )
126130) ;
127131
128132// Install Tasks
129133async function installRoslyn ( packageJSON : any , platformInfo ?: PlatformInformation ) {
134+ // Install the Roslyn language server bits.
130135 const { packagePath, serverPlatform } = await acquireRoslyn ( packageJSON , platformInfo , false ) ;
136+ await installNuGetPackage (
137+ packagePath ,
138+ path . join ( 'content' , 'LanguageServer' , serverPlatform ) ,
139+ languageServerDirectory
140+ ) ;
141+
142+ // Install Roslyn DevKit dependencies.
143+ const roslynDevKitPackagePath = await acquireRoslynDevKit ( packageJSON , false ) ;
144+ await installNuGetPackage ( roslynDevKitPackagePath , 'content' , devKitDependenciesDirectory ) ;
145+ }
131146
132- // Get the directory containing the server executable for the current platform.
133- const serverExecutableDirectory = path . join ( packagePath , 'content' , 'LanguageServer' , serverPlatform ) ;
134- if ( ! fs . existsSync ( serverExecutableDirectory ) ) {
135- throw new Error ( `Failed to find server executable directory at ${ serverExecutableDirectory } ` ) ;
147+ async function installNuGetPackage ( pathToPackage : string , contentPath : string , outputPath : string ) {
148+ // Get the directory containing the content.
149+ const contentDirectory = path . join ( pathToPackage , contentPath ) ;
150+ if ( ! fs . existsSync ( contentDirectory ) ) {
151+ throw new Error ( `Failed to find NuGet package content at ${ contentDirectory } ` ) ;
136152 }
137153
138- console . log ( `Extracting Roslyn executables from ${ serverExecutableDirectory } ` ) ;
154+ const numFilesToCopy = fs . readdirSync ( contentDirectory ) . length ;
155+
156+ console . log ( `Extracting content from ${ contentDirectory } ` ) ;
139157
140158 // Copy the files to the language server directory.
141- fs . mkdirSync ( languageServerDirectory ) ;
142- fsextra . copySync ( serverExecutableDirectory , languageServerDirectory ) ;
143- const languageServerDll = path . join ( languageServerDirectory , 'Microsoft.CodeAnalysis.LanguageServer.dll' ) ;
144- if ( ! fs . existsSync ( languageServerDll ) ) {
145- throw new Error ( `Failed to copy server executable` ) ;
159+ fs . mkdirSync ( outputPath ) ;
160+ fsextra . copySync ( contentDirectory , outputPath ) ;
161+ const numCopiedFiles = fs . readdirSync ( outputPath ) . length ;
162+
163+ // Not expected to ever happen, just a simple sanity check.
164+ if ( numFilesToCopy !== numCopiedFiles ) {
165+ throw new Error ( 'Failed to copy all files from NuGet package' ) ;
146166 }
147167}
148168
@@ -173,6 +193,16 @@ async function acquireRoslyn(
173193 return { packagePath, serverPlatform } ;
174194}
175195
196+ async function acquireRoslynDevKit ( packageJSON : any , interactive : boolean ) : Promise < string > {
197+ const roslynVersion = packageJSON . defaults . roslyn ;
198+ const packagePath = await acquireNugetPackage (
199+ `Microsoft.VisualStudio.LanguageServices.DevKit` ,
200+ roslynVersion ,
201+ interactive
202+ ) ;
203+ return packagePath ;
204+ }
205+
176206async function installRazor ( packageJSON : any , platformInfo : PlatformInformation ) {
177207 if ( platformInfo === undefined ) {
178208 const platformNeutral = new PlatformInformation ( 'neutral' , 'neutral' ) ;
@@ -297,7 +327,14 @@ async function doPackageOffline(vsixPlatform: VSIXPlatformInfo | undefined) {
297327}
298328
299329async function cleanAsync ( ) {
300- await del ( [ 'install.*' , '.omnisharp*' , '.debugger' , '.razor' , languageServerDirectory ] ) ;
330+ await del ( [
331+ 'install.*' ,
332+ '.omnisharp*' ,
333+ '.debugger' ,
334+ '.razor' ,
335+ languageServerDirectory ,
336+ devKitDependenciesDirectory ,
337+ ] ) ;
301338}
302339
303340async function buildVsix (
0 commit comments