Eld*_*ldy 16 typescript visual-studio-code vscode-extensions
我正在尝试创建一个VSCode扩展.这个扩展提供了两个命令,不用介意它们的实现:
export function activate(context: ExtensionContext) {
const provider = new ContentProvider();
const providerRegistrations = Disposable.from(
workspace.registerTextDocumentContentProvider(ContentProvider.scheme, provider)
);
// Open the dynamic document, and shows it in the next editor
const openMyExtensionCommandRegistration = commands.registerTextEditorCommand('extension.openMyExtension', editor => {
// Activate the extension and do something
});
const useMyExtensionCommandRegistration = commands.registerTextEditorCommand('extension.useMyExtension', editor => {
// Do something
});
context.subscriptions.push(
provider,
openMyExtensionCommandRegistration,
useMyExtensionCommandRegistration,
providerRegistrations
);
}
Run Code Online (Sandbox Code Playgroud)
这是我package.json文件的一部分:
"activationEvents": [
"onCommand:extension.openMyExtension"
],
"main": "./out/extension",
"contributes": {
"commands": [
{
"command": "extension.openMyExtension",
"title": "Open my extension",
"category": "MyExtension"
},
{
"command": "extension.useMyExtension",
"title": "Do something with my extension",
"category": "MyExtension"
}
],
Run Code Online (Sandbox Code Playgroud)
第一个命令,它应该激活我的扩展,工作.它出现在命令面板中,并实际执行调用时应该执行的操作.
但是,第二个命令尽管出现在命令面板中,但在调用时会引发以下错误消息:
command 'extension.useMyExtension' not found
我觉得很奇怪我的第一个命令工作得很好但不是第二个,因为代码非常相似.有什么想法吗?
请注意,我显然更改了一些变量名称,我在实际代码中仔细检查了拼写错误.
小智 14
我遇到过同样的问题。一切都配置正确,但结果发现我的 package.json 缺少一个依赖项。这导致扩展加载失败,从而导致命令在运行时未正确注册。
要找出代码的问题所在,请打开“帮助”>“切换开发人员工具”并在控制台中查找错误。
您需要将所有已注册的命令添加到activationEventspackage.json 的列表中,以便在调用时可用。像这样更新package.json:
{
...
"activationEvents": [
"onCommand:extension.openMyExtension",
"onCommand:extension.useMyExtension"
]
...
}
Run Code Online (Sandbox Code Playgroud)
您可以在官方VSCode文档中找到有关激活事件的更多详细信息。
万一有人犯了和我一样的错误......
\n因此,如果编译成功,但抱怨找不到命令,请检查:
\n在扩展调试窗口中,检查来自Help > Toggle Developer Tools(来自@Bart Theeten)的控制台日志。您很有可能没有注意到 JS 错误。
是否将所有命令添加到package.json
"contributes": {\n "commands": [ ... ]\n}\nRun Code Online (Sandbox Code Playgroud)\ncontext.subscriptions.push(\n vscode.commands.registerCommand(\'command_name\', callbackFunc)\n);\nRun Code Online (Sandbox Code Playgroud)\n我的扩展是用 Typescript 制作的,并由 Webpack + ts-loader 捆绑。我介绍了一个有趣的有条件加载模块功能,该功能需要从动态路径(如/module/<version>. 这产生了几个有趣的问题:
首先是一个错误的全局变量__dirname,__filename只有在使用 webpack 打包 NodeJS 应用程序时才会发生(我得到了/值__dirname)。我必须设置webpack.config.js:
module.exports = {\n node: false\n}\nRun Code Online (Sandbox Code Playgroud)\n禁用 webpack nodeJS 全局模拟。(参考)
\n其次,我们容易忘记的模块路径限制:
\n绝对路径导入可能不起作用,相对路径也不能超出您在某处设置的范围 \xe2\x80\x8d\xe2\x99\x80\xef\xb8\x8f。例子:
\n// tsconfig.json\n{\n "compilerOptions": {\n "outDir": "lib"\n },\n "include": ["src"]\n}\nRun Code Online (Sandbox Code Playgroud)\n// src/index.ts\nrequire(\'../external/test\')\nRun Code Online (Sandbox Code Playgroud)\nrequire 路径将由 ts-loader 和 webpack 处理,它无法识别该模块路径,除非您使用路径别名告诉它们这些文件所在的位置。
\n并且动态导入路径编译后不能动态不能是动态的:
\nrequire(`./${dir}/module`) // may not work\nimport(`./${dir}/module`) // may not work\nRun Code Online (Sandbox Code Playgroud)\n好吧,原因是编译器加载器可能会对路径进行一些处理,如果它是一个简单的静态字符串,它可以用正确的字符串替换它,但如果它是一个运行时值,它就不能。抱歉,我很容易忘记这一点,因为它是函数语法!
\n你知道更糟糕的是什么吗?最糟糕的情况是我得到的路径对我有用但对其他人不起作用。因为黑客引入了仅存在于我的环境中的绝对路径......对此,我不得不说尝试避免绝对路径。
\n您尚未在以下位置激活扩展程序activationEvents:
"activationEvents": [
"onCommand:extension.useMyExtension"
],
Run Code Online (Sandbox Code Playgroud)
由于我的评论对某人有所帮助,我想将其作为答案发布以使其更具可见性:
我能够通过手动编译 Typescript 源代码(通过运行tsc -p ./到我的根文件夹中)来解决这个问题。该命令应该在调试时自动运行,但是,我仍然无法找到为什么在我的机器上不是这样。
| 归档时间: |
|
| 查看次数: |
6443 次 |
| 最近记录: |