@ 受影响/ env
工具前端的效应环境检测 : 谁是运行它 (人工智能特工,CI工作,或无), 终端能做什么 (颜色级,OSC 8超链接和宽度,每流),并 输出对象 (人类,代理人或CI). 每个答案都读过一次 Config,从未从 process,每个服务有一个 layerTest因此,一个测试设置了它想要的环境而不触及一个全球.
预
1.0.0。 。 。 . 此软件包是@effected/*在稳定基础上建造的工具包 效应v4(effect~4.1.0) 并仍在0.x发展。 稳定效果 制作一个工具箱1.0.0可能,不是自动的。 为了保持你的effect财务报告和审定财务报表@effect/*该工具包在线上构建和测试、安装@effected/pnpm-plugin-effected。 。 。 .稳定:不稳定. 此软件包的 API 表面尚未考虑 完成并可能改变
0.x释放 准确的版本。 满 政策: 释放策略。 。 。 .
为什么 @ effect/env
每个打印工具最终都会问这些问题,通常是通过阅读 process.env 财务报告和审定财务报表 process.stdout.isTTY 只要有答案就够了 答案随即漂移(帮助文本和报告对颜色有分歧),它们不能在没有变异全局的情况下被测试,规则是微妙的: FORCE_COLOR 击出 NO_COLOR,一个空的 NO_COLOR 表示未设定, TERM=dumb 是无法移动光标的终端, Windows 控制台设置为否 TERM 在CI内部运行的特工 应该得到代理输出.
这个软件包作为服务,从既定来源的规则中做出每个决定一次: 从节点自己的颜色深度 getColorDepth (与 OS=Windows_NT 站入它的站台检查,它像从Windows 10 Build 1491 起的节点一样给出了Windows终端真彩色,从std-osc8的终端表格提供超链接支持,从std-env的表格进行代理检测.
安装
npm install @effected/env effect
pnpm add @effected/env effect
需要节点.js~~24.11.0. effect v4是唯一的对等器. 没有运行时间依赖关系, 没有平台导入和没有 @effected/* 边缘,所以它运行 在节点,邦和德诺.
全体 @effected/* 软件包仅为无害环境管理:只公布出口地图 import 条件,所以 require() 节点失败 ERR_PACKAGE_PATH_NOT_EXPORTED从ES模块导入.
快开始
做为服务,让任何印有字迹的观众决定一次:
import { Audience, CurrentRuntimeEnv } from "@effected/env";
import { Effect, Layer } from "effect";
// A valid MYTOOL_AUDIENCE beats detection; then an agent, then CI, then a human.
const AudienceLive = Audience.layer({ envVar: "MYTOOL_AUDIENCE" }).pipe(Layer.provide(CurrentRuntimeEnv.layer));
const program = Effect.gen(function* () {
const audience = yield* Audience;
if (audience.kind === "agent") {
// plain text, no escapes
}
});
Effect.runPromise(program.pipe(Effect.provide(AudienceLive)));
终端能做的是 TerminalEnv,读取核心的 Stdio 财务报告和审定财务报表 Terminal 从您的平台层 :
import { TerminalEnv } from "@effected/env";
import * as NodeServices from "@effect/platform-node/NodeServices";
import { Effect } from "effect";
const describe = Effect.gen(function* () {
const terminal = yield* TerminalEnv;
return `${terminal.stdout.color} colour, ${terminal.width()} columns`;
});
Effect.runPromise(describe.pipe(Effect.provide(TerminalEnv.layer()), Effect.provide(NodeServices.layer)));
在测试中,将答案修正为:
import { Audience, TerminalEnv } from "@effected/env";
import { Layer, Option } from "effect";
const Environment = Layer.mergeAll(
Audience.layerTest("agent"),
TerminalEnv.layerTest({ stdout: { isTerminal: true, color: "256", columns: Option.some(120) } }),
);
出口的东西
RuntimeEnv:对代理,CI和终端程序的图案级快照,可与平庸的JSON一样持久.RuntimeEnv.fromRecord(env)建立一个纯粹的功能.CurrentRuntimeEnv:那张快照是一种服务.layer读取环境ConfigProvider一次;layerFrom(source)为长生不老的宿主阅读你自己的记录或提供者,每用一次都是新鲜的;layerTest(overrides)修复它.TerminalEnv: 每条流isTerminal,颜色级别(none, (中文(简体) ),basic, (中文(简体) ),256, (中文(简体) ),truecolor, (中文(简体) ),hyperlinks财务报告和审定财务报表columns附加时width(fallback)。 。 。 .layer()需求Stdio财务报告和审定财务报表Terminal· ;layerStdio()仅需要Stdio· ;colorLevel("stdout")单独决定颜色.Audience数字 :human, (中文(简体) ),agent或者说ci,则source这决定了.layer({ envVar })决定:CurrentRuntimeEnv和您所命名的覆盖变量 .EnvOverride: 读取模式的变量 在内部 一个观众,只接受你列出的每个观众的文字.readResult不记录的报告;read记录一个已拒绝值的警告.
文档
指南和API的全文参考文献 执行. spencerbeg.gs/env。 。 。 . @effected/cli-kit 在这些服务上建立整个展示层.