@effected/npm

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

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

中文使用文档
文档目录13 节
  1. 为什么 @ effect/ npm
  2. 安装
  3. 快开始
  4. 合同
  5. 执行解决器
  6. 宣言一级的决议
  7. 书记官处阅读和出版
  8. 登记处如何认证
  9. 读取已公布的焦油球
  10. 诚信的散开
  11. 谁吃这个
  12. 特征
  13. 许可证

@ 受影响/ npm

npm License: MIT Node.js %3E%3D24.11.0 TypeScript 7.0

解决 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。 。 。 .

稳定:不稳定. 此软件包的 API 表面尚未考虑 完成并可能改变 0.x 释放 定一个确切的版本——甚至 标记软件包 稳定 在此之前 1.0.0 可以引入突破性更改 和精确的针 变成一个类型检查错误 而不是一个 跑步时间惊喜。 完全政策: 释放策略。 。 。 .

为什么 @ effect/ npm

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

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

安装

npm install @effected/npm effect
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 层合并了两个无操作解析器。 在需要履行合同但不应解决的情况下提供:

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") 选择名称.

合同

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

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

执行解决器

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

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 ——中建运单是任意的用户记录,解析没有业务验证它从未读到的字段.

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() 而不是错误 :

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,在文件未宣布时,各缺席。 因此,一个列出版本并读取其同行的解析器要经过一个登记册、一个证书和一个路由规则,而不是两个可以不同意的规则:

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数字 :

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 覆盖一个刻意配置的缓存 —— 梳理器对环境状态保持沉默, 检查一个是呼叫者的呼叫 .

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 在它的两边.

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 现在 重写为机械:

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/ 根落地——作为 范围 资源,所以当调用范围关闭时,临时目录会被删除 :

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 实际给你:

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 为日志行、道词或空宿主制作一个.

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

许可证

麻省理工学院

版本与发布记录

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

版本发布日期距今
0.34.1latest2026/11/13今天
0.34.02026/11/112 天前
0.33.02026/11/102 天前
0.32.12026/11/103 天前
0.32.02026/11/094 天前
0.31.02026/11/094 天前

其他发布通道:next → 0.17.0-next-20260927071821。

关于 @effected/npm 的常见问题

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