# @effected/npm 中文文档

规范地址：https://npmcn.com/package/%40effected/npm/

版本：0\.34\.1
npm 元数据更新时间：2026-11-12T19:03:19.797Z
中文译文更新时间：2026-11-13T08:46:19.589Z
软件包许可：MIT

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

原始 npm 页面：https://www.npmjs.com/package/%40effected/npm
原文对照：https://npmcn.com/package/%40effected/npm/?lang=original
项目主页：https://github.com/spencerbeggs/effected/tree/main/packages/npm#readme
源码仓库：https://github.com/spencerbeggs/effected

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

- 包体积（解压后）：400 kB，31 个文件
- 模块格式：ES Module
- TypeScript 类型：包内自带
- Node.js 要求：\>=24\.11\.0
- 运行依赖：3 个
- peer 依赖：effect ~4\.1\.0，@effected/semver ^0\.24\.0
- 首次发布：2026-07-16T17:31:43.275Z
- 最新版本发布：2026-11-12T19:03:19.397Z
- 近 30 天下载量：10797（2026-10-13 至 2026-11-11，npm 官方下载统计）
- 已发布版本数：55（近 12 个月 55 个）

## 中文简介

用于解决pnpm目录的效应服务合同:和工作空间:依赖性描述符.

## 安装

```sh
npm install @effected/npm
```

也可以使用：`pnpm add @effected/npm`、`yarn add @effected/npm`、`bun add @effected/npm`

## README

# @ 受影响/ npm

[![npm](https://img.shields.io/npm/v/@effected%2Fnpm?label=npm&color=cb3837)](https://www.npmjs.com/package/@effected/npm) [![License: MIT](https://img.shields.io/badge/License-MIT-4caf50.svg)](https://opensource.org/licenses/MIT) [![Node.js %3E%3D24.11.0](https://img.shields.io/badge/Node.js-%3E%3D24.11.0-5fa04e.svg)](https://nodejs.org/) [![TypeScript 7.0](https://img.shields.io/badge/TypeScript-7.0-3178c6.svg)](https://www.typescriptlang.org/)

解决 pnpm 的效果服务合同 `catalog:` 财务报告和审定财务报表 `workspace:` 依赖规格,加上npm注册,并公布上面所建的地表. `CatalogResolver.rangeOf` 将软件包名称加上可选目录名称转换为所配置的范围; `WorkspaceResolver.versionOf` 将工作空间软件包名称转换为具体版本。 两者都是 `Context.Service` 合同,两船都有一个 无法解决任何问题的默认层, 没有人读一个文件。 软件包是接合:需要的库 _扩展_ 一个描述符取决于这一点, 和一些能够实际看到工作空间 提供执行。 在合同之外,还有工具包的共同依赖词汇—— `DependencySpecifier`, (中文(简体) ), `DependencySection`, (中文(简体) ), `IntegrityHash` - 和 `Manifest`一个能解决每一个问题 `catalog:` 财务报告和审定财务报表 `workspace:` 在一次通话中通过合同进行说明. `NpmRegistry` 财务报告和审定财务报表 `PackagePublish` 将软件包与登记册相接,在核心上读取并包装/推出一个发布工具需要的工作流程 `HttpClient` 财务报告和审定财务报表 `@effected/commands`。 。 。 .

> **预`1.0.0`。 。 。 .** 此软件包是 `@effected/*` 在稳定基础上建造的工具包 效应v4(`effect` `~4.1.0`) 并仍在 `0.x` 发展。 稳定效果 制作一个工具箱 `1.0.0` 可能,不是自动的。 为了保持你的 `effect` 财务报告和审定财务报表 `@effect/*` 该工具包在线上构建和测试、安装 [`@effected/pnpm-plugin-effected`](https://www.npmjs.com/package/@effected/pnpm-plugin-effected)。 。 。 .
> 
> **稳定:不稳定.** 此软件包的 API 表面尚未考虑 完成并可能改变 `0.x` 释放 定一个确切的版本——甚至 标记软件包 _稳定_ 在此之前 `1.0.0` 可以引入突破性更改 和精确的针 变成一个类型检查错误 而不是一个 跑步时间惊喜。 完全政策: [释放策略](https://github.com/spencerbeggs/effected#release-strategy)。 。 。 .

## 为什么 @ effect/ npm

`catalog:` 财务报告和审定财务报表 `workspace:` 他们的本意是生活在他们所见所闻之外的地方。 一个 package.json 文档库可以解析 `"effect": "catalog:"` 因为答案是在工作空间文件中 它没有商业阅读。 通常的出逃舱口都不好:对工作空间爬行器的依赖性被拖入纯文档库中,或者接受解析器作为无打字回调,并失去故障通道. 合同也不是 这个包是合同,只有形状,所以 `@effected/package-json` 可表达 `Package.resolve` 服务费用 `R` 并让应用程序决定决议的实际来源.

唯一值得说明的设计决定: **未匹配的描述符是 `Option.none()`,而非错误**。在目录中缺失的软件包,或不是一个工作空间成员的名称,是一个普通的答案,解析器以 `None`。错误频道被保留给分辨率 _机制_ 失败 —— 无法读取的目录文件, 错误的工作空间表 ——和 `DependencyResolutionError` 将这个原因在结构上放在 `Schema.Defect` 字段,而不是将其折叠成字符串。 模糊这两个是"没有这样的包"最终如何与"你的磁盘着了"无法区分.

## 安装

```bash
npm install @effected/npm effect
```

```bash
pnpm add @effected/npm effect
```

需要节点.js~~24.11.0.

全体 `@effected/*` 软件包仅为无害环境管理:只公布出口地图 `import` 条件,所以 `require()` 包括解析 CJS 模式的工具 —— 与节点失败 `ERR_PACKAGE_PATH_NOT_EXPORTED` 而不是装入不存在的 CJS 建筑。 从ES模块导入.

`effect` 页:1 `@effected/semver` 是同伴的依赖关系; `@effected/commands` 以普通的依附者身份抵达 身后 `PackagePublish`。定义解析器合同没有效果,也没有触及文件系统——它们的默认层是 `Layer.succeed` 超过返回的函数 `Option.none()` - 不过.. `NpmRegistry` 需要一个 `HttpClient` 财务报告和审定财务报表 `PackagePublish` 财务报告和审定财务报表 `PackageTarball` 需求 `FileSystem`, (中文(简体) ), `Digest.Digest` (单位:千美元)`effect/crypto`)和a 数据 `ChildProcessSpawner`,每个从边上提供 `@effect/platform-node` 或者说 `@effect/platform-bun` —— 说 `Digest.Digest` 从平台加密家族层, 例如 `NodeCrypto.layerDigest`,或核心的 `Digest.layerWebCrypto`由于平台 `*Services` 层无加密.

## 快开始

这个 `Default` 层合并了两个无操作解析器。 在需要履行合同但不应解决的情况下提供:

```ts
import { CatalogResolver, Default, WorkspaceResolver } from "@effected/npm";
import { Effect, Option } from "effect";

const program = Effect.gen(function* () {
  const catalog = yield* CatalogResolver;
  const workspace = yield* WorkspaceResolver;
  return yield* Effect.all([
    catalog.rangeOf("effect", Option.none()),
    workspace.versionOf("@effected/semver"),
  ]);
});

Effect.runPromise(Effect.provide(program, Default)).then(console.log);
// => [Option.none(), Option.none()]
```

`Option.none()` 联 合 国 `catalog` 参数选择默认目录; `Option.some("build")` 选择名称.

## 合同

| 服务 | 方法 | 回返 |
| --- | --- | --- |
| `CatalogResolver` | `rangeOf(packageName, catalog: Option<string>)` | `Option<string>` - 配置范围,或 `None` 当软件包不在目录中时 |
| `WorkspaceResolver` | `versionOf(packageName)` | `Option<string>` - 混凝土版本,带宽度修改器;或 `None` 当名称不是工作空间成员时 |

都失败了 `DependencyResolutionError`,带有 `specifier` 无法解决的问题和结构 `cause` 潜在的失败; `rangeOf` 可能额外失败 `CatalogAssemblyError` 当目录无法从源头组装时。 两舰a `noop` 层被绑在一孔上,所以它通过引用来记忆,而不是在每次使用时刻刻出一新层.

## 执行解决器

真正的解决者是 `Layer.succeed` 在形状上. `@effected/workspaces` 对照已发现的单雷波执行这些,但合同小到固定记录是合法执行——用于测试、固定或已经知道自己的目录的工具:

```ts
import { CatalogResolver, WorkspaceResolver } from "@effected/npm";
import { Effect, Layer, Option } from "effect";

const catalogs: Record<string, Record<string, string>> = {
  default: { effect: "^4.0.0" },
  build: { typescript: "^6.0.0" },
};

const workspaceVersions: Record<string, string> = { "@acme/widget": "1.4.0" };

export const ResolversLive = Layer.mergeAll(
  Layer.succeed(CatalogResolver, {
    rangeOf: (packageName, catalog) =>
      Effect.succeed(Option.fromUndefinedOr(catalogs[Option.getOrElse(catalog, () => "default")]?.[packageName])),
  }),
  Layer.succeed(WorkspaceResolver, {
    versionOf: (packageName) => Effect.succeed(Option.fromUndefinedOr(workspaceVersions[packageName])),
  }),
);
```

注意执行工作的作用 _没有_ do: 未知的软件包名称返回 `Option.none()` 永远不会失败。 保存错误频道用于您试图读取目录而无法读取的大小写 .

## 宣言一级的决议

`Manifest` 对合同来说,这是一个宽容的表率模式:四个附属领域被打成字符串-字符串记录,所有其他顶级领域通过一个 `rest` 装满那些平板电脑的密码 所以电线形状永远不带文字 `rest` 键。 这是故意的 `@effected/package-json`严格 `Package` ——中建运单是任意的用户记录,解析没有业务验证它从未读到的字段.

```ts
import { Default, Manifest } from "@effected/npm";
import { Effect } from "effect";

const program = Effect.gen(function* () {
  const manifest = yield* Manifest.decode({ name: "app", dependencies: { effect: "^4.0.0" } });
  const resolved = manifest.needsResolution ? yield* manifest.resolve() : manifest;
  return resolved.toRecord();
});

Effect.runPromise(Effect.provide(program, Default)).then(console.log);
// => { dependencies: { effect: "^4.0.0" }, name: "app" }
```

`needsResolution` 是一个纯粹的获取器:在没有依赖字段时,首先检查它,然后完全跳过解析度(以及任何目录组装都支持解析度) `catalog:` 或者说 `workspace:` 明说者. `resolve()` 通过合同对每个此类指定者进行项目,并返回一个新的 `Manifest`,应用 pnpm 的发布时间语义——别名表 `workspace:<name>@<range>` 决定 _目标_ 软件包的版本并成为 `npm:<name>@<range>` 别名 pnpm 出版。 在显式层面,一个显示者回答 `Option.none()` 输入失败 `UnresolvedDependencyError`,命名字段,依赖和原因:一个无比的条目是解析器的普通答案,但它意味着表不能被预测.

## 书记官处阅读和出版

`NpmRegistry` 替换每个外壳 `npm view`,读取核心 `HttpClient` 换句话说 登记册是一个逐个调用的理由,而不是被烤入层中,因此一个程序可以对同一个包的两个登记册进行探测,一个没有的包或版本是 `Option.none()` 而不是错误 :

```ts
import { NpmRegistry } from "@effected/npm";
import { FetchHttpClient } from "effect/http";
import { Effect } from "effect";

const program = Effect.gen(function* () {
  const registry = yield* NpmRegistry;
  return yield* registry.version("effect", "4.0.0");
});

Effect.runPromise(program.pipe(Effect.provide(NpmRegistry.layer), Effect.provide(FetchHttpClient.layer)));
// Option.some(PublishedVersion) when that version is on the registry, Option.none() otherwise
```

A 类 `github-packages` 目标通过组合读取: 登记册用405个任意的证书回答反版端点,所以 `version` 前面的路—— 以及回答405的其他任何登记册都以同样的方式倒回,所以"这个版本是出版的"给每个地方都提供了同样的答案.

`manifest(name, version)` 以同一方式读取一个版本的依赖字段:a `VersionManifest` 携带 `dependencies`, (中文(简体) ), `peerDependencies`, (中文(简体) ), `optionalDependencies`, (中文(简体) ), `peerDependenciesMeta` 财务报告和审定财务报表 `engines`,在文件未宣布时,各缺席。 因此,一个列出版本并读取其同行的解析器要经过一个登记册、一个证书和一个路由规则,而不是两个可以不同意的规则:

```ts
import { NpmRegistry } from "@effected/npm";
import { Effect, Option } from "effect";

const peersOf = (name: string, version: string) =>
  Effect.gen(function* () {
    const registry = yield* NpmRegistry;
    const found = yield* registry.manifest(name, version);
    return Option.map(found, (manifest) => manifest.peerDependencies ?? {});
  });
```

依赖记录不正确 `RegistryReadError` 与善良 `"decode"` 而不是读作“没有同伴” `engines` 将旧的出版工具中遗留的数组形式中的值省去,所以它不能不读取解决精细问题的版本. `VersionManifest` 也是图案: 将一个版本文档编解码为同一检查, 但它拒绝遗留 `engines` 形式.

`NpmConfig.load({ cwd, env })` 解析一个读取的 npm 配置 — 项目、 用户和全局 npmrc + `npm_config_*` - 和 `config.targetFor(name)` 手执 `NpmRegistry` 软件包的注册 和为主机配置的证书 永远不会是另一个的 工程 npmrc 是在 npm 找到它的方式, 在最近的目录中持有一个 `package.json` 或者说 `node_modules`。在程序从成员软件包中运行时错误的单列波中,有两个选项移动它: `workspaceRoot: true` 在最近的目录上读取 `pnpm-workspace.yaml` 或一个 `package.json` 带有 `workspaces` 字段(在无时倒入默认值),以及 `projectDir` 直接命名目录, 获胜 `workspaceRoot`数字 :

```ts
import { NpmConfig, NpmRegistry } from "@effected/npm";
import { Effect } from "effect";

const versionsFromAnywhere = (name: string, cwd: string, env: Record<string, string | undefined>) =>
  Effect.gen(function* () {
    const config = yield* NpmConfig.load({ cwd, env, workspaceRoot: true });
    const registry = yield* NpmRegistry;
    return yield* registry.versions(name, config.targetFor(name));
  });
// needs FileSystem and Path for the load, and HttpClient for the read, at the edge
```

`PackagePublish` 运行剩下的释放通过 `@effected/commands`' `Run`数字 : `pack` 写出焦油球,并报告其 npm 完整性和当地sha256 (证明主题), `publishTarball` 上传早些时候已打包的字节数,以及 `dryRun` 报告可包装性而不与登记册联系. `publishTarball`是因为 `PublishOutcome` 报告 `auth` —— 说 `"oidc-exchange"`, (中文(简体) ), `"configured-credential"` 或者说 `"unknown"` ——从npm自己的日志行读取. npm 仅将其认证路径命名于默认日志级别以下, 因此发布运行于 `--loglevel=silly`,它优先于 `loglevel` 设置在 npmrc 或环境中(只有 `--loglevel` 执行者 `extraArgs` 晚点来取胜,然后报告 `"unknown"`);失败 `PublishError.output` 被过滤回 npm 的默认值. `tokenAuth: true` 空白 `NPM_ID_TOKEN` 和动作符号服务变量,从而 npm 以 npmrc 证书发布,并降低 `--provenance`,在 GitHub Action 上需要该符号服务。 每一步键入失败 `PublishError`,以 `kind`,而不是扔一个非零npm出口. `NpmExecutor.ambient` 运行跑者自己的npm; `NpmExecutor.dlx("npm@11")` 通过项目的发射装置取出一个被钉住的装置,这是国际开发部所相信的,在仍然运送npm 10.x的跑道上需要出版的.

`NpmExecutor` 是您复制的值, 而不是旗下包 : `withCacheDir(dir)` 重定向 npm 的缓存 - 值得做的跑者 `$HOME` 无法写入,或者缓存属于与工作空间相同的音量——和 `withExtraArgs(args)` 是此软件包未命名的旗子的通用喷口。 两者都归还一个新的执行人,以及 `withExtraArgs` 替换而不是累积,所以副本是自己国旗的完整声明. `--cache` 都比两个都高 `npm_config_cache` 和一个npmrc `cache`这样 `withCacheDir` 覆盖一个刻意配置的缓存 —— 梳理器对环境状态保持沉默, 检查一个是呼叫者的呼叫 .

```ts
import { NpmExecutor } from "@effected/npm";

declare const runnerTemp: string;

const executor = NpmExecutor.dlx("npm@11").withCacheDir(`${runnerTemp}/npm-cache`);
// every invocation now carries `--cache <runnerTemp>/npm-cache`, after its own args
```

`classifyRegistry` 告诉 npm, GitHub 软件包, JSR 和一个自定义的注册 `RegistryKind`由于来源和认证因种类不同而不同,有三种预测表明人类有: `registryShortLabel` (单位:千美元)`npm`, (中文(简体) ), `github`, (中文(简体) ), `jsr`,或主机),用于日志行或检查名, `registryDisplayName` (单位:千美元)`npm`, (中文(简体) ), `GitHub Packages`, (中文(简体) ), `JSR`或主讲人),并 `registryHost` 用于任何 URL 的裸主机.

## 登记处如何认证

`RegistryCredential` 是封闭的结合 双方一半的注册表面说话—— `{ kind: "token", token }` 给npm的 `_authToken`,以及 `{ kind: "basic", encoded }` 联合国 `_auth`,已载入基数64-编码,因为这是 npm 存储的内容和野外的注册配置已经包含的内容. `basicCredentialFromPairResult(username, password)` 给真正持有一对的呼叫器编码,返回 a `Result` 失败 `BasicCredentialError` (理由 `"colon-in-username"`而不是扔; 秘诀是 `Redacted` 在它的两边.

```ts
import { PackagePublish, basicCredentialFromPairResult } from "@effected/npm";
import { Effect, Redacted } from "effect";

declare const password: Redacted.Redacted<string>;

const program = Effect.gen(function* () {
  const credential = yield* Effect.fromResult(basicCredentialFromPairResult("ci", password));
  const publish = yield* PackagePublish;
  yield* publish.setupAuth({
    registry: "https://npm.internal.example",
    credential,
    npmrcPath: "/tmp/.npmrc",
  });
});
// appends `//npm.internal.example/:_auth=<encoded>` to the npmrc, creating it when absent
// Failure: BasicCredentialError when the username contains a colon
```

`basicCredentialFromPairResult` 替换投掷 `basicCredentialFromPair`;重命名是迁移信号,因为一个同名的函数,其返回类型已改变,仍然会在打字松散的呼叫站点进行编译.

`setupAuth` 并需要第三个只出版的臂: `WorkloadCredential`, (中文(简体) ), `{ kind: "workload", audience, token }`,对于在登记册特定前缀后面接受CI工作量标识符号的登记册。 纯洁 `workloadCredential({ audience, prefix, identityToken })` 建造一个没有呼叫者 手持正文 `setupAuth` 写在下面 `_authToken`。 。 。 . `setupAuth`'参数类型是: `PublishCredential`三者的结合; `RegistryTarget.credential` 留下来 `RegistryCredential`,所以将工作量证书传递给一个读取失败,而一个读取失败 `RegistryReadError` 与善良 `"credential"` 在任何请求发出之前 蒙住身份标志是打电话者的工作, `ActionsRegistryCredential.workload` 从 `@effected/github-actions` 两者兼有.

一个结合而不是两个拼写是关键: `NpmRegistry`逐个呼叫 `RegistryTarget` 一样 `credential`,因此一个读取的探测器和一个出版物不能对一个登记册的计划产生异议。 对一基本事实登记册的无记名探测器回答401, `version` 读作"没有出版",一个出版流程在它上的行为重塑了已经存在的版本.

**出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出入出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出入出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出入出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出.** `setupAuth` 财务报告和审定财务报表 `RegistryTarget` 吃了个 `token` 字段前; 两者均取 `credential` 现在 重写为机械:

```ts
import type { RegistryCredential } from "@effected/npm";
import type { Redacted } from "effect";

declare const token: Redacted.Redacted<string>;

// before: setupAuth({ registry, token, npmrcPath })
const credential: RegistryCredential = { kind: "token", token };
// after:  setupAuth({ registry, credential, npmrcPath })
```

`RegistryTarget.token` 一个小字键为 `never`故意的 所以休息很响亮 呼叫者通常通过有条件的扩展通过字段(`...(token !== null ? { token } : {})`)),而无更久之地产的传播并不是过度的财产错误——这个地段会完全消失,经过认证的探测器会默默地变成一个匿名的. 类型 `never`,同一扩展无法编译.

## 读取已公布的焦油球

`PackageTarball` 登记表表面的入地一半: `NpmRegistry` 读取元数据 `PackagePublish` 发了个焦油弹,但没读过一本. `extract` 下载一个版本,对照登记册所保证的完整性验证字节,解开它,并回答目录 `package/` 根落地——作为 **范围** 资源,所以当调用范围关闭时,临时目录会被删除 :

```ts
import { NpmRegistry, PackageTarball } from "@effected/npm";
import { Effect, Option } from "effect";

const read = Effect.gen(function* () {
  const registry = yield* NpmRegistry;
  const tarball = yield* PackageTarball;
  const found = yield* registry.version("some-config", "1.2.3");
  if (Option.isNone(found)) return Option.none();
  return Option.some(yield* tarball.extract(found.value));
}).pipe(Effect.scoped);
// Option.some("<a temporary directory>") — removed when the scope closes
```

核查在提取之前和任何读取内容之前进行,因此,一个被毒害的中间人——CDN边缘、代理、镜子——从未到达过 `tar`。 。 。 . `TarballError` 携带一个 `reason` 将结果分开: `notFound` (没有记录的柏油球,或404分), `http` (任何其他运输或非-2xx故障), `integrityMismatch` (与 `expected` 财务报告和审定财务报表 `actual`和 `extractFailed`编辑 `notFound` 拆分是负载的——无法从"某事出错去取一个确实存在的版本"中分辨出"这个版本合法不存在"的消费者必须同时对待,而失败是沉默.

取出炮弹 `tar` 通过核心 `ChildProcessSpawner` 而不是接受柏球阅读器依赖,这是一个分级决定:这里的非核心运行时间依赖将使这个包 _综合_,并传播到 纯软件包 依赖它的词汇. `tar` 每个CI跑者图像上都有 跑者的消费者既需要产卵者也需要二进制 说对了 `resolveEntryPoint` 从 `@effected/package-json` 在已提取目录中查找条目文件——装入该文件故意不属于此表面,因为动态 `import()` 的组合上下文模块.

## 诚信的散开

`IntegrityHash` 是三种文字完整性之上的品牌 依附图 —— npm的SRI `sha512-<base64>`核心包装 `sha512.<hex>` 和纱线,与 `algorithmOf` 从其中任何一个读取算法. `CorepackIntegrityHash` 将品牌缩小为核心包装拼写,这就是 `packageManager` 针必须写入, 并携带桥 从窗体npm 实际给你:

```ts
import { CorepackIntegrityHash } from "@effected/npm";
import { Effect } from "effect";

declare const npmIntegrity: string; // "sha512-<base64>", as the registry reports it

Effect.runPromise(CorepackIntegrityHash.fromSri(npmIntegrity)).then(console.log);
// "sha512.<the same digest, lowercase hex>" — the spelling a packageManager pin takes
// Failure: InvalidSriIntegrityHashError, carrying the offending `input`
```

`FromSri` 与 a 转换相同 `Schema.Codec`用来在自己的计划内解码一个完整场; `fromSri` 这是 `Effect` 方便过. 桥是故意的 **单向**:一个已经存在于核心包形态的输入会键入失败而不是通过,所以一个给回接针输入转换器的呼叫者会发现接线错误而不是遮住它. 基础64的读取器是严格的,原因相同——安装时宽放一分薄荷针芯包拒绝. 平分是它唯一的纬度: 文摘的加法和未加法的拼写解码为同一接针, 而一个流浪字符,一个内部 `=`,或非零后导位全部失败.

## 谁吃这个

`@effected/package-json` 是软件包存在的原因. `Package.resolve` 将所有四个依赖性地图行走,每张扩展 `catalog:` 财务报告和审定财务报表 `workspace:` 通过这两个服务进行分辨,使任何解析者回答的分辨者不受影响 `None` 为. `@effected/lockfiles` 第二,这就是为什么 描述词和完整性词汇 住在这里,而不是在包 -json. `@effected/workspaces` 坐在接合处的另一边,提供读取一个真正的pnpm工作空间——它的 `Workspaces.resolveManifest` 运行 `Manifest.resolve()` 为你找一个新发现的工作空间 本包中没有任何东西指向它们中任何一个.

## 特征

-   `CatalogResolver` - 那个 `catalog:` 合同,加 `CatalogResolver.noop`。 。 。 .
-   `WorkspaceResolver` - 那个 `workspace:` 合同,加 `WorkspaceResolver.noop`。 。 。 .
-   `DependencyResolutionError` 编号 : `CatalogAssemblyError` ——打出故障:解析机制破裂,或目录无法从源头组装.
-   `Default` —— 说 `Layer.mergeAll` 当这些类型需要满足而不需要解决时.
-   `Manifest` 宽容的表率模式: `Manifest.decode`纯洁的 `needsResolution` 快速路径, `resolve()` 合同和合同 `toRecord()` 回到电线形状 `ManifestDecodeError` 财务报告和审定财务报表 `UnresolvedDependencyError` 作为它输入的失败.
-   `DependencySpecifier` ——分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分入分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出分出`catalogNameOf`, (中文(简体) ), `resolveWorkspace`, (中文(简体) ), `workspaceTargetOf`)执行pnpm的出版时间预测.
-   `DependencySection` 全包依赖词汇: `DependencyKind`, (中文(简体) ), `DependencyField` 以及他们之间的图象.
-   `IntegrityHash` 3个文字完整性表格(SRI、核心包装、纱线)之上的品牌 `algorithmOf`。 。 。 .
-   `CorepackIntegrityHash` 核心包装形式缩小 `packageManager` 针需要,加上单向SRI桥: `FromSri` 编解码器 `fromSri` 影响它,和 `InvalidSriIntegrityHashError` 包含不会转换的输入.
-   `ReleaseAgeGate` 编号 : `PartialReleaseAgeGate` - 门铃 `minimumReleaseAge` 编号 : `minimumReleaseAgeExclude` 门作为纯词汇 : `combine` 合并来自多个配置来源的捐款,严格年龄收益 `filterVersions` 编号 : `isExcluded` 放弃比截取时钟更年轻的候选版本, 因此一个解析者从不选择pnpm版本会拒绝. `matchesExclude` 是pnpm的平顶 --`*` 选手,故意不要 `@effected/glob`'"方言语. `PartialReleaseAgeGate` 每个来源提供的允许入境表格.
-   `NpmRegistry` - 登记处已读 `HttpClient`数字 : `version`, (中文(简体) ), `manifest`, (中文(简体) ), `versions`, (中文(简体) ), `distTags` 财务报告和审定财务报表 `publishTimes`,每个被调用 `RegistryTarget` 登记簿和可选 `credential`,与 `version` 财务报告和审定财务报表 `manifest` 通过组合读取 GitHub 包目标; `layerTest` 和全面工作 `layerSeeded` 是测试的双倍.
-   `VersionManifest` - 一个版本的 `dependencies`, (中文(简体) ), `peerDependencies`, (中文(简体) ), `optionalDependencies`, (中文(简体) ), `peerDependenciesMeta` 财务报告和审定财务报表 `engines`,作为 `NpmRegistry.manifest` 答案; 类也是版本文档的解码器 .
-   `NpmConfig` - npmrc 和 (npmrc 和 (npmrc 和 ) ) `npm_config_*` 关于登记册的决议如下: `load` (与 `projectDir` 财务报告和审定财务报表 `workspaceRoot` 来选择工程 npmrc, 纯度 `fromSourcesResult`,以及 `registryFor` 编号 : `credentialFor` 编号 : `targetFor`,它只和它所配置的宿主配对证书; `NpmConfigError` 是其输入的失败.
-   `PackagePublish` - 工作流程结束 `@effected/commands`数字 : `setupAuth` (取得 `PublishCredential`, (中文(简体) ), `pack`, (中文(简体) ), `publishTarball` (报告) `PublishOutcome.auth`和 `dryRun`,与 `PackedTarball` 携带 npm 完整性和本地 sha256 文摘,以及 a `recording()` 双倍的日记 `setupAuth` 打电话.
-   `PackageTarball` 获取、核查和取出已公布的柏油球作为范围资源 `TarballError` 路由为 `reason: notFound | http | integrityMismatch | extractFailed`。 。 。 .
-   `RegistryCredential` - 封闭的认证工会 `setupAuth` 财务报告和审定财务报表 `RegistryTarget` 采取(`token` 给npm的 `_authToken`, (中文(简体) ), `basic` 联合国 `_auth`),加 (中文(简体) ) `basicCredentialFromPairResult` 持有用户名和密码的呼叫者; `WorkloadCredential` 财务报告和审定财务报表 `workloadCredential` 仅限出版工作量,以及 `PublishCredential` 工会代表 `setupAuth` 拿着.
-   `NpmExecutor` —— 说 `ambient` 或者说 `dlx(spec)`发射装置选择一个被钉住的 OIDC 能力npm 需要的跑道 运送一个更老的,加复制 `withCacheDir(dir)` 财务报告和审定财务报表 `withExtraArgs(args)`。 。 。 .
-   `PublishError` ——出版-工作流程故障,由 `kind: auth | pack | publish | output | digest | executor`。 。 。 .
-   `RegistryKind` 编号 : `classifyRegistry` 登记 URL 分类为 `npm`, (中文(简体) ), `github-packages`, (中文(简体) ), `jsr` 或者说 `custom`,因为来源和认证因种类而异 `registryShortLabel`, (中文(简体) ), `registryDisplayName` 财务报告和审定财务报表 `registryHost` 为日志行、道词或空宿主制作一个.

当一个消费者证明它需要更多,而不是以前,表面就会长出.

## 许可证

[麻省理工学院](https://npmcn.com/package/%40effected/npm/LICENSE)

## 常见问题

### @effected/npm 是什么？

用于解决pnpm目录的效应服务合同:和工作空间:依赖性描述符\.

### 如何安装 @effected/npm？

在项目目录运行 npm install @effected/npm，或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖：effect（~4\.1\.0）、@effected/semver（^0\.24\.0）。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖，Yarn 需要手动安装。

### @effected/npm 支持 TypeScript 吗？

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

### @effected/npm 支持 ESM 还是 CommonJS？

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

### @effected/npm 需要什么版本的 Node\.js？

package\.json 的 engines 字段要求 Node\.js \>=24\.11\.0。版本不符时 npm 默认只给出警告，开启 engine-strict 后会拒绝安装。

### @effected/npm 可以商用吗？

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

### @effected/npm 的下载量有多少？

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

### @effected/npm 还在维护吗？

最新版本 0\.34\.1 发布于 2026/11/13（今天）；至今共发布 55 个版本，其中过去 12 个月发布了 55 个；首次发布于 2026/07/17。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

