0

私は VS Code の拡張機能を開発しており、その拡張機能で使用されるオブジェクトに対していくつかのテストも書いています。これらのテストは、VS Code 内から正常に実行されます。ただし、CI ビルドの一部としてそれらを実行することも望んでおり、gulp を介して実行します。「gulp mocha」を使用してテストを実行するgulpタスクがあります。これらのテストは、モジュール参照の推移的なクロージャのどこかに「vscode」を取り込むクラスを導入するまで、gulp を介して正常に実行されます。

私のgulp出力は以下の通りです:

[13:29:03] Starting 'test'...
[13:29:03] { [Error: Cannot find module 'vscode']
  code: 'MODULE_NOT_FOUND',
  name: 'Error',
  message: 'Cannot find module \'vscode\'',
  stack: 'Error: Cannot find module \'vscode\'\n    at
Function.Module._resolveFilename (module.js:325:15)\n    at
Function.Module._load (module.js:276:25)\n    at Module.require
(module.js:353:17)\n    at require (internal/module.js:12:17)\n    at 
Object.<anonymous> (C:\\vsts-vscode\\out\\src\\helpers\\settings.js:6:18)\n  
at Module._compile (module.js:397:26)\n    at
Object.Module._extensions..js    
(module.js:404:10)\n    at Module.load (module.js:343:32)\n    at
Function.Module._load (module.js:300:12)\n    at Module.require (module.js:353:17)',
showStack: true,
showProperties: true,
plugin: 'gulp-mocha' }
[13:29:03] 'test' errored after 212 ms
[13:29:03] Error in plugin 'gulp-mocha'
Message:
    Cannot find module 'vscode'
Details:
    code: MODULE_NOT_FOUND
Stack:
Error: Cannot find module 'vscode'
    at Function.Module._resolveFilename (module.js:325:15)
    at Function.Module._load (module.js:276:25)
    at Module.require (module.js:353:17)
    at require (internal/module.js:12:17)
    at Object.<anonymous> (**C:\vsts-vscode\out\src\helpers\settings.js:6:18**)
    at Module._compile (module.js:397:26)
    at Object.Module._extensions..js (module.js:404:10)
    at Module.load (module.js:343:32)
    at Function.Module._load (module.js:300:12)
    at Module.require (module.js:353:17)

コール スタックには、src\helpers\settings.js:6:18への参照があります。その場所には、次のステートメントがあります。

const vscode_1 = require("vscode");

私のタイプスクリプトのソースでは、それは次のとおりです。

import { workspace } from "vscode";

settings.js 内で使用する名前空間を取り込む import ステートメントを単純に削除すると、テストは正常に実行されるようになります。

node.js モジュールの解決に関するドキュメント ( https://nodejs.org/api/modules.html#modules_all_together ) を読んだ後、なぜ MODULE_NOT_FOUND が発生するのか理解できました。「vscode」はコア モジュールではなく、相対参照 (「.」、「/」、「../」) でもないため、ノードは package.json ファイルを探します。それが見つかったと仮定すると (procmon は、あると教えてくれます)、「メイン」フィールドを探します。この時点で、「メイン」フィールドが見つからず、解決に失敗したと思います。

おそらく、VS Code でテストを実行すると (正常に動作します)、解決にはタイピング ファイル ( http://www.typescriptlang.org/docs/handbook/module-resolution.html ) の検索も含まれるため、成功します。

私が理解できないのは、gulp を介してテストを実行するときに「vscode」への参照を解決するために何をすればよいかということです。

何かご意見は?

4

0 に答える 0