代码语言
知识点思维导图
51 个知识节点
生产工程(14) - 附录:常用命令
本文命令只使用相对路径和占位变量。 执行前先阅读项目 README、锁文件和脚本定义,不能假定每个仓库都使用相同端口或包管理器。 验收命令时同时看退出码、标准错误、生成物和状态变化,最后一行没有红字不代表成功。
一、确认运行时与工具链
node --version
corepack --version
pnpm --version
python3 --version
git --version
docker --version
- Node.js 版本应与
.node-version、.nvmrc或package.json#engines一致。 - 包管理器与锁文件必须匹配,存在
pnpm-lock.yaml时不要擅自改用 npm。 - Python 版本应与
pyproject.toml、.python-version或部署镜像一致。 - CI 与本地工具链不同会让“本地通过”失去可复现意义。
二、Node.js 依赖安装
corepack enable
pnpm install --frozen-lockfile
pnpm list --depth 0
--frozen-lockfile禁止安装过程静默改写锁文件。- 安装失败先看 Node.js 版本、锁文件格式、包源和原生依赖编译错误。
- 不用删除锁文件作为默认修复;这会改变整个依赖解析结果。
pnpm list --depth 0用于核对直接依赖,不证明运行时行为正确。
三、Node.js 静态检查与测试
pnpm lint
pnpm typecheck
pnpm test
pnpm build
- Lint 检查约定和部分缺陷,不能替代类型检查。
- 类型检查验证静态契约,不能证明运行时数据符合类型。
- 测试验证被覆盖行为,不能证明未覆盖路径正确。
- 构建验证生产产物能生成,仍需启动产物做冒烟测试。
四、定位可用脚本
pnpm run
node -p "require('./package.json').scripts"
- 先读取脚本定义,再决定执行
dev、start、test或自定义命令。 - 不把文档中的通用脚本名当作仓库事实。
- 脚本调用其他工具时,错误退出码应向上传递。
五、创建 Python 虚拟环境
python3 -m venv .venv
source .venv/bin/activate
python -c "import sys; print(sys.executable)"
python -m pip --version
sys.executable应指向当前项目的.venv。- 使用
python -m pip可以避免pip指向另一个解释器。 - 虚拟环境只隔离 Python 包,不隔离系统库、GPU 驱动或外部服务。
六、安装 Python 依赖
python -m pip install --upgrade pip
python -m pip install -r requirements.txt
python -m pip check
- 生产项目优先使用仓库已有锁定工具和锁文件。
pip check检查已安装包声明的依赖冲突,不验证 API 行为兼容。- 安装失败要保留完整解析或编译日志,不要反复更换版本碰运气。
七、Python 质量检查
python -m ruff check .
python -m mypy .
python -m pytest -q
- 这些命令只有在项目声明对应依赖和配置时才执行。
- 单个失败测试可用完整节点 ID 重放,避免每次运行全库掩盖现场。
- 修复后仍要恢复执行相关测试集,防止只让单例通过。
八、运行单个 pytest 样本
python -m pytest tests/test_chat.py::test_rejects_oversized_context -vv
python -m pytest tests/test_chat.py -k "timeout or rate_limit" -vv
-vv帮助保留参数与断言位置。-k是表达式过滤,不应作为永久跳过其他回归的方式。- 随机失败要记录随机种子、并发、输入和外部依赖状态。
九、启动本地 API
python -m uvicorn app.main:app --host 127.0.0.1 --port 8000
- 本地默认绑定回环地址,除非明确需要局域网访问。
- 模块路径和应用对象以当前项目为准。
- 启动日志出现端口不代表依赖就绪,仍需独立 readiness 检查。
十、检查监听端口
lsof -nP -iTCP:8000 -sTCP:LISTEN
curl --fail-with-body --max-time 5 http://127.0.0.1:8000/health
- 第一条确认哪个进程监听端口。
- 第二条要求 4xx 或 5xx 返回非零退出码,并限制总等待时间。
- 健康接口应区分存活和就绪,不能始终返回固定 200。
十一、验证 JSON API
curl --fail-with-body --max-time 30 \
-X POST http://127.0.0.1:8000/api/chat \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer <test-token>' \
-H 'X-Request-Id: local-chat-001' \
-d '{"message":"报销流程是什么?","session_id":"local-test"}'
- 使用测试令牌,不把真实 Key 写进 shell 历史或文章。
- 保存请求 ID 以关联应用日志、模型调用和检索 Trace。
- 同时验证非法 JSON、缺字段、无权限和超时路径。
十二、查看响应头和状态
curl --silent --show-error \
--dump-header /tmp/chat-headers.txt \
--output /tmp/chat-body.json \
--write-out '%{http_code} %{time_starttransfer} %{time_total}\n' \
http://127.0.0.1:8000/health
- 状态码、首字时间和总时间比肉眼观察页面更适合建立基线。
- 临时文件不得包含生产密钥和未脱敏业务数据。
- 命令成功后仍应解析必要 JSON 字段,而不是只检查 HTTP 200。
十三、验证流式响应
curl --no-buffer --fail-with-body --max-time 60 \
-H 'Accept: text/event-stream' \
http://127.0.0.1:8000/api/stream
--no-buffer让事件到达时立即显示,便于检查首块延迟。- 验证事件类型、序号、完成事件和中途错误。
- 连接关闭不等于业务完成,必须看到协议约定的结束信号。
十四、Docker 构建
docker build --pull --tag ai-app:local .
docker image inspect ai-app:local
--pull尝试使用基础镜像的新版本,发布构建还应固定可审计的镜像摘要。- 检查镜像入口、用户、环境变量和架构。
- 构建成功后要运行容器并验证健康与优雅停止。
十五、Docker 运行与日志
docker run --rm --name ai-app-local \
--env-file .env.test \
--publish 8000:8000 \
ai-app:local
docker logs --timestamps ai-app-local
.env.test只能包含测试配置,并应被版本控制忽略。- 不在命令行直接传真实 Key,避免出现在进程列表和历史记录。
- 日志应包含请求关联字段,不应包含完整 Prompt 或密钥。
十六、Docker Compose
docker compose config
docker compose up --build
docker compose ps
docker compose logs --timestamps --tail 200
docker compose config先解析合并后的配置,检查变量缺失。ps需要同时看运行状态和健康状态。- 停止测试环境使用项目明确的生命周期命令,避免误删共享卷。
十七、Git 变更范围
git status --short
git diff --stat
git diff --check
git diff
status确认修改与未跟踪文件范围。diff --stat快速发现异常批量改写或大文件。diff --check查尾随空格和冲突标记,不检查业务正确性。- 完整 Diff 必须逐段阅读,不能只看统计。
十八、检查指定文件历史
git log --oneline -- path/to/file
git blame -L 20,60 -- path/to/file
- 历史用于理解约束和根因,不是修改无关旧代码的授权。
blame只显示最后一次逐行修改,不能独立证明设计意图。- 发现用户未提交改动时要保留并与其协同,不能覆盖或还原。
十九、搜索代码与配置
rg -n "MODEL_NAME|BASE_URL|timeout" src tests
rg --files | rg '(^|/)(README|pyproject|package|Dockerfile)'
- 先用精确标识、错误码或字段名搜索,避免宽泛关键词制造噪声。
- 搜索结果要回到实际调用链和当前运行配置验证。
- 配置名相同不代表运行时一定读取了该文件。
二十、检查 JSON 与 YAML
jq . config/example.json
python -c "import yaml; print(yaml.safe_load(open('config/example.yaml')))"
- 解析成功只证明语法可读,不证明字段满足应用 Schema。
- 禁止用不安全 YAML loader 处理不可信输入。
- 配置验收还应启动应用或运行专用配置校验命令。
二十一、记录时间与退出码
time pnpm test
pnpm test
test_exit_code=$?
printf 'test_exit_code=%s\n' "$test_exit_code"
- 退出码必须在紧邻目标命令后读取。
- 不要在读取退出码前插入其他命令,否则记录的是错误对象。
- 性能比较要固定机器、负载、依赖和缓存状态。
二十二、命令失败时的判断顺序
- 确认执行目录和目标仓库正确。
- 确认命令来自当前项目脚本或官方文档。
- 记录完整命令、退出码、标准输出和标准错误。
- 核对运行时、依赖、环境变量和外部服务版本。
- 用最小失败样本重放,每次只改变一个变量。
- 修复后执行原失败命令和相关回归命令。
二十三、命令记录模板
| 字段 | 记录内容 |
|---|---|
| 目的 | 该命令验证哪个具体结论 |
| 目录 | 相对仓库根目录的位置 |
| 版本 | 代码、运行时、依赖和镜像 |
| 输入 | 参数、测试数据和脱敏配置 |
| 退出码 | 成功必须为预期退出码 |
| 输出 | 关键标准输出、错误和生成物 |
| 副作用 | 文件、数据库、队列或外部调用 |
| 回归 | 正常、边界和失败路径命令 |
二十四、总结
- 先识别项目约定:锁文件、脚本和版本声明优先于通用命令清单。
- 同时看证据:退出码、输出、产物和状态变化共同决定是否成功。
- 失败要可重放:保留目录、版本、输入和错误,不用重复运行碰运气。
- 发布要分层验证:Lint、类型、测试、构建、启动和健康检查不能互相替代。
- 保护敏感信息:测试 Key、脱敏数据和临时文件都要有明确边界。