[英]Command not found in VSCode extension
我正在尝试创建一个 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
);
}
这是我的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"
}
],
第一个命令,它应该激活我的扩展,工作。 它出现在命令面板中,并且实际上在调用时执行它应该执行的操作。
然而,第二个命令尽管出现在命令面板中,但在调用时会引发以下错误消息:
command 'extension.useMyExtension' not found
我觉得很奇怪,我的第一个命令工作正常,但第二个命令却不行,因为代码非常相似。 任何想法为什么?
请注意,我显然更改了一些变量名称,我仔细检查了真实代码中的拼写错误。
您需要将所有已注册的命令添加到 package.json 中的activationEvents
列表中,以便它们在调用时可用。 像这样更新你的 package.json:
{
...
"activationEvents": [
"onCommand:extension.openMyExtension",
"onCommand:extension.useMyExtension"
]
...
}
您可以在官方VSCode 文档 中找到有关激活事件的更多详细信息。
由于我的评论对某人有所帮助,因此我想将其发布为答案,以提高其知名度:
我能够通过手动编译 Typescript 源(通过将tsc -p ./
运行到我的根文件夹中)来解决这个问题。 这个命令应该在调试时自动运行,但是,我仍然无法找到为什么在我的机器上不是这种情况。
您尚未激活扩展程序:
"activationEvents": [
"onCommand:extension. useMyExtension"
],
我有同样的问题。 一切都配置正确,但结果我的 package.json 缺少一个依赖项。 这导致扩展加载失败,因此命令在运行时没有正确注册。
要找出您的代码有什么问题,请打开“帮助”>“切换开发人员工具”并在控制台中查找错误。
万一有人犯了和我一样的错误...
因此,如果它编译成功,但抱怨找不到命令,请检查:
在扩展调试窗口中,从Help > Toggle Developer Tools
(来自 @Bart Theeten)检查控制台日志。 您很可能没有注意到 JS 错误。
是否所有命令都添加到package.json
"contributes": {
"commands": [ ... ]
}
context.subscriptions.push(
vscode.commands.registerCommand('command_name', callbackFunc)
);
我的扩展是用 Typescript 制作的,并由 Webpack + ts-loader 捆绑。 我介绍了一个有趣的有条件加载模块功能,它需要从动态路径(如/module/<version>
。 这就产生了几个有趣的问题:
首先是一个错误的__dirname
, __filename
全局,只有使用的WebPack时收拾应用程序的NodeJS(我碰巧/
为价值__dirname
)。 我必须将webpack.config.js
设置为:
module.exports = {
node: false
}
禁用 webpack nodeJS 全局模拟。 (参考)
其次,我们很容易忘记的模块路径限制:
绝对路径导入可能不行,相对路径也不能超出你在某处设置的范围🤷🏻♀️。 示例:
// tsconfig.json
{
"compilerOptions": {
"outDir": "lib"
},
"include": ["src"]
}
// src/index.ts
require('../external/test')
require 路径将由 ts-loader 和 webpack 处理,它无法识别此模块路径,除非您使用路径别名来告诉它们这些文件所在的位置。
并且编译后动态导入路径不能是动态的:
require(`./${dir}/module`) // may not work
import(`./${dir}/module`) // may not work
嗯,原因是编译器加载器可能会对路径做一些处理,如果它是一个简单的静态字符串,它可以用正确的字符串替换它,但如果它是一个运行时值,它就不能。 我很抱歉,但我很容易忘记了这一点,因为它是一个函数语法!
你知道更糟的是什么吗? 更糟糕的情况是我得到的路径对我有用,但对其他人不起作用。 因为hack引入了只存在于我的环境中的绝对路径......对于这个,我不得不说尽量避免绝对路径。
我的问题是我运行 Cmder 作为我的 VS Code 终端。 当我开始调试时,构建永远不会完成 - 您可以从底部工具栏监控正在运行的任务。 当我查看正在运行的任务时,我看到了:
执行任务: npm run watch <
VS Code 正在尝试运行 watch 脚本,但它从未完成 - 我猜这里有一些语法问题。
无论如何,虽然编译确实有效,但我建议改为运行watch
脚本,以便您的扩展程序将在每次文件更改时重新编译:
npm run watch
您现在应该能够通过F5
在您的扩展主机中运行您的扩展,而无需不断重新编译。 (不过,您仍然需要重新加载主机)
我正在为任何可能出于与我相同的原因而遇到这种行为的人添加此答案,因为我花了很长时间才意识到发生了什么。
我使用 PowerShell 作为我的默认终端,并将我的配置文件配置为将新 shell 的路径(使用 Set-Location)设置到特定文件夹,以方便我正在进行的其他开发工作。
当按 F5 启动我的扩展时,VS Code 试图从这个目录而不是我的项目目录运行编译命令,这当然失败了。
一旦我意识到在那里查看,此失败在 C:\\Users\\<your_user_name>\\AppData\\Roaming\\npm-cache\\_logs 文件中很明显。
我从我的 PowerShell 配置文件中删除了路径设置,并且 VS Code 扩展构建按预期工作。
我用vsce package
构建了我的扩展,并通过 vsix 文件安装了它。
我遇到了同样的问题,并通过在“.vscode/extensions/EXTENSION_NAME”文件夹中运行npm install
来修复它。 EXTENSION_NAME
是扩展名。
我在github 问题中找到了解决方案
看了上面所有的答案,他们没有为我做。 以下是我一起为我所做的事情: 1。
output: {
// the bundle is stored in the 'dist' folder (check package.json), 📖 -> https://webpack.js.org/configuration/output/
path: path.resolve(__dirname, 'dist'),
filename: 'extension.js',
libraryTarget: 'commonjs2',
devtoolModuleFilenameTemplate: '../[resource-path]'
},
我将 libraryTarget 添加到 commonjs2
resolve: {
...
extensions: ['.js', '.mjs'],
}
通知扩展不再有.ts
。 这要求我将.js
添加到我所有的相对导入路径中。
非常爱其他可能遇到职业生涯中最困难的软件问题之一的人❤️
您的问题与此问题类似: https : //github.com/Microsoft/vscode/issues/25026
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.