typescript - Webpack hittar inte modulen vscode när man bygger jupyterlab med en egen förlängning


Jag försöker bygga en LSP (Language Server Protocol) -förlängning för Jupyter Lab, med biblioteket vscode-languageclient för TypeScript. vscode-languageclient-modulen verkar bli korrekt igenkänd, men den är beroende av vscode-modulen, som webpack inte hittar när Jupyter Lab byggs.

Jag har lagt till vscode-modulen till mitt tillägg med hjälp av

jlpm add vscode

För att få jlpm build att fungera, var jag tvungen att lägga till följande i min package.json-fil:

"scripts": {
  ...
  "postinstall": "node ./node_modules/vscode/bin/install"
}
"engines": {
    "vscode": "^1.33.x"
}

Detta gjorde det möjligt för jlpm att bygga tillägget, men när jag kör jupyter lab build får jag ett webpack-fel om att det inte går att hitta modulen vscode (se terminalutdata).

Jag har försökt lägga till detta i min webpack.config.js-fil i stagingkatalogen för Jupyter Lab innan jag kör jupyter lab build:

module.exports {
...
  resolve: {
      alias: {
          vscode$: path.resolve(__dirname, "./node_modules/vscode")
      }
  }
}

Men det ändrade inte felet.

Det här är importuttalandena jag använder i min index.ts-fil:

import { workspace} from 'vscode';

import {
  LanguageClient,
  LanguageClientOptions,
  ServerOptions,
  TransportKind
} from 'vscode-languageclient';

Detta är utskriften av att köra jupyter lab build:

~$ sudo jupyter lab build
[LabBuildApp] JupyterLab 0.35.5
[LabBuildApp] Cleaning /usr/local/share/jupyter/lab
Cleaning /usr/local/share/jupyter/lab...
Success!
[LabBuildApp] Building in /usr/local/share/jupyter/lab
[LabBuildApp] Node v8.10.0

[LabBuildApp] > /usr/bin/npm pack /home/russell/Uni/FP/Jupy.LSP
Jupy-LSP-0.1.0.tgz
[LabBuildApp] > node /usr/local/lib/python3.6/dist-packages/jupyterlab/staging/yarn.js install
yarn install v1.9.4
info No lockfile found.
[1/5] Validating package.json...
[2/5] Resolving packages...
warning @jupyterlab/application > @jupyterlab/apputils > react > fbjs > [email : core-js@<2.6.5 is no longer maintained. Please, upgrade to core-js@3 or at least to actual version of core-js@2.
warning css-loader > cssnano > autoprefixer > [email : Browserslist 2 could fail on reading Browserslist >3.0 config used in other tools.
warning css-loader > cssnano > postcss-merge-rules > [email : Browserslist 2 could fail on reading Browserslist >3.0 config used in other tools.
warning css-loader > cssnano > postcss-merge-rules > caniuse-api > [email : Browserslist 2 could fail on reading Browserslist >3.0 config used in other tools.
warning css-loader > cssnano > postcss-merge-rules > postcss-selector-parser > [email : I wrote this module a very long time ago; you should use something else.
[3/5] Fetching packages...
warning [email : The engine "vscode" appears to be invalid.
warning [email : The engine "vscode" appears to be invalid.
info [email : The platform "linux" is incompatible with this module.
info "[email " is an optional dependency and failed compatibility check. Excluding it from installation.
[4/5] Linking dependencies...
warning "@jupyterlab/vdom-extension > @nteract/[email " has incorrect peer dependency "react@^15.6.1".
warning "@jupyterlab/vega4-extension > vega-embed > [email " has unmet peer dependency "vega@*".
[5/5] Building fresh packages...
[3/3] ⡀ Jupy-LSP
[-/3] ⡀ waiting...
error /usr/local/share/jupyter/lab/staging/node_modules/Jupy-LSP: Command failed.
Exit code: 1
Command: node ./node_modules/vscode/bin/install
Arguments: 
Directory: /usr/local/share/jupyter/lab/staging/node_modules/Jupy-LSP
Output:
module.js:549
    throw err;
    ^

Error: Cannot find module '/usr/local/share/jupyter/lab/staging/node_modules/Jupy-LSP/node_modules/vscode/bin/install'
    at Function.Module._resolveFilename (module.js:547:15)
    at Function.Module._load (module.js:474:25)
    at Function.Module.runMain (module.js:693:10)
    at startup (bootstrap_node.js:188:16)


[LabBuildApp] > node /usr/local/lib/python3.6/dist-packages/jupyterlab/staging/yarn.js run build
yarn run v1.9.4
webpack
ModuleNotFoundError: Module not found: Error: Can't resolve 'vscode' in '/usr/local/share/jupyter/lab/staging/node_modules/Jupy-LSP/lib'
    at factory.create (/usr/local/share/jupyter/lab/staging/node_modules/webpack/lib/Compilation.js:535:10)
    at factory (/usr/local/share/jupyter/lab/staging/node_modules/webpack/lib/NormalModuleFactory.js:397:22)
    at resolver (/usr/local/share/jupyter/lab/staging/node_modules/webpack/lib/NormalModuleFactory.js:130:21)
    at asyncLib.parallel (/usr/local/share/jupyter/lab/staging/node_modules/webpack/lib/NormalModuleFactory.js:224:22)
    at /usr/local/share/jupyter/lab/staging/node_modules/neo-async/async.js:2830:7
    at /usr/local/share/jupyter/lab/staging/node_modules/neo-async/async.js:6877:13
    at normalResolver.resolve (/usr/local/share/jupyter/lab/staging/node_modules/webpack/lib/NormalModuleFactory.js:214:25)
    at doResolve (/usr/local/share/jupyter/lab/staging/node_modules/enhanced-resolve/lib/Resolver.js:184:12)
    at hook.callAsync (/usr/local/share/jupyter/lab/staging/node_modules/enhanced-resolve/lib/Resolver.js:238:5)
    at _fn0 (eval at create (/usr/local/share/jupyter/lab/staging/node_modules/tapable/lib/HookCodeFactory.js:33:10), <anonymous>:15:1)
    at resolver.doResolve (/usr/local/share/jupyter/lab/staging/node_modules/enhanced-resolve/lib/UnsafeCachePlugin.js:37:5)
    at hook.callAsync (/usr/local/share/jupyter/lab/staging/node_modules/enhanced-resolve/lib/Resolver.js:238:5)
    at _fn0 (eval at create (/usr/local/share/jupyter/lab/staging/node_modules/tapable/lib/HookCodeFactory.js:33:10), <anonymous>:15:1)
    at hook.callAsync (/usr/local/share/jupyter/lab/staging/node_modules/enhanced-resolve/lib/Resolver.js:238:5)
    at _fn0 (eval at create (/usr/local/share/jupyter/lab/staging/node_modules/tapable/lib/HookCodeFactory.js:33:10), <anonymous>:27:1)
    at resolver.doResolve (/usr/local/share/jupyter/lab/staging/node_modules/enhanced-resolve/lib/DescriptionFilePlugin.js:42:38)
    at hook.callAsync (/usr/local/share/jupyter/lab/staging/node_modules/enhanced-resolve/lib/Resolver.js:238:5)
    at _fn41 (eval at create (/usr/local/share/jupyter/lab/staging/node_modules/tapable/lib/HookCodeFactory.js:33:10), <anonymous>:28:1)
    at resolver.doResolve (/usr/local/share/jupyter/lab/staging/node_modules/enhanced-resolve/lib/ModuleKindPlugin.js:23:37)
    at hook.callAsync (/usr/local/share/jupyter/lab/staging/node_modules/enhanced-resolve/lib/Resolver.js:238:5)
    at _fn0 (eval at create (/usr/local/share/jupyter/lab/staging/node_modules/tapable/lib/HookCodeFactory.js:33:10), <anonymous>:15:1)
    at hook.callAsync (/usr/local/share/jupyter/lab/staging/node_modules/enhanced-resolve/lib/Resolver.js:238:5)
    at _fn0 (eval at create (/usr/local/share/jupyter/lab/staging/node_modules/tapable/lib/HookCodeFactory.js:33:10), <anonymous>:15:1)
    at args (/usr/local/share/jupyter/lab/staging/node_modules/enhanced-resolve/lib/forEachBail.js:30:14)
    at hook.callAsync (/usr/local/share/jupyter/lab/staging/node_modules/enhanced-resolve/lib/Resolver.js:238:5)
    at _fn0 (eval at create (/usr/local/share/jupyter/lab/staging/node_modules/tapable/lib/HookCodeFactory.js:33:10), <anonymous>:15:1)
    at resolver.doResolve (/usr/local/share/jupyter/lab/staging/node_modules/enhanced-resolve/lib/UnsafeCachePlugin.js:37:5)
    at hook.callAsync (/usr/local/share/jupyter/lab/staging/node_modules/enhanced-resolve/lib/Resolver.js:238:5)
    at _fn0 (eval at create (/usr/local/share/jupyter/lab/staging/node_modules/tapable/lib/HookCodeFactory.js:33:10), <anonymous>:15:1)
    at hook.callAsync (/usr/local/share/jupyter/lab/staging/node_modules/enhanced-resolve/lib/Resolver.js:238:5)
resolve 'vscode' in '/usr/local/share/jupyter/lab/staging/node_modules/Jupy-LSP/lib'
  Parsed request is a module
  using description file: /usr/local/share/jupyter/lab/staging/node_modules/Jupy-LSP/package.json (relative path: ./lib)
    Field 'browser' doesn't contain a valid alias configuration
    resolve as module
      /usr/local/share/jupyter/lab/staging/node_modules/Jupy-LSP/lib/node_modules doesn't exist or is not a directory
      /usr/local/share/jupyter/lab/staging/node_modules/node_modules doesn't exist or is not a directory
      /usr/local/share/jupyter/lab/node_modules doesn't exist or is not a directory
      /usr/local/share/jupyter/node_modules doesn't exist or is not a directory
      /usr/local/share/node_modules doesn't exist or is not a directory
      /usr/local/node_modules doesn't exist or is not a directory
      /usr/node_modules doesn't exist or is not a directory
      /node_modules doesn't exist or is not a directory
      looking for modules in /usr/local/share/jupyter/lab/staging/node_modules/Jupy-LSP/node_modules
        using description file: /usr/local/share/jupyter/lab/staging/node_modules/Jupy-LSP/package.json (relative path: ./node_modules)
          Field 'browser' doesn't contain a valid alias configuration
      looking for modules in /usr/local/share/jupyter/lab/staging/node_modules
        using description file: /usr/local/share/jupyter/lab/staging/package.json (relative path: ./node_modules)
          Field 'browser' doesn't contain a valid alias configuration
          using description file: /usr/local/share/jupyter/lab/staging/node_modules/vscode/package.json (relative path: .)
            no extension
              Field 'browser' doesn't contain a valid alias configuration
          using description file: /usr/local/share/jupyter/lab/staging/node_modules/Jupy-LSP/package.json (relative path: ./node_modules/vscode)
            no extension
              Field 'browser' doesn't contain a valid alias configuration
              /usr/local/share/jupyter/lab/staging/node_modules/vscode is not a file
            .wasm
              Field 'browser' doesn't contain a valid alias configuration
              /usr/local/share/jupyter/lab/staging/node_modules/Jupy-LSP/node_modules/vscode doesn't exist
            .wasm
              Field 'browser' doesn't contain a valid alias configuration
              /usr/local/share/jupyter/lab/staging/node_modules/vscode.wasm doesn't exist
            .mjs
              Field 'browser' doesn't contain a valid alias configuration
              /usr/local/share/jupyter/lab/staging/node_modules/Jupy-LSP/node_modules/vscode.wasm doesn't exist
            .mjs
              Field 'browser' doesn't contain a valid alias configuration
              /usr/local/share/jupyter/lab/staging/node_modules/vscode.mjs doesn't exist
            .js
              Field 'browser' doesn't contain a valid alias configuration
              /usr/local/share/jupyter/lab/staging/node_modules/Jupy-LSP/node_modules/vscode.mjs doesn't exist
            .js
              Field 'browser' doesn't contain a valid alias configuration
              /usr/local/share/jupyter/lab/staging/node_modules/vscode.js doesn't exist
            .json
              Field 'browser' doesn't contain a valid alias configuration
              /usr/local/share/jupyter/lab/staging/node_modules/Jupy-LSP/node_modules/vscode.js doesn't exist
            .json
              Field 'browser' doesn't contain a valid alias configuration
              /usr/local/share/jupyter/lab/staging/node_modules/vscode.json doesn't exist
              /usr/local/share/jupyter/lab/staging/node_modules/Jupy-LSP/node_modules/vscode.json doesn't exist
            as directory
              /usr/local/share/jupyter/lab/staging/node_modules/Jupy-LSP/node_modules/vscode doesn't exist
            as directory
              existing directory
                using path: /usr/local/share/jupyter/lab/staging/node_modules/vscode/index
                  using description file: /usr/local/share/jupyter/lab/staging/node_modules/vscode/package.json (relative path: ./index)
                    no extension
                      Field 'browser' doesn't contain a valid alias configuration
                      /usr/local/share/jupyter/lab/staging/node_modules/vscode/index doesn't exist
                    .wasm
                      Field 'browser' doesn't contain a valid alias configuration
                      /usr/local/share/jupyter/lab/staging/node_modules/vscode/index.wasm doesn't exist
                    .mjs
                      Field 'browser' doesn't contain a valid alias configuration
                      /usr/local/share/jupyter/lab/staging/node_modules/vscode/index.mjs doesn't exist
                    .js
                      Field 'browser' doesn't contain a valid alias configuration
                      /usr/local/share/jupyter/lab/staging/node_modules/vscode/index.js doesn't exist
                    .json
                      Field 'browser' doesn't contain a valid alias configuration
                      /usr/local/share/jupyter/lab/staging/node_modules/vscode/index.json doesn't exist
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

Observera att detta fel försvinner när man tar bort postinstall-anropet från min package.json:

error /usr/local/share/jupyter/lab/staging/node_modules/Jupy-LSP: Command failed.
Exit code: 1
Command: node ./node_modules/vscode/bin/install
Arguments: 
Directory: /usr/local/share/jupyter/lab/staging/node_modules/Jupy-LSP
Output:
module.js:549
    throw err;
    ^

Error: Cannot find module '/usr/local/share/jupyter/lab/staging/node_modules/Jupy-LSP/node_modules/vscode/bin/install'
    at Function.Module._resolveFilename (module.js:547:15)
    at Function.Module._load (module.js:474:25)
    at Function.Module.runMain (module.js:693:10)
    at startup (bootstrap_node.js:188:16)

Tyvärr tar detta inte bort/ändrar det efterföljande felmeddelandet.

UPPDATERING: Lösningar jag har försökt (men som inte fungerade):

  • Att ändra postinstall-ropet till
    "postinstall": "node /usr/local/lib/share/jupyter/lab/staging/node_modules/vscode/bin/install" Den första felet vid byggandet av jupyter försvinner igen, men webpack hittar fortfarande inte vscode
  • Klona det officiella vscode-förvaret till node-moduler och använda det istället
    Typescript-kompilatorn hittar inte modulen, även efter att ha bytt namn på den till vscode i dess package.json. Detta verkar ändå inte vara en avsedd (eller stabil) lösning.
  • Använda monaco-languageclient
    Monaco-languageclient är beroende av vscode-languageclient och fungerar därför inte heller
  • Köra vscode Compile-binären i nodmodulen
    Detta ger följande utdata
node bin/compile 
The vscode extension module got updated to TypeScript 2.0.x.
Please see https://code.visualstudio.com/updates/v1_6#_extension-authoring for instruction on how to migrate your extension.

Men länken handlar faktiskt inte om hur man uppgraderar VSCode utan snarare vilka nya moduler som ska inkluderas.

På en annan nota har jag sökt igenom hela vscode-mappen efter faktisk kod och kunde bara hitta dessa tre filer:
shared.js testrunner.d.ts testrunner.js, som innehåller 42, 44 och 125 rader kod. Jag är inte säker på varför vscode-modulen inte tillhandahåller någon funktionalitet, men detta verkar vara kärnan i problemet.