@ 受影响/ 运行时间
解析从活版放出feed中解析出相容的节点.js,Bun和Deno等版本,并用捆绑的离线快照作为回放. 问 >=20 输入 active-lts 和每场比赛, 最新的第一, 加上LTS选取 和任何你提名的默认。 节点的生命周期阶段来自真实的 nodejs/Release 时刻表,并对照时钟进行评估,所以 current, (中文(简体) ), active-lts, (中文(简体) ), maintenance-lts 财务报告和审定财务报表 end-of-life 意思是说今天 而不是当套装出版的时候.
预
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可以引入突破性更改 和精确的针 变成一个类型检查错误 而不是一个 跑步时间惊喜。 完全政策: 释放策略。 。 。 .
为什么 @ 受影响/ 运行时间
每一个回答都包含一个诚实 source。解析器可以获取实时数据,但无声无息的失败,提供快照和报告 source: "api" 比从未有过快照的更糟糕的是,你无法从僵硬的答案中分辨出新的答案,而一个CI工作在它的工具链上接上一个季度将愉快地安装一个当前版本。 这里的字段由实际包含指数的任意策略设置: "api" 当时,有食物, "cache" 当快照发生时,包括当自动策略倒回它时,倒下记录在路上的警告.
新鲜度政策是一层,不是一面旗帜,层层也懒:建设一号表演不做IO,第一个 resolve 获取饲料, 每一个后来的解决方案 共享人口。 类型如下: layerOffline 不需要任何东西, 因为快照读取不需要传输 。 下 layerFresh, (中文(简体) ), resolve 失败 FreshnessError因为你选择说一个快照不是可以接受的替代物——并且因为抓取是在决心的时候发生的,那么失败就会到达你能够捕捉,重试或倒回的地方,而不是被地层构造所掩埋.
依赖树中也没有 HTTP 客户端 。 V3图书馆载有Octokit和 @octokit/auth-app 以获得两笔资金 HttpClient 从 effect/http 让你提供运输工具. @effected/semver 是唯一的运行时间依赖,而且是第一当事方.
安装
npm install @effected/runtimes effect
pnpm add @effected/runtimes effect
需要节点.js~~24.11.0.
全体 @effected/* 软件包仅为无害环境管理:只公布出口地图 import 条件,所以 require() 包括解析 CJS 模式的工具 —— 与节点失败 ERR_PACKAGE_PATH_NOT_EXPORTED 而不是装入不存在的 CJS 建筑。 从ES模块导入.
effect v4是唯一的对等依赖. @effected/semver 是一种正常的依附关系,它自动出现;没有其它东西到达你的树上.
现场解析需要 HttpClient边上提供 FetchHttpClient.layer 从 effect/http 那层没有自己的要求,所以在任何地方都行 fetch 已经 如果你只使用过 layerOffline您不需要HTTP客户端.
命令行接口船作为单独的包,所以这个包的消费者从来不安装 @effect/platform-node。 。 。 .
快开始
import { NodeResolver } from "@effected/runtimes";
import { Effect } from "effect";
import { FetchHttpClient } from "effect/http";
const program = Effect.gen(function* () {
const node = yield* NodeResolver;
return yield* node.resolve({ range: ">=20", phases: ["active-lts"] });
});
Effect.runPromise(program.pipe(Effect.provide(NodeResolver.layer), Effect.provide(FetchHttpClient.layer))).then(
console.log,
);
// ResolvedVersions {
// source: "api", // "cache" if the feed was unreachable and the snapshot answered
// versions: [...], // every active-LTS Node matching >=20, newest first
// latest: "...", // the newest of them
// lts: "..." // the newest LTS pick
// }
节点不需要任何证书:既输入它读取的- nodejs.org的发布索引,又输入 nodejs/Release 附表——未经校正.
作为图层的缓存策略
三个解决者都暴露了同一个三层 常数数字 :
| 层 | 行为 | resolve 失败 | 要求数 |
|---|---|---|---|
layer | 获取实时; 失败时返回捆绑的快照, 登录警告并报告 source: "cache" | 永远 | 解析器的运输 |
layerFresh | 实时数据或无数据 | FreshnessError | 解析器的运输 |
layerOffline | 只有捆绑的快照 没有IO. | 永远 | 无 |
每层都是 懒惰:建筑它不执行IO,所以合并所有三个解析器都没有任何代价,直到你真正解决一个。 第一个 resolve 获取饲料,后来并同时解决一个人口在该地层一生中所占的份额——包括自动战略的快照倒计时,这算作一个成功的人口,而不复出. 仅a 失败 人口没有被回忆:a layerFresh 解决失败 FreshnessError 留下下个决心来重试。 懒惰的时机也是为什么 FreshnessError 坐着 resolve'错误通道而不是图层'——建筑 layerFresh 不能失败;通过它可以解决.
这并非意外:
| 解析器 | 种子 | 要求数 |
|---|---|---|
NodeResolver | nodejs.org的发布索引和 nodejs/Release 附表——均为未经认证的 | HttpClient |
BunResolver | GitHub 释放 oven-sh/bun | GitHubClient |
DenoResolver | GitHub 释放 denoland/deno | GitHubClient |
GitHubClient.layerDefault 是包含电池的接线: 环境检测证书结束 fetch证书优先是: GITHUB_PERSONAL_ACCESS_TOKEN,则 GITHUB_TOKEN,然后是匿名的——GitHub允许匿名请求在更低的速率限制下. 自己供应 GitHubAuth.token(redactedToken),或使用 GitHubClient.layer 直接带来证书和运输:
import { BunResolver, DenoResolver, GitHubClient, NodeResolver } from "@effected/runtimes";
import { Layer } from "effect";
import { FetchHttpClient } from "effect/http";
export const ResolversLive = Layer.mergeAll(
NodeResolver.layer.pipe(Layer.provide(FetchHttpClient.layer)),
BunResolver.layer.pipe(Layer.provide(GitHubClient.layerDefault)),
DenoResolver.layer.pipe(Layer.provide(GitHubClient.layerDefault)),
);
GitHubAuth.token 返回每个呼叫的一新层,所以将它绑在一个康斯特上,而不是将它连上两次——层被引用来记起。 GitHub App认证(JWT 签名加安装-托肯交换)被故意不执行,因为它意味着运行时间依赖: GitHubAuth 是一个可插件服务, 以及需要 App auth 供应自己的应用程序 Layer<GitHubAuth>。 。 。 .
解决
resolve 取一个 semver 范围、 组合颗粒性和可选默认范围。 此外,节点还采用生命周期阶段来接受这些阶段,并在以下日期进行评估:
import { NodeResolver } from "@effected/runtimes";
import { Effect } from "effect";
const program = Effect.gen(function* () {
const node = yield* NodeResolver;
return yield* node.resolve({
range: ">=18",
phases: ["active-lts", "maintenance-lts"],
increments: "minor",
defaultVersion: "^22",
});
}).pipe(Effect.provide(NodeResolver.layerOffline));
// ResolvedVersions with one entry per minor line, and `default` set to the newest match for ^22.
increments 组合匹配 : latest 保留每个主线的最新版本, minor 每个小行的最新补丁, patch 每一个匹配的发布. range 默认为 *, (中文(简体) ), increments 改为 latest和节点的 phases 改为 ["current", "active-lts"]阶段评价日期来自 Clock 通过 DateTime.now这样 TestClock # 驾车而去 # date 把它钉上.
节点时刻表通过发布键入 线条而不是通过少校.. nodejs/Release 发表 v0.8, (中文(简体) ), v0.10 财务报告和审定财务报表 v0.12 作为三条不同的线, 并把它们都解为主要 0 把他们撞倒在先的哪个地方.
错误
| 标记 | 手段 | 恢复 |
|---|---|---|
InvalidRangeError | 分解范围不整齐. 升为 @effected/semver 从那里进口的. | 在一定范围内的打字是打字,而不是找到. 以一相报. |
NoMatchingVersionError | 范围很好,没有匹配。 卡莉丝 runtime, (中文(简体) ), constraint 编辑 phases 搜索. | 扩大范围,或接受更多的阶段. |
UnresolvableDefaultError | 明确 defaultVersion 被问及,没有匹配。 卡莉丝 runtime 财务报告和审定财务报表 defaultVersion。 。 。 . | 与上述不同,因为Node的默认否则会回到LTS选取中去——默默地放下它会像要求的那样将LTS交给你. |
FreshnessError | A 类 resolve 下级 layerFresh 无法到达种子 。 卡莉丝 runtime 结构 cause。 。 。 . | 重试解析度( 失败的获取没有被记住) , 或返回到 layer 并接受一个快照. |
RateLimitError | GitHub的利率极限已经用尽. 卡莉丝 limit, (中文(简体) ), remaining 和,当吉特赫布说, retryAfter 在几秒钟. | 认证或退后 retryAfterA级 403 从反应头被分类, 从来没有猜测 从身体. |
AuthenticationError | GitHub拒绝了证书. 卡莉丝 method —— 说 "token" 或者说 "anonymous"。 。 。 . | 检查标志,或提供1. |
NetworkError | 请求失败, 或返回一个既非认证又非利率限制的状态 。 卡莉丝 url,则 status 和结构 cause。 。 。 . | 允许 403 降落在这里,没有再考. |
ResponseParseError | 一个种子响应了,但不能用这个软件包所期望的形状. 卡莉丝 source 结构 cause。 。 。 . | 一个操作员的信号 上游的饲料改变了。 错误的数据键入失败, 绝不是缺陷 . |
特征
NodeResolver, (中文(简体) ),BunResolver, (中文(简体) ),DenoResolver——每跑出一次服务,每跑出一次服务layer, (中文(简体) ),layerFresh财务报告和审定财务报表layerOffline。 。 。 .ResolvedVersions—— 说source, (中文(简体) ),versions, (中文(简体) ),latest,可选择lts财务报告和审定财务报表default。空匹配是一个错误,而不是空结果,所以latest总是在场.NodeSchedule编号 :NodePhase编号 :NodeScheduleEntry- 那个nodejs/Release使用寿命周期表,按放行键入isLtsPhase财务报告和审定财务报表nodeReleaseLine帮手.GitHubClient编号 :GitHubAuth最小的 GitHub REST 客户端结束HttpClient,带有匿名,显式和被环境检测的认证层. 绑定了边框, 并提供了服务器retry-after还没睡就封了.BunRelease, (中文(简体) ),DenoRelease, (中文(简体) ),NodeRelease——解码放出模式,外加GitHubTag财务报告和审定财务报表GitHubRelease用于制造REST载荷.- 一直标出错误,每个错误都带有其原因的结构.