我安装了一些仅在特定工作区中启用的扩展。
通过设置,通常工作区特定的内容保存在工作区文件夹内的 .vscode/settings.json 中。然而,扩展似乎并非如此。
我知道扩展本身安装在用户配置文件文件夹中的 .vscode/extensions 中,但我找不到任何指示它们是否启用或禁用的内容。对于本地、远程和给定工作空间都是如此。
检查设置同步似乎显示了一个extensions.json,其中列出了所有已安装的扩展及其启用/禁用状态,但我在工作区、远程或本地的任何地方都找不到此文件。
这个配置文件在哪里?
从快速测试看来,扩展状态存储在
state.vscdb
sqlite 数据库中的 extensionsIdentifiers/disabled
键下
全球:
<vsc user profile folder>/user-data/User/globalStorage/state.vscdb
特定于工作空间:
<vsc user profile folder>/user-data/User/workspaceStorage/<workspace ID>/state.vscdb
对于上下文,全局
settings.json
文件位置是
<vsc user profile folder>/user-data/User/settings.json
而且似乎确实不存储扩展列表或状态;只是他们的喜好。
@gino-mempin 的之前的 SO 答案描述了如何使用 SQLite 浏览器
查询包含扩展状态的
state.vscdb
文件中的 SQLite 表。要使用 PowerShell 以编程方式查询 vscdb
,请参阅下面的说明或我关于查询 cookie 的其他 SO 答案。 回想一下,
操作系统的全局settings.json
文件位置是
%APPDATA%\Code\User\settings.json
或
$env:APPDATA\Code\User\settings.json
$HOME/Library/Application\ Support/Code/User/settings.json
$HOME/.config/Code/User/settings.json
*
之后使用星号
Code
来解释 Insiders 版本可能的
Code - Insiders
构造(如果您位于Insiders 频道)。对于全局设置,相对于
settings.json
,
state.vscdb
位于
./User/globalStorage/state.vscdb
。
Resolve-Path "$env:APPDATA\Code*\User\globalStorage\state.vscdb" # global settings store for extensions
对于工作区特定设置,同样相对于 settings.json
,每个工作区
state.vscdb
存储在
./User/workspaceStorage/<ExtensionContext.storageUri>/state.vscdb
中
再次以 Windows 中的 PowerShell 为例:
Resolve-Path "$env:APPDATA\Code*\User\workspaceStorage\*\state.vscdb" # workspace settings store for extensions
ExtensionContext.storageUri
指的是工作区特定目录的uri,扩展可以在其中存储私有状态。这可以使用开发人员工具(帮助>切换开发人员工具)找到
然后,在控制台中输入
let config = await vscode.context.resolveConfiguration();
config.workspace;
以下是此过程的屏幕录制:请参阅
VS Code API 文档,了解有关扩展开发上下文中 ExtensionContext.storageUri
的更多信息。查询中
vscdb
vscdb
的简单示例:
<# Prepare a convenience class to store our query results #>
# Not strictly necessary, but it simplifies the query loop
class VscWorkspaceSettings {
[string]$Workspace
[System.Collections.Generic.Dictionary[string,byte[]]]$ItemTable = [System.Collections.Generic.Dictionary[string,byte[]]]::new()
VscWorkspaceSettings([string]$workspace,[Object[]]$itemTable){
$this.Workspace = $workspace
foreach($item in $itemTable | Where-Object { $null -ne $_.key -and $null -ne $_.value -and $_.key -is [string] -and $_.value -is [byte[]] }){
$this.ItemTable.Add($item.key, $item.value)
}
}
}
<# Loop through all the workspaces #>
$vscdbPaths = Resolve-Path "$env:APPDATA\Code*\User\workspaceStorage\*\state.vscdb" | Select-Object -ExpandProperty Path # Will loop through these
$workspaceSettings=@{} # Will store all the settings
foreach($vscdbPath in $vcsdbPaths){
$itemTable = Invoke-MySQLiteQuery -Path $vscdbPath -Query "SELECT * FROM ItemTable" -Verbose
$settings = [VscWorkspaceSettings]::new(($vscdbPath -replace '.*?workspaceStorage\\([^\\]*)\\.*', '$1'),$itemTable)
$workspaceSettings.Add($settings.Workspace,$settings)
}
# Results
$workspaceSettings | Format-Table -AutoSize -Wrap
# Single workspace (the last one from the loop)
$workspaceSettings[$settings.Workspace] | Format-Table -AutoSize -Wrap
这些是结果:
$workspaceSettings | Format-Table -AutoSize -Wrap
| |
$workspaceSettings[$settings.Workspace] | Format-Table -AutoSize -Wrap
|