@codometer/configuration

中文文档
0.0.74发布于 2026/11/10MITTypeScriptES Module构建来源已验证近 30 天下载 1万

CCD 配置加载器、限制定义和反分辨率

中文使用文档
文档目录16 节
  1. 配置文件
  2. 决议
  3. 测量到什么
  4. 投入
  5. 替换已建的编码库输入
  6. 限制
  7. 自定义统计
  8. 计数声明
  9. 选择注释预算
  10. 反间谍
  11. 产出
  12. 写入 Markdown
  13. 出口
  14. 测试
  15. 许可证
  16. * 调和

QQ 计程器配置

npm

配置参考 计数器。 。 。 .

@codometer/configuration 读取寄存器 codometer.config.ts 手和双手 返回一个完全默认的配置对象。 这是唯一一个知道 任何关于某一存放处的资料; @codometer/cli 措施 配置描述 .

npm install --save-dev @codometer/configuration

输入配置文件时直接安装它 . @codometer/cli 已经取决于它.

配置文件

A 类 codometer.config.{ts,mts,cts,js,mjs,cjs,json,jsonc} 文件从 路径 --config <path>,则需要: 搜索且没有默认文件 . format 是那个 字段每个配置必须设置——它没有代码级倒置—— 和所有其他领域都是可选的.

import { type CodometerConfiguration } from "@codometer/configuration";

const codometerConfiguration: CodometerConfiguration = {
  // Which report shape this run produces. Required; no default.
  format: "markdown",
  // Appended to the built-in exclusions (node_modules, dist, build, coverage,
  // .nx), matched against repository-relative paths with `path.matchesGlob`.
  exclude: ["notepads/**", "**/templates/**"],
  // Ignore files in gitignore syntax, whose patterns exclude as well.
  excludeFrom: ["configuration/.codometerignore"],
  // Named sets of files measured alongside the codebase itself. The built-in
  // `codebase` whole-tree scan is always present unless one of these entries
  // replaces it by name.
  inputs: [
    {
      analyses: ["size"],
      compression: "gzip",
      include: ["dist/**/*.js", "!dist/**/*.map.js"],
      name: "compiled",
    },
  ],
  // Target an unqualified limit path belongs to.
  defaultInput: "codebase",
  // How high each measured metric may go.
  limits: [
    { metric: "compiled.size", value: "8 KB" },
    { metric: "typescript.interfaces", severity: "warn", value: 500 },
  ],
  // Destinations the measured statistics are written to.
  outputs: [
    { indentation: 2, path: "output/codometer.json", type: "json" },
    {
      description: "Measured on every push.",
      // Named something other than the defaults on purpose: a file holding the
      // default start marker anywhere — a document like this one, explaining
      // it — reads as already carrying the block, and gets no block of its own.
      endMarker: "<!-- STATISTICS_END -->",
      path: "README.md",
      startMarker: "<!-- STATISTICS_START -->",
      type: "markdown",
    },
  ],
  // Interpreter used for Python analysis; defaults to `python3`.
  python: { command: "uv run python" },
};

export default codometerConfiguration;

输出路径相对于进程的工作目录被解析, 而不是 配置文件,所以将配置保存在 configuration/ 文件夹 仍然写入寄存器根 .

决议

需要配置路径 : ConfigurationService.loadConfiguration 使用一个 configurationPath 没有其他的, 而CLI拒绝运行,没有 --config。相对路径将按工作目录解决,然后 寄存器根; 命名无文件的路径失败,但未找到错误.

单独回答命名的文件: 不折叠祖先的配置 这个 合并会留下一个限制 从来没有应用 完全像一个 让他们分道扬镳 意味着知道哪些文件 每一个球场来自。 配置文件总是被读作普通对象——一个导出为 函数不被识别,返回到空配置,即 文件导出的方式相同 42 已经.

测量到什么

发现者走过目录本身并读取 .gitignore 它过去了,所以 .gitignore 已经生效: 构建目录或虚拟环境 在它忽略了文件名的地方被剪贴, 并且没有排除它必须再次命名 . Git 从未被引用, 因此一个根本不是寄存器的目录会被测量 和所测量的一样 而不是索引——一个存在且不被忽略的文件,无论它是否 已经承诺了。 两种排除方案是相反的 案例:保存但无人写的文件.

选项语法用它来
exclude球, 匹配为 path.matchesGlob内置默认的几条路径
excludeFrom忽略文件的路径, 用吉提格诺语法锁定文件、销售捆绑、生成的文件——列表中一个仓库宁愿保存在文件中

excludeFrom 文件被读取为 gitignore 语法, 并本地匹配, 所以 否定、锚定和目录模式与 .gitignore,然后将codometer指向一个文件,另一个已经读取的工具给出 同样的答案,工具得到。 匹配在每个平台上都很敏感, 故意: git 从任何它发现自己的文件系统中取出它,和 a 在笔记本电脑和CI之间有分歧的测量比 严一.

在重用已存在的被忽略文件时要小心: 多数文件是为一个文件撰写的 工具的关切,而不是衡量。 A 类 .prettierignore 通常忽略所有 标记下,因为一个标记下 linter 处理它 - 点codometer 在那和 传言指标消失了。 专款 .codometerignore 通常比较好 答话.

投入

一个 投入 是一组有名的文件,由包含并排除阴道而宣布, 与分析 运行在它. inputs 是数组——替换什么 旧称 targets ——一个条目总是存在,无论是否 配置声明任何:内置 codebase 扫描,哪些措施 所有被忽略的文件都留下并运行 language 对它进行分析.

inputs: [
  {
    analyses: ["size"],
    compression: "gzip",
    exclude: ["dist/vendor/**"],
    include: ["dist/**/*.js", "!dist/**/*.map.js"],
    name: "compiled",
  },
],
外地需求默认含义
name对—— 说何等为入. 两种投入可能不共享一种
include对—— 说添加文件的手套 。 至少必须添加而不是去除
exclude没有无删除文件的球
analyses对—— 说language, (中文(简体) ), size或两者兼有。 至少一个
compression没有gzipgzip, (中文(简体) ), brotli,或 none 用于磁盘上的字节
directory没有.与进程工作目录相比,输入的光泽开始之处

language 运行同样的分析器 代码库得到. size 压缩每个 匹配文件 独自一人 并总结结果,不是全部, 它会发现匹配的跨文件边界, 并报告总共没有客户端 永远收到。 Gzip在9级压缩,在11级压缩 明确而不是留待图书馆默认值.

A 类 ! 前缀在 include 删除文件而不是添加它们。 说明是 收集成一组,适用于整个输入,而不是顺序 它们被写入,因此重排数组不能更改文件 输入保存。 A 类 ! 内 exclude 被拒绝 : 该列表已经删除文件, 所以,没有什么可以否认的.

对已声明的输入不参考忽略文件 。 这是故意的,而且 用来衡量编译的输出的是什么——每个目录 .gitignore 因此,任何无视规则都无法达到。 文件输入 匹配但无法读取运行失败, 而不是计为 0 字节: a 完全悄悄的短于一个文件 比没有总数.

替换已建的编码库输入

声明命名的输入 codebase 替换内置全树扫描 而不是在它旁边添加:

inputs: [
  { analyses: ["language", "size"], compression: "none", include: ["**/*"], name: "codebase" },
],

仅限其 compression 财务报告和审定财务报表 analyses 读取. 内容 include 财务报告和审定财务报表 exclude 完全不参考阴道 ——全树扫描发现者 移动寄存器忽略文件,而不是匹配 globs,所以 include: ["**/*"] 上面是占位符,缩小到 src/** 将 没有什么狭窄的 要测量树的子集,请在 还有一些别的名字.

这是在不同的压缩下测量整个树的唯一方法 或一组分析,比内置条目运行.

限制

A 类 限制 测量的度量标准可能有多高。 任何衡量标准都可以包含一个——a 压缩大小、行数、以下公约的柜台——以及 测量和汇报的界限与以往完全相同 没什么.

defaultInput: "codebase",
limits: [
  { metric: "Compiled JavaScript.size", value: "8 KB" },
  { label: "Interfaces", metric: "typescript.interfaces", value: 500 },
  { metric: "linesOfCode", severity: "warn", value: 100_000 },
],
外地需求默认含义
metric对—— 说参数的点出路径
value对—— 说作为数字或带有单位的字符串,衡量标准可能有多高
severity没有failfail 停止在突破处的跑道; warn 报告
label没有路径将限制称为报告

衡量标准由输入的名称及其路径处理 投入 - codebase.typescript.interfaces, (中文(简体) ), codebase.markdown.files, (中文(简体) ), Compiled JavaScript.size。每个输入带 files,输入运行大小 分析带 size,而一个运行中的语言分析每个 计数器,并按 custom.<label>。 。 。 . 设定 defaultInput 而命名不输入的路径会被读取为该输入.

在一个 defaultInput 设置时,路径读取为输入时没有 输入名称的前缀——所以 defaultInput: "codebase" 和输入 调用 typescript, (中文(简体) ), typescript.interfaces 是密码库的,因为 typescript 输入没有 interfaces 和它竞争. 只要输入和计量组共用一个,就全部写入输入名称.

蒙昧被拒绝, 从来没有解决. 一条路可以命名两个标准—— 名为输入 markdown 除了密码库 markdown.files 失败 运行时对两个读数进行命名,一个路径命名无,一个命名有 根据分析,输入从未运行。 限制,悄悄地绑在 错误的衡量标准 看起来像一个有效.

作为字符串写入的值带有 小数 追踪的单位 b 实值 要求: "8 KB" 8000个字节和 "1 MB" 千分之一,而 "8 K" 没有 大小,被拒绝 而不是被读作任何东西。 值无能读取 失败运行而不是被取为零.

匹配的输入 没有文件 运行失败, 如果且只在限制是时 写反对它。 声明限制表示文件已经存在, 所以空的 匹配是停止匹配的软体或从未运行的构造,而 输入无限制 仅计量为零, 这是不可注意的 .

自定义统计

按公约命名文件的寄存器没有语言词汇 分析师知道 高层 custom 数组是什么 措施 这些 计数器,不论任何产出是否或在何处产生:

custom: [
  { label: "Service Files", patterns: ["**/*.service.ts"] },
  { label: "Unit Tests", patterns: ["**/*.unit.test.ts"] },
  { color: "16a34a", label: "Migrations", patterns: ["**/migrations/*.sql"] },
],

每个条目都变成一个徽章,按照它被配置的顺序,随处可见 选中 。 球被匹配到寄存器关联路径 path.matchesGlob 在同一个发现的文档上,其他所有的措施,所以 不适用。 匹配数个条目的文档计算一次 . color 是一个盾牌。 io 十六进制三进制; 省略其下一条条目 内置调色板的颜色,循环,所以计数器的颜色不变 运行之间.

一个计数器用三个字段中的一个来选择它的价值 patterns, (中文(简体) ), symbols,或 comment - 并且至少需要其中之一,或者被拒绝作为 无所计.

输出本身 custom 数组是一个单独的后期关切: 选择, (中文(简体) ), 通过标签, 哪个顶级的计数器 目的地的 - 它从来没有 宣布自己的柜台。 JSON报告和降级报告可能仍然 选择完全不同的标签 :

custom: [
  { label: "Service Files", patterns: ["**/*.service.ts"] },
  { label: "Unit Tests", patterns: ["**/*.unit.test.ts"] },
],
outputs: [
  { custom: ["Service Files"], path: "codometer-report.json", type: "json" },
  { custom: ["Unit Tests"], path: "README.md", type: "markdown" },
],

标签输出选择顶级 custom 从来没有宣布 当配置加载时被拒绝 —— 选择不能设置一个计数器 从来没有被测量。 顶级的计数器宣布,但没有选择输出 仍然被测量,仍然被限制;它只是使无所事事.

计数声明

symbols 计算 TypeScript 和 JavaScript 源代码中的申报,而不是 文档。 它要求一个或一个以上 kinds,可选择缩小为声明 携带每个命名的修改符:

custom: [
  {
    group: "typescript",
    label: "Static Methods",
    symbols: { kinds: ["method"], modifiers: ["static"] },
  },
  { label: "Abstract Classes", symbols: { kinds: ["class"], modifiers: ["abstract"] } },
],

kinds 为: class, (中文(简体) ), enum, (中文(简体) ), function, (中文(简体) ), getter, (中文(简体) ), interface, (中文(简体) ), method, (中文(简体) ), property,以及 setter。 。 。 . modifiers 为: abstract, (中文(简体) ), async, (中文(简体) ), export, (中文(简体) ), override, (中文(简体) ), private, (中文(简体) ), protected, (中文(简体) ), public, (中文(简体) ), readonly,以及 static。 。 。 .

二者从字面上读出,从语法上读出. 以班级成员身份撰写的可调用文字 是一个 method;一个写在任何地方是 function箭头函数 包含。 持有箭头函数的类字段是 property,则 箭头没有带字段的修饰符——所以 static build = () => {} 实值 通过要求静态属性,而不是静态方法找到. public 匹配 附加说明的成员 public,而非因疏忽而公开的成员,以及 private 不匹配一个 #name 字段,该字段根本没有修改符号.

符号计数器也可携带 patterns,然后缩小 哪些文件是 搜索 而不是被计算在内 patterns: ["packages/**"] 与 (单位:千美元) symbols 匹配者计数声明 packages/。计算发生在 typeScript 分析器已经做的行走,所以这些成本的任何数量 一个通过源.

选择注释预算

comment 选择用于计量的注释预算,而不是 计算文件或声明 :

custom: [
  { comment: { language: "yaml", maximumWords: 128 }, label: "YAML Comment Budget" },
  { comment: { kind: "class", maximumLines: 24 }, label: "Class Comment Budget" },
],
外地需求默认含义
language没有带有注释的每种语言将预算缩减为其中之一 css, (中文(简体) ), hcl, (中文(简体) ), python, (中文(简体) ), shell, (中文(简体) ), sql, (中文(简体) ), toml, (中文(简体) ), typescript, (中文(简体) ), yaml
kind没有纯注释块与一份有文件记录的声明的JSDoc风格的评论相去甚远
maximumCharacters没有—— 说每个块可能持有多少个字符,标记和新行以及所有
maximumLines没有—— 说每个块可跨几行
maximumWords没有—— 说一旦标记被剥去,一个街区的传教词会保留多少
severity没有failfail 停止在突破处的跑道; warn 报告

内容 value 是一个计数 —— 选择者自己打破了多少块 maximumCharacters编号 :maximumLines编号 :maximumWords ——及其 instances 名称 每一个突破区 file 和 1 索引 line,加上它测量了多少. 留在预算范围内的区块对两者都不利.

一个没有的条目 patterns, (中文(简体) ), symbols,或 comment 被拒绝 而不是报告为永久零.

反间谍

group 命名徽章组,一个计数器将在该组的 内置徽章. 默认为 conventions - 一个只存在于 这些计数器,在没有属于它时完全省略。 任何已提供 组合可改为: css, (中文(简体) ), hcl, (中文(简体) ), json, (中文(简体) ), jupyter, (中文(简体) ), markdown, (中文(简体) ), python, (中文(简体) ), repository, (中文(简体) ), shell, (中文(简体) ), sql, (中文(简体) ), toml, (中文(简体) ), typescript,或 yaml名称 该集外部失败了配置, 而不是无处渲染 .

默认调色板将每个组运行在顶层 custom 阵列,所以 在一个组中添加一个计数器,永远不会重新显示另一个组的徽章。 A 类 计数器的颜色一旦在那里定了下来——一个输出选择它返回 标签使分辨率给它的任何颜色,而不是循环 它自己的调色板.

产出

outputs 是一系列已输入的目的地, 以替换以前是 固定键 output 对象。 随你怎么说 包括不止一个 一类:

outputs: [
  { indentation: 2, path: "output/codometer.json", type: "json" },
  { path: "README.md", type: "markdown" },
],

需要 JSON 输入 path· ; indentation 默认为 2。减值条目 需要一个 path页:1 write 函数,或两者兼而有之——既未命名目的 配置加载时拒绝 .

写入 Markdown

默认减记报告是 description 后段为盾牌.io 一个下方的徽章 ### 每个语言的标题,在两个锚之间分解 标记. write 是整个自定义的行为 两者决定 报告所说的话,以及报告落地之处, 取代了过去的两个 单独 render 财务报告和审定财务报表 write 回调 :

{
  path: "README.md",
  type: "markdown",
  write: ({ anchors, renderBadges, statistics }) =>
    anchors.syncAnchoredBlock({
      content: `Lines of code: ${statistics.linesOfCode}\n\n${renderBadges()}`,
    }),
}
参数含义
description配置的描述, 对于要自己放置的作者
renderBadges()这些相同统计数据的内置徽章渲染——称其为构建默认内容,或添加到其中
statistics计量统计
check当无法写入文件而文件仅被检查时为真
path已配置的路径, 根据进程的工作目录解决
anchors标记力学,所以选择不同的文件 并不意味着重用相片
锁定助手对
anchors.syncAnchoredBlock({ content?, path? })将块切入文件,在标记缺失时附加并创建文件。 在检查模式中,它比较而不是写入文件,并返回文件是否为当前文件 .
anchors.wrapInAnchors(content?)返回包含在标记中的内容, 因为作者将它放在某个地方 .
anchors.startMarker 编号 : anchors.endMarker已配置的标记 .

离开 write 未设置保留内置渲染和写入 。 A 类 write 函数返回 false 将目的地报告为已失效 失败 --check 运行; 其它内容都算为最新.

出口

ConfigurationService 财务报告和审定财务报表 ConfigurationModule,加上 CodometerConfiguration 键入您的配置和解析的形状 cLI读取.

测试

nx run codometer-configuration:vitest

许可证

麻省理工学院——见 自由主义。 。 。 .

* 调和

这个项目源于 巢-服务-项目 符合模板.

版本与发布记录

@codometer/configuration 共发布 72 个版本,首次发布于 2026/10/05;过去 12 个月发布了 72 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
0.0.74latest2026/11/10今天
0.0.732026/11/091 天前
0.0.722026/11/091 天前
0.0.712026/11/091 天前
0.0.702026/11/082 天前
0.0.692026/11/073 天前

关于 @codometer/configuration 的常见问题

@codometer/configuration 是什么?

CCD 配置加载器、限制定义和反分辨率

如何安装 @codometer/configuration?

在项目目录运行 npm install @codometer/configuration,或使用 pnpm add / yarn add / bun add。

@codometer/configuration 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@codometer/configuration 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@codometer/configuration 可以商用吗?

@codometer/configuration 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@codometer/configuration 的下载量有多少?

根据 npm 官方下载统计,@codometer/configuration 在 2026/10/10 – 2026/11/08 这 30 天内被下载 10,134 次,日均约 338 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@codometer/configuration 还在维护吗?

最新版本 0.0.74 发布于 2026/11/10(今天);至今共发布 72 个版本,其中过去 12 个月发布了 72 个;首次发布于 2026/10/05。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。