Skip to content

feat #多文件支持 #33

Closed
Closed

Description

@gaoconggit

需要可以支持多个文件同时运行,提高模块化能力

Activity

  1. gaoconggit commented on Sep 19, 2025

    @gaoconggit
    OwnerAuthor

    @claude 分析一下我的需求,给我建议

  2. claude commented on Sep 19, 2025

    @claude

    Claude finished @gaoconggit's task —— View job


    🔍 分析多文件支持需求

    📋 任务清单

    • 了解当前代码执行架构
    • 分析文件管理系统实现
    • 评估多文件支持的影响范围
    • 提供实现建议

    📊 当前架构分析

    经过对代码库的分析,我发现 SharpPad 当前的架构如下:

    1. 单文件执行模式

    • 目前系统设计为每次只能执行单个文件的代码
    • CodeRunner.RunProgramCodeAsync() 接收单个字符串作为源代码输入
    • 编译过程中创建单个 SyntaxTree 和 CSharpCompilation

    2. 文件管理系统

    • 前端已经支持多文件和文件夹的管理(fileManager.js)
    • 文件存储在 localStorage 中,支持层级结构
    • 每个文件有独立的 ID、名称和内容

    3. 编译和执行流程

    • 使用 Roslyn 进行代码编译
    • 动态加载 NuGet 包依赖
    • 在隔离的 AssemblyLoadContext 中执行

    🎯 实现多文件支持的建议

    方案一:完整的多文件编译(推荐)

    这是最符合 C# 项目结构的方案,可以真正实现模块化:

    前端改造:

    1. 修改运行按钮行为,收集所有 .cs 文件内容
    2. 添加项目设置,指定入口文件(包含 Main 方法的文件)
    3. UI 上标识哪个文件是入口文件

    后端改造:

    1. 修改 CodeRunRequest 接口:
    public class CodeRunRequest
    {
        public List<FileContent> Files { get; set; }  // 多个文件
        public string EntryFile { get; set; }         // 入口文件名
        public List<Package> Packages { get; set; }
        public int LanguageVersion { get; set; }
    }
    
    public class FileContent
    {
        public string FileName { get; set; }
        public string Content { get; set; }
    }
    1. 修改 CodeRunner.RunProgramCodeAsync():
    • 接收多个文件内容
    • 为每个文件创建 SyntaxTree
    • 将所有 SyntaxTree 加入同一个 CSharpCompilation
    • 编译生成单个程序集

    优点:

    • 支持真正的模块化开发
    • 可以使用类、命名空间跨文件引用
    • 符合标准 C# 项目结构

    实现复杂度: ⭐⭐⭐

    方案二:文件引用系统

    在当前单文件基础上,添加文件引用机制:

    前端改造:

    1. 在文件设置中添加"引用文件"选项
    2. 运行时自动包含被引用的文件

    后端改造:

    1. 递归收集所有被引用的文件
    2. 按依赖顺序编译文件
    3. 共享编译上下文

    优点:

    • 改动相对较小
    • 保持向后兼容

    缺点:

    • 需要手动管理依赖关系
    • 不够直观

    实现复杂度: ⭐⭐

    方案三:项目模板系统

    创建项目级别的概念:

    功能设计:

    1. 添加"项目"概念,包含多个文件
    2. 支持项目模板(Console、Class Library等)
    3. 自动生成项目结构(Program.cs、其他类文件)
    4. 项目级别的 NuGet 包管理

    优点:

    • 最接近 Visual Studio 体验
    • 支持复杂项目结构
    • 便于代码组织

    缺点:

    • 实现最复杂
    • 需要大量 UI 改造

    实现复杂度: ⭐⭐⭐⭐⭐

    📝 技术实现要点

    1. 命名空间处理

      • 自动为文件生成命名空间
      • 或允许用户在代码中自定义
    2. 编译顺序

      • 分析文件依赖关系
      • 确保正确的编译顺序
    3. 错误定位

      • 编译错误需要显示具体文件名和行号
      • 支持跳转到错误位置
    4. IntelliSense 支持

      • 更新自动完成,识别其他文件中的类型
      • 跨文件的定义跳转
    5. 性能优化

      • 缓存编译结果
      • 增量编译支持

    🚀 建议实施步骤

    第一阶段: 实现基础多文件编译(方案一的核心功能)

    1. 修改后端 API 支持多文件输入
    2. 前端收集所有文件并发送
    3. 实现基本的多文件编译执行

    第二阶段: 完善用户体验

    1. 添加入口文件标识
    2. 优化错误提示
    3. 支持文件间跳转

    第三阶段: 高级功能

    1. 项目模板
    2. 自动依赖分析
    3. 增量编译

    💡 其他建议

    1. 保持向后兼容:支持单文件模式作为默认选项
    2. 渐进式实现:先实现核心功能,逐步完善
    3. 参考 VS Code:UI 交互可以参考 VS Code 的多文件处理方式
    4. 添加示例项目:提供多文件项目示例,帮助用户理解

    这样的实现将大大提升 SharpPad 的模块化能力,让它更接近一个完整的在线 IDE。您觉得哪个方案更适合您的需求呢?我可以提供更详细的实现代码。

  3. gaoconggit commented on Sep 19, 2025

    @gaoconggit
    OwnerAuthor

    @claude 按方案一实现一个版本我看看

    1. 注意需要可以手动选择哪几个文件一起运行(你有更好方案也可以讨论)
    2. 创建一个新的分支干活,不要污染我的主干分支
    3. 有不懂的记得问我
  4. claude commented on Sep 19, 2025

    @claude

    Claude encountered an error —— View job


    🚀 实现多文件编译支持 (方案一)

    工作进行中...

    📋 任务清单

    • 分析当前代码结构
    • 实现后端多文件支持
      • 创建新的数据模型 (CodeRunRequest with multiple files)
      • 修改 CodeRunner 支持多文件编译
      • 更新 API 端点处理多文件请求
    • 实现前端文件选择功能
      • 添加文件选择 UI (复选框)
      • 收集选中文件内容
      • 更新运行逻辑发送多文件
    • 添加入口文件标识功能
      • UI 标识包含 Main 方法的文件
      • 后端验证入口文件
    • 测试多文件编译功能
    • 提交代码并创建 PR

    💬 实现方案说明

    我将实现一个灵活的多文件选择运行方案:

    • 用户可以通过复选框选择要一起运行的文件
    • 系统自动检测包含 Main 方法的入口文件
    • 保持向后兼容,单文件模式仍然可用

    正在开始实现...

  5. gaoconggit commented on Sep 21, 2025

    @gaoconggit
    OwnerAuthor

    @claude 接着干活

  6. claude commented on Sep 21, 2025

    @claude

    Claude finished @gaoconggit's task —— View job • claude/issue-33-20250921-1042 • Create PR ➔


    🚀 实现多文件编译支持 (方案一)

    ✅ 实现已完成!

    📋 任务清单

    • 检查当前代码状态
    • 实现后端多文件支持
      • 创建新的数据模型 (支持多文件的 MultiFileCodeRunRequest)
      • 修改 CodeRunner 添加 RunMultiFileCodeAsync 方法
      • 更新 API 端点处理多文件请求
    • 实现前端文件选择功能
      • 添加文件选择 UI (复选框)
      • 添加快捷选择按钮(选择所有CS文件/清除选择)
      • 收集选中文件内容
      • 更新运行逻辑发送多文件
    • 添加入口文件自动检测
      • 检测包含 Main 方法的文件
      • 后端编译时验证入口点
    • 创建测试示例文件
    • 提交代码并提供 PR 链接

    🎯 实现的功能

    后端改造:

    1. ✅ 创建了 MultiFileCodeRunRequest 数据模型,支持多文件传输
    2. ✅ 新增 RunMultiFileCodeAsync 方法处理多文件编译
    3. ✅ 更新 API 控制器自动识别单文件/多文件模式
    4. ✅ 编译错误会显示具体文件名和行号

    前端改造:

    1. ✅ 每个文件前添加了复选框,用于选择要一起编译的文件
    2. ✅ 添加了"✓CS"按钮快速选择所有 .cs 文件
    3. ✅ 添加了"✗"按钮清除所有选择
    4. ✅ 显示已选中文件数量
    5. ✅ 运行时自动收集选中文件并发送到后端

    特点:

    • ✅ 自动检测包含 Main 方法的入口文件
    • ✅ 支持跨文件类和方法引用
    • ✅ 保持向后兼容(未选择文件时仍以单文件模式运行)
    • ✅ 编译输出会显示正在编译的文件列表

    📦 测试示例

    在 KingOfTool/MultiFileExample/ 目录下创建了完整的多文件示例:

    • Program.cs - 主程序入口
    • Calculator.cs - 计算器类
    • Person.cs - 人员类
    • StringHelper.cs - 字符串工具类
    • README.md - 使用说明

    🔗 Pull Request

    💡 使用说明

    1. 选择文件:在文件列表中勾选要一起编译的文件
    2. 快速选择:点击 "✓CS" 按钮选择所有 .cs 文件
    3. 运行:点击运行按钮,系统会自动编译选中的文件
    4. 清除选择:点击 "✗" 按钮清除所有选择

    系统会自动检测包含 Main 方法的入口文件,支持跨文件的类和方法引用。如果没有选择任何文件,将继续以单文件模式运行当前编辑器中的代码。

  7. added a commit that references this issue on Sep 21, 2025
  8. gaoconggit commented on Sep 25, 2025

    @gaoconggit
    OwnerAuthor
  9. claude commented on Sep 25, 2025

    @claude

    Claude encountered an error —— View job


    I'll analyze this and get back to you.

  10. claude commented on Sep 25, 2025

    @claude

    Claude encountered an error —— View job


    I'll analyze this and get back to you.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions