背景

基于 VSCode 改版但使用 Open VSX 的编辑器(如 trae、Cursor)会遇到以下限制1

微软官方插件(Pylance/Remote SSH/C#工具链等)仅在 Microsoft Marketplace 分发,这些闭源插件不会同步到 Open VSX 仓库。Pylance 的智能补全、类型检查等高级功能将缺失。

官方建议的用 pyright 来代替2 3,但是 pyright 远不如 pylance,缺失后非常不方便。观察到官方文档4有如下图:
在这里插入图片描述
可以推测,其实 trae 可以装上 Pylance插件。经过实验,发现确实trae可以使用 pylance 的老版本。

免责声明:根据微软官方的声明,pylance 仅被授权于使用于 VS Code 中,其他使用均未被授权,本文的方法不得被用于任何侵犯微软版权的活动中。

0. Trae 环境准备(可省略)

主要思路是仿照在基于VS code 的开源软件 VSCodium 里安装 Pylance 插件5

  • 找到 trae 安装目录,如 F:\Programs\Trae\resources\app\
  • 修改 product.json(可以先进行备份):

将其中的

	"extensionsGallery": {
		"serviceUrl": "https://open-vsx.org/vscode/gallery",
		"controlUrl": "https://lf3-static.bytednsdoc.com/obj/eden-cn/lkpkbvsj/ljhwZthlaukjlkulzlp/marketplace/controlUrl.json",
		"searchUrl": "https://open-vsx.org/vscode/gallery/extensionquery"
	},

改为:

	"extensionsGallery": {
		"serviceUrl": "https://marketplace.visualstudio.com/_apis/public/gallery",
		"cacheUrl": "https://vscode.blob.core.windows.net/gallery/index",
		"itemUrl": "https://marketplace.visualstudio.com/items"
	},

这里的作用是将插件更新的连接全部指向 VS Code官方的插件市场。

1. 从VSCode市场获取插件安装包

这里需要从VSCode市场手动获取安装包6

  • 访问VSCode插件市场,搜索目标插件(Pylance);
  • 进入插件详情页,点击Version History查看历史版本;
  • https://marketplace.visualstudio.com/items?itemName=ms-python.vscode-pylance 中提取关键参数:
    • itemName字段拆分为:fieldA=ms-pythonfieldB=vscode-pylance
    • 选择兼容版本号 (如 2023.9.10

笔者得到的下载链接为(大概16M):

https://marketplace.visualstudio.com/_apis/public/gallery/publishers/ms-python/vsextensions/vscode-pylance/2023.9.10/vspackage

2. 直接安装插件至Trae会失败

浏览器打开上述链接,会自动下载.vsix文件,得到 ms-python.vscode-pylance-2023.9.10.vsix 文件。

但是此时如果打开Trae,进入插件市场,然后拖拽下载的.vsix文件至插件面板安装,会报错:
请添加图片描述
即:

Installation failed
Currently, ms-python.vscode-pylance is not supported for installation

因此不能直接这样安装。注意,如果这种安装方式出现另一个错误:

End of central directory record signature not found. Either not a zip file, or file is truncated.

则说明文件没有下载完整,请重新下载。

3. 解压 vsix 文件

  • 保持 Trae 打开,并在项目中任意打开一个python文件,左边栏停留在插件市场的界面。

  • ms-python.vscode-pylance-2023.9.10.vsix 文件 解压 提取到 ms-python.vscode-pylance-2023.9.10 文件夹:
    请添加图片描述

  • 然后将 extension 文件夹里的所有文件复制到本目录下:
    请添加图片描述

  • 修改 package.json,将 "displayName": "Pylance" 改为 "displayName": "Pylance-trae" (避免Trae识别到pylance,不过新版中已失效)。

  • 进入此时 dist 文件夹下,复制一个 extension.bundle.js 作为部分,然后新建一个空白的 extension.bundle.js 7
    在这里插入图片描述

4. 直接移动安装

  • 还是保持 Trae 打开,并在项目中任意打开一个python文件,左边栏停留在插件市场的界面。
  • ms-python.vscode-pylance-2023.9.10 文件夹 移动至 trae 的插件目录 C:\Users\你的用户名\.trae\extensions
    在这里插入图片描述
  • 此时会发现,已安装的插件里会自动更新出现 Pylance-trae 插件:
    在这里插入图片描述
  • trae 的插件目录 C:\Users\你的用户名\.trae\extensions 下的 extensions.json 里面会自动多一项:

,{“identifier”:{“id”:“ms-python.vscode-pylance”},“version”:“2023.9.10”,“location”:{“$mid”:1,“fsPath”:“c:\Users\xxx\.trae\extensions\ms-python.vscode-pylance-2023.9.10”,“_sep”:1,“external”:“file:///c%3A/Users/xxx/.trae/extensions/ms-python.vscode-pylance-2023.9.10”,“path”:“/c:/Users/xxx/.trae/extensions/ms-python.vscode-pylance-2023.9.10”,“scheme”:“file”},“relativeLocation”:“ms-python.vscode-pylance-2023.9.10”}

注意,这里在移动文件夹之后笔者的 trae 是自动更新到了插件。没有出现说明失败了。

  • 最后重启 trae,即可享受 pylance 插件的丝滑。

在这里插入图片描述

20250603更新

trae 国际版进行了更新,变为了付费版,原来旧的 trae 版本下 pylance 等插件可以正常使用,但是内置的模型不再进行更新了,因此只能主动升级(不卸载直接用最新安装包安装)。 实测发现如果主动更新到当前最新版 1.4,pylance 等 publisher 为 ms-python 的插件将会被 trae 主动检测并变得不完全可用:只能跳转函数,无法识别(突出)未导入/定义的包、库或者变量。

官方推荐的替代是:BasedPyright 8。但是它只能实现函数定义跳转,依旧无法识别(突出)未导入/定义的包、库或者变量。

20250605更新

经过不懈努力,终于不慎解决了pylance在新版Trae(v1.4)的使用。前面的安装操作还是一样。

问题分析

检查Trae的output栏,进行如下设置
在这里插入图片描述

可以发现,当不慎强行启用pylance时,会出现
请添加图片描述
检测信息为:

[iCube] getExtension block: true, sourceExtension: ms-python.python(ms-python.python), targetExtensionId: ms-python.vscode-pylance

这是 Trae 官方新加的主动封禁功能。

不慎取消封禁

经过查找定位,在Trae软件的安装目录,找到 Trae\resources\app\out\vs\workbench\api\node\extensionHostProcess.js
将代码里的函数 function hq(e,t,i,r)

function hq(e,t,i,r){if(!e||!e.iCubeApp?.icubeExtensionControl)return!1;const s=Sm.findOne(e.iCubeApp.icubeExtensionControl,i);if(!s)return!1;const n=s.actions?.extHostBlockGetExtension;if(!n||!Array.isArray(n))return!1;for(const o of n){if(o.fromExtId===t.id)return r?.info(`[iCube] getExtension block: ${o.block}, sourceExtension: ${o.fromExtId}(${t.id}), targetExtensionId: ${i}`),o.block;if(o.fromExtId==="*")return r?.info(`[iCube] getExtension block: ${o.block}, sourceExtension: ${o.fromExtId}(${t.id}), targetExtensionId: ${i}`),o.block}return!1}

(修改前请备份)改为:

function hq(e, t, i, r){return false;}

然后找到 Trae\resources\app\out\vs\workbench\api\worker\extensionHostWorkerMain.js
将代码里的函数 function iO(e,t,i,r)

function iO(e,t,i,r){if(!e||!e.iCubeApp?.icubeExtensionControl)return!1;const s=ip.findOne(e.iCubeApp.icubeExtensionControl,i);if(!s)return!1;const n=s.actions?.extHostBlockGetExtension;if(!n||!Array.isArray(n))return!1;for(const o of n){if(o.fromExtId===t.id)return r?.info(`[iCube] getExtension block: ${o.block}, sourceExtension: ${o.fromExtId}(${t.id}), targetExtensionId: ${i}`),o.block;if(o.fromExtId==="*")return r?.info(`[iCube] getExtension block: ${o.block}, sourceExtension: ${o.fromExtId}(${t.id}), targetExtensionId: ${i}`),o.block}return!1}

(修改前请备份)改为:

function iO(e,t,i,r){return false;}

然后再重启IDE以及重新禁用启用pylance插件。
在这里插入图片描述
即使此时处于 Unavailable 的状态,依旧可以不慎正常使用pylance。

注意进行上述更改后,Trae 会提示:Your Trae installation appears to be corrupt. Please reinstall.
在这里插入图片描述
如上图所示,不过可以忽略。

经过上述不慎操作后,此时可以实现:

  1. 环境中没有的包或者工程中不存在的自定义函数下划线突出显示;
  2. 跳转函数定义;
  3. 未定义的变量下划线突出显示;
  4. 未使用的库一目了然。
    在这里插入图片描述

20250709更新

发现pylance突然又失效了,但是实测把 C:\Users\xxx\.trae\extensions\ms-python.vscode-pylance-2023.9.10 下的 package.json 里面 "publisher": "ms-python" 改成 "publisher": "ms-python0",重启Trae,然后再改回去(一定要再恢复),重启Trae,奇迹般地又好了。暂时不清楚为什么😂,可能Trae的检测具有时效性。

20250812更新

将trae版本更新至最新的版本:2.0.11,发现原来的函数在新版中已经消失了,并且在Output中已经看不到禁用输出,但是取消禁用的方法还是类似的,即在Trae软件的安装目录,找到 x:\Programs\Trae\resources\app\out\vs\workbench\api\node\extensionHostProcess.js
将代码里的函数 function bQ(e,t,i,s)

function bQ(e,t,i,s){if(!e||!e.iCubeApp?.icubeExtensionControl)return!1;const r=f1.findOne(e.iCubeApp.icubeExtensionControl,i);if(!r)return!1;const n=r.actions?.extHostBlockGetExtension;if(!n||!Array.isArray(n))return!1;for(const o of n){if(o.fromExtId===t.id)return s?.trace(`[iCube] getExtension block: ${o.block}, sourceExtension: ${o.fromExtId}(${t.id}), targetExtensionId: ${i}`),o.block;if(o.fromExtId==="*")return s?.trace(`[iCube] getExtension block: ${o.block}, sourceExtension: ${o.fromExtId}(${t.id}), targetExtensionId: ${i}`),o.block}return!1}

(修改前请备份)改为:

function bQ(e,t,i,s){return false;}

然后找到 x:\ProgramsTrae\resources\app\out\vs\workbench\api\worker\extensionHostWorkerMain.js
将代码里的函数 function dj(e,t,i,r)

function dj(e,t,i,r){if(!e||!e.iCubeApp?.icubeExtensionControl)return!1;const s=_p.findOne(e.iCubeApp.icubeExtensionControl,i);if(!s)return!1;const n=s.actions?.extHostBlockGetExtension;if(!n||!Array.isArray(n))return!1;for(const o of n){if(o.fromExtId===t.id)return r?.trace(`[iCube] getExtension block: ${o.block}, sourceExtension: ${o.fromExtId}(${t.id}), targetExtensionId: ${i}`),o.block;if(o.fromExtId==="*")return r?.trace(`[iCube] getExtension block: ${o.block}, sourceExtension: ${o.fromExtId}(${t.id}), targetExtensionId: ${i}`),o.block}return!1}

(修改前请备份)改为:

function dj(e,t,i,r){return false;}

然后再重启IDE,依旧可以启用pylance,如下:
在这里插入图片描述

20251002更新

将trae版本更新至最新的版本:2.7.1,发现原来的函数在新版中已经消失了,并且在Output中已经看不到禁用输出,但是取消禁用的方法还是类似的,即在Trae软件的安装目录,找到 x:\Programs\Trae\resources\app\out\vs\workbench\api\node\extensionHostProcess.js
将代码里的函数 function dQ(e,t,i,r)

function dQ(e,t,i,r){if(!e||!e.iCubeApp?.icubeExtensionControl)return!1;const s=f1.findOne(e.iCubeApp.icubeExtensionControl,i);if(!s)return!1;const n=s.actions?.extHostBlockGetExtension;if(!n||!Array.isArray(n))return!1;for(const o of n){if(o.fromExtId===t.id)return r?.trace(`[iCube] getExtension block: ${o.block}, sourceExtension: ${o.fromExtId}(${t.id}), targetExtensionId: ${i}`),o.block;if(o.fromExtId==="*")return r?.trace(`[iCube] getExtension block: ${o.block}, sourceExtension: ${o.fromExtId}(${t.id}), targetExtensionId: ${i}`),o.block}return!1}

(修改前请备份)改为:

function dQ(e,t,i,r){return false;}

然后找到 x:\ProgramsTrae\resources\app\out\vs\workbench\api\worker\extensionHostWorkerMain.js
将代码里的函数 function dH(e,t,i,r)

function dH(e,t,i,r){if(!e||!e.iCubeApp?.icubeExtensionControl)return!1;const s=qp.findOne(e.iCubeApp.icubeExtensionControl,i);if(!s)return!1;const n=s.actions?.extHostBlockGetExtension;if(!n||!Array.isArray(n))return!1;for(const o of n){if(o.fromExtId===t.id)return r?.trace(`[iCube] getExtension block: ${o.block}, sourceExtension: ${o.fromExtId}(${t.id}), targetExtensionId: ${i}`),o.block;if(o.fromExtId==="*")return r?.trace(`[iCube] getExtension block: ${o.block}, sourceExtension: ${o.fromExtId}(${t.id}), targetExtensionId: ${i}`),o.block}return!1}

(修改前请备份)改为:

function dH(e,t,i,r){return false;}

然后再重启IDE,依旧可以启用pylance


参考文献:


  1. 使用 trae、cursor 这些魔改版的 vscode 是不是无法使用微软第一方的插件 Pylance 了? ↩︎

  2. 对原 vs code 支持的插件不支持,如 Pylance 高亮代码 #185 ↩︎

  3. Pylance not available #38 ↩︎

  4. Trae官方文档管理插件 ↩︎

  5. Solution to Pylance not working with VSCodium #1641 ↩︎

  6. Trae如何导入VSCode插件?三种方法详解 ↩︎

  7. VSCodium无法使用新版Pylance的解决方法 ↩︎

  8. 问题排查 ↩︎

Logo

纵情码海钱塘涌,杭州开发者创新动! 属于杭州的开发者社区!致力于为杭州地区的开发者提供学习、合作和成长的机会;同时也为企业交流招聘提供舞台!

更多推荐