如何在VS Code及其扩展中获取Angular项目当前打开文件的项目路径
嘿,我来帮你搞定这个VS Code扩展里获取Angular项目路径的问题,刚好我对这个场景很熟悉,给你详细的解决方案:
一、从VS Code工作区获取所有项目路径
如果你只是想拿到当前打开的所有工作区文件夹路径,直接用VS Code提供的API就能轻松实现:
const vscode = require('vscode'); function activate(context) { // 获取所有已打开的工作区文件夹 const workspaceFolders = vscode.workspace.workspaceFolders; if (workspaceFolders) { workspaceFolders.forEach(folder => { console.log('工作区项目路径:', folder.uri.fsPath); // 这里会输出你打开的universe和bookworld的完整路径 }); } }
二、获取当前打开文件所属的Angular项目根路径
你的核心需求是:根据当前编辑的文件(比如package.json、tslint.json),找到它所属的Angular项目根目录(也就是包含angular.json、node_modules的那个文件夹)。之前硬编码路径的方式肯定不行,我们可以通过向上遍历目录+检查Angular标志性文件的方式来实现,具体代码如下:
const vscode = require('vscode'); const path = require('path'); const fs = require('fs').promises; // 定义一个异步函数,从当前文件路径向上寻找Angular项目根目录 async function findAngularProjectRoot(currentFilePath) { let currentDir = path.dirname(currentFilePath); // 向上遍历,直到找到angular.json或者到达磁盘根目录 while (currentDir !== path.parse(currentDir).root) { const angularJsonPath = path.join(currentDir, 'angular.json'); try { // 检查当前目录是否存在angular.json await fs.access(angularJsonPath); return currentDir; // 找到则返回该目录 } catch { // 没找到就继续往上一级目录找 currentDir = path.dirname(currentDir); } } // 如果遍历到根目录都没找到,返回当前文件的父目录(可根据需求调整) return path.dirname(currentFilePath); } function activate(context) { // 监听编辑器切换/激活事件,实时获取当前打开文件的项目路径 const fileChangeDisposable = vscode.window.onDidChangeActiveTextEditor(async (editor) => { if (editor && editor.document) { const currentFileUri = editor.document.uri; // 跳过虚拟文件(比如未保存的新建文件) if (currentFileUri.scheme === 'file') { const projectRoot = await findAngularProjectRoot(currentFileUri.fsPath); console.log(`var currentprojectfolderpath = ${projectRoot}`); } } }); // 插件激活时,如果已有打开的文件,立即获取一次路径 if (vscode.window.activeTextEditor) { const activeEditor = vscode.window.activeTextEditor; if (activeEditor.document.uri.scheme === 'file') { findAngularProjectRoot(activeEditor.document.uri.fsPath).then(projectRoot => { console.log(`var currentprojectfolderpath = ${projectRoot}`); }); } } // 将监听事件添加到上下文,避免内存泄漏 context.subscriptions.push(fileChangeDisposable); } module.exports = { activate };
关键逻辑说明:
findAngularProjectRoot函数:通过异步方式向上遍历目录,检查每个目录下是否存在angular.json(这是Angular项目的核心配置文件,比node_modules更可靠,因为有些项目可能会自定义依赖目录位置)。- 编辑器事件监听:当你切换打开不同项目的文件时,会自动触发路径获取逻辑,保证实时性。
- 初始化检查:插件刚激活时,如果已经有打开的文件,也会立即获取对应的项目路径。
这样,当你打开universe项目的package.json时,控制台会输出该项目的根路径;打开bookworld的tslint.json时,也会输出它对应的项目根路径,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Malli
相关产品推荐
相关产品推荐

