我正在尝试创建一个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
我觉得很奇怪我的第一个命令工作得很好但不是第二个,因为代码非常相似。有什么想法吗?
请注意,我显然更改了一些变量名称,我在实际代码中仔细检查了拼写错误。
答案 0 :(得分:2)
您需要将所有已注册的命令添加到package.json的activationEvents
列表中,以便在调用时可用。像这样更新您的package.json:
{
...
"activationEvents": [
"onCommand:extension.openMyExtension",
"onCommand:extension.useMyExtension"
]
...
}
您可以在官方VSCode Documentation中找到有关激活事件的更多详细信息。
答案 1 :(得分:1)
您尚未激活扩展程序:
users <- getAllUsers()
users
export('getAllUsers')
getAllOrganizations()
test_check("zendeskR")
答案 2 :(得分:1)
万一有人犯了和我一样的错误...
所以如果它编译成功,但抱怨找不到命令,请检查:
在扩展调试窗口中,检查来自 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 全局模拟。 (reference)
其次,我们很容易忘记的模块路径限制:
绝对路径导入可能不行,相对路径也不能超出你在某处设置的范围??♀️。示例:
// 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引入了只存在于我的环境中的绝对路径......对于这个,我不得不说尽量避免绝对路径。
答案 3 :(得分:0)
由于我的评论对某人有所帮助,因此我想将其发布为答案,以使其更具可见性:
我能够通过手动编译Typescript源(通过在我的根文件夹中运行tsc -p ./
)来解决此问题。该命令应在调试时自动运行,但是,我仍然找不到在我的机器上不是这种情况的原因。
答案 4 :(得分:0)
我有同样的问题。一切都配置正确,但事实证明我的package.json缺少一个依赖项。这导致扩展无法加载,因此命令在运行时未正确注册。
要找出代码的问题所在,请打开“帮助”>“切换开发人员工具”,然后在控制台中查找错误。
答案 5 :(得分:0)
我的问题是我将Cmder作为VS Code终端运行。当我开始调试时,构建将永远不会完成-您可以从底部的工具栏监视“正在运行的任务”。当我查看正在运行的任务时,我看到了:
执行任务:npm run watch << / p>
VS Code试图运行监视脚本,但从未完成-我猜这里有些语法问题在起作用。
无论如何,尽管编译确实可行,但我建议改为运行watch
脚本,以便您的扩展名将在每次文件更改时重新编译:
npm run watch
您现在应该可以通过F5
在扩展主机中运行扩展,而不必不断重新编译。 (不过,您仍然需要重新加载主机)
答案 6 :(得分:0)
我将这个答案添加到可能出于与我相同的原因而可能遇到这种行为的任何人,因为花了我很多时间才意识到正在发生的事情。
我使用PowerShell作为默认终端,并配置了配置文件以将新shell的路径(使用Set-Location)设置为特定文件夹,以方便我正在进行的其他开发工作。
当按F5键启动我的扩展程序时,VS Code试图从此目录而不是我的项目目录运行compile命令,这当然会失败。
一旦我意识到要在该目录中查找文件,此故障在C:\ Users \ <您的用户名> \ AppData \ Roaming \ npm-cache \ _logs文件中就很明显。
我从PowerShell配置文件中删除了路径设置,并且VS Code扩展构建按预期工作。
答案 7 :(得分:0)
我使用 vsce package
构建了我的扩展并通过 vsix 文件安装了它。
我遇到了同样的问题,并通过在“.vscode/extensions/EXTENSION_NAME”文件夹中运行 npm install
来修复它。 EXTENSION_NAME
是扩展名。
答案 8 :(得分:-3)