# @codometer/configuration 中文文档

规范地址：https://npmcn.com/package/%40codometer/configuration/

版本：0\.0\.74
npm 元数据更新时间：2026-11-10T03:11:11.048Z
中文译文更新时间：2026-11-10T09:21:54.728Z
软件包许可：MIT

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40codometer/configuration
原文对照：https://npmcn.com/package/%40codometer/configuration/?lang=original
项目主页：https://github.com/organizzolini/codebase/tree/main/projects/ic-suite/codometer/codometer-configuration#readme
源码仓库：https://github.com/organizzolini/codebase

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：99.5 kB，6 个文件
- 模块格式：ES Module
- TypeScript 类型：包内自带
- 运行依赖：6 个
- 首次发布：2026-10-04T22:26:18.688Z
- 最新版本发布：2026-11-10T03:11:10.680Z
- 近 30 天下载量：10134（2026-10-10 至 2026-11-08，npm 官方下载统计）
- 已发布版本数：72（近 12 个月 72 个）

## 中文简介

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

## 安装

```sh
npm install @codometer/configuration
```

也可以使用：`pnpm add @codometer/configuration`、`yarn add @codometer/configuration`、`bun add @codometer/configuration`

## README

# QQ 计程器配置

[![npm](https://img.shields.io/npm/v/@codometer/configuration?logo=npm&label=npm)](https://www.npmjs.com/package/@codometer/configuration)

**配置参考 [计数器](https://npmcn.com/package/%40codometer/codometer-cli/README.md)。 。 。 .**

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

```bash
npm install --save-dev @codometer/configuration
```

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

## 配置文件

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

```ts
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` 对它进行分析.

```ts
inputs: [
  {
    analyses: ["size"],
    compression: "gzip",
    exclude: ["dist/vendor/**"],
    include: ["dist/**/*.js", "!dist/**/*.map.js"],
    name: "compiled",
  },
],
```

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

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

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

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

### 替换已建的编码库输入

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

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

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

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

## 限制

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

```ts
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` | 没有 | `fail` | `fail` 停止在突破处的跑道; `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` 数组是什么 **措施** 这些 计数器,不论任何产出是否或在何处产生:

```ts
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报告和降级报告可能仍然 选择完全不同的标签 :

```ts
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`,可选择缩小为声明 携带每个命名的修改符:

```ts
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` 选择用于计量的注释预算,而不是 计算文件或声明 :

```ts
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` | 没有 | `fail` | `fail` 停止在突破处的跑道; `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` 对象。 随你怎么说 包括不止一个 一类:

```ts
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` 回调 :

```ts
{
  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读取.

## 测试

```bash
nx run codometer-configuration:vitest
```

## 许可证

麻省理工学院——见 [自由主义](https://npmcn.com/package/LICENSE)。 。 。 .

## \* 调和

这个项目源于 [巢-服务-项目](https://npmcn.com/configuration/conformetry-templates/nestjs-service-project) 符合模板.

## 常见问题

### @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 和提交记录判断。

