1. 为什么需要代码打包工具?
在AI编程辅助日益普及的今天,开发者们越来越频繁地将项目代码直接粘贴到Prompt中与大模型交互。这种工作方式看似简单,实则暗藏痛点:
- 文件碎片化:现代项目通常包含数十甚至上百个文件,手动复制粘贴耗时且易遗漏
- 结构混乱:直接粘贴的代码缺乏文件路径信息,模型难以理解代码间的关联
- 噪音干扰:构建产物、日志文件等非核心代码会污染Prompt,降低模型理解效率
- 格式问题:不同IDE的复制操作可能引入隐藏字符或格式错乱
我曾在重构一个中型前端项目时,需要向模型咨询架构建议。当时手动复制了37个文件,不仅花费20多分钟,还漏掉了关键的依赖声明文件,导致模型给出的方案完全不可行。这种经历促使我开发了pmc工具。
2. pmc核心设计理念
pmc(pack-my-code)的定位是"Prompt专用的代码打包器",与常规压缩工具相比有几个关键差异点:
2.1 轻量优先
- 单二进制文件,无运行时依赖(Lua编译为原生二进制)
- 仅400行核心代码,启动时间<50ms
- 内存占用控制在10MB以内
2.2 AI友好格式
- 自动用Markdown代码块包裹每个文件
// path/to/file.js function hello() { console.log("Hello from pmc!"); }- 保留相对路径作为注释头
- 可选显示文件树形结构
2.3 智能过滤
- 默认遵循.gitignore规则
- 支持扩展名白名单/黑名单
- 可配置文件大小上限(避免粘贴大体积二进制文件)
3. 安装与基础使用
3.1 安装方法
从GitHub Release页面下载对应平台的预编译二进制:
# Linux/macOS wget https://github.com/Water-Run/pack-my-code/releases/latest/download/pmc-linux -O /usr/local/bin/pmc chmod +x /usr/local/bin/pmc # Windows # 下载pmc-win.exe后添加到PATH环境变量提示:遇到权限问题可尝试
sudo install或调整目标目录权限
3.2 基础命令
在项目根目录执行:
pmc . | pbcopy # macOS复制到剪贴板 pmc . > prompt.md # 输出到文件典型输出结构:
# Project Structure - src/ - index.js (23 lines) - utils/ - helper.js (56 lines) // src/index.js import { greet } from './utils/helper'; greet('pmc user'); // src/utils/helper.js export function greet(name) { return `Hello ${name}!`; }4. 高级功能详解
4.1 YAML配置模式
创建.pmc.yml实现精细控制:
include: - "src/**/*.js" - "lib/*.lua" exclude: - "**/*.spec.js" - "node_modules" options: show_stats: true max_file_size: 100KB4.2 实用命令行参数
| 参数 | 作用 | 示例 |
|---|---|---|
-i | 包含模式 | pmc -i "*.py" |
-e | 排除模式 | pmc -e "temp/*" |
-t | 显示文件树 | pmc -t |
-s | 显示统计 | pmc -s |
-l | 行数限制 | pmc -l 5000 |
4.3 与CI/CD集成
在GitHub Actions中自动生成代码快照:
- name: Generate code prompt run: | pmc . --no-tree > prompt-${GITHUB_SHA:0:7}.md gh release upload latest prompt-*.md5. 实战技巧与避坑指南
5.1 最佳实践
- 预处理敏感信息:使用
-e参数排除config/secret.*等文件 - 控制输出体积:通过
-l限制总行数,建议不超过8000行 - 版本标记:在输出顶部添加
// @git-commit: xxxxxxx便于追溯
5.2 常见问题排查
问题1:执行后无输出
- 检查当前目录是否包含代码文件
- 确认.gitignore没有过度过滤
问题2:中文路径乱码
- 设置终端编码为UTF-8:
export LANG=en_US.UTF-8
问题3:权限拒绝
- 对二进制添加执行权限:
chmod +x pmc
5.3 性能优化
对于超大型项目(10万+行代码):
# 分模块处理 pmc src/core > core.md pmc src/utils > utils.md6. 技术实现解析
pmc的核心处理流程分为四个阶段:
- 文件收集:递归扫描目录,应用过滤规则
- 内容处理:统一换行符、移除BOM头等标准化操作
- 格式组装:添加Markdown标记和路径注释
- 输出控制:处理统计信息、树形显示等元数据
关键代码片段(简化版):
function process_file(path) local content = read_file(path) content = normalize_line_endings(content) return string.format("// %s\n```%s\n%s\n```", path, get_file_extension(path), content) end我在实际使用中发现,对TypeScript项目添加@filename注释能显著提升模型理解准确度。例如将:
// src/app.ts改为:
// @module:app @file:src/app.ts这种结构化标记能让模型更清楚代码的组织架构