You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建带自定义PMC命令的NuGet包扩展项目处理能力

可打包为NuGet、支持PMC自定义命令的工具集实现方案

这套实现逻辑和Microsoft.EntityFrameworkCore.Tools的底层机制完全一致,没有特殊黑科技,按以下步骤落地即可实现安装后在包管理器控制台执行自定义代码分析、生成命令的效果。

项目分层设计

不要把所有逻辑塞到单个类库,避免出现程序集被用户项目引用、VS版本兼容问题,建议拆成三个独立项目:

  • 核心逻辑层:用.NET Standard 2.0做目标框架,和VS环境完全解耦,存放所有代码分析、代码生成、文件修改的业务逻辑,所有Roslyn语法树操作、模板渲染逻辑都放在这一层,方便单独写单元测试
  • PMC适配层:目标框架选匹配VS运行时CLR版本的.NET Framework版本,引用VS自动化接口相关程序集,负责和包管理器控制台交互、接收命令参数、调用核心逻辑层的能力
  • 主NuGet包项目:只做包元数据配置和文件打包,不写业务代码,最终用户安装的就是这个包。

PMC命令注册核心流程

VS包管理器控制台加载NuGet包命令的规则是固定的,只要按规则放文件就能自动加载:

  1. 配置打包规则,把PMC适配层编译出的所有dll、依赖项、初始化脚本,全部放到NuGet包根目录的tools文件夹下,不要把这些文件放到lib文件夹,否则会被当成普通程序集引用编译进用户的项目。
  2. 在tools文件夹下添加init.ps1脚本,这个脚本会在NuGet包安装完成、VS启动解决方案加载包的时候自动执行,是命令注册的入口,脚本核心逻辑参考:
    param($installPath, $toolsPath, $package, $project)
    # 加载PMC命令注册程序集
    $asmPath = Join-Path $toolsPath "YourToolset.PmcAdapter.dll"
    if (Test-Path $asmPath) {
        Import-Module $asmPath
        # 调用程序集内的注册方法,把所有自定义命令挂载到当前PMC上下文
        Register-CustomToolCommands
    }
    
  3. 在PMC适配层实现命令注册逻辑:每个自定义命令(比如你需要的analyze-code、gen-repository这类命令)需要绑定两个核心逻辑:一是命令执行委托,接收用户输入的参数,定位当前操作的目标项目,调用核心逻辑层完成代码分析/生成操作;二是Tab补全逻辑,支持用户输入命令时按Tab自动补全参数、项目内的类名/文件路径,和EF Core Tools的使用体验对齐。

项目操作注意事项

要达到和EF Core Tools一致的操作体验,不要直接用本地文件IO读写用户项目:

  • 所有项目文件、目录的修改操作,优先通过EnvDTE自动化对象模型提供的接口完成,这样修改会被VS自动识别,同步更新项目文件列表、触发源码管理变更提示,不会出现文件已经改了但VS界面没刷新的问题
  • 代码分析和生成逻辑基于Roslyn语法树实现,不要用正则做文本替换,避免破坏用户原有代码的格式、注释、引用关系,生成的代码自动补全using引用,匹配当前项目的代码缩进规则
  • 命令执行时默认取PMC顶部下拉框选中的默认项目作为操作目标,和EF Core命令的默认行为保持一致,不要硬编码扫描解决方案目录找项目。

打包调试要点

  • 包元数据里标记<DevelopmentDependency>true</DevelopmentDependency>,标记这个包是开发时依赖,不会随用户项目编译发布
  • 本地调试时把包的本地输出目录添加到VS的NuGet源列表,启动VS实验实例安装测试包,附加到devenv进程即可断点调试命令执行逻辑
  • 适配层调用VS接口时做好版本兼容判断,不要使用仅高版本VS支持的API,避免低版本VS用户安装后命令加载失败。

内容的提问来源于stack exchange,提问作者IP.AF

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 23:51:29