十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Aspire CLI 的 npm 安装包使用指南:从全局安装到 TypeScript AppHost 实战

Aspire CLI 的 npm 安装包使用指南:从全局安装到 TypeScript AppHost 实战 Aspire CLI 的 npm 安装包使用指南从全局安装到 TypeScript AppHost 实战【免费下载链接】aspireAspire is the tool for code-first, extensible, observable dev and deploy.项目地址: https://gitcode.com/GitHub_Trending/as/aspire本篇技术指南围绕 Aspire CLI 的 npm 分发包展开。Aspire 是面向分布式应用的 code-first 应用模型其 CLI 以npm install -g方式发布通过一个小巧的 JavaScript launcher 调用平台原生二进制让你在终端中完成 Aspire AppHost 的创建、运行、发布与部署。读完本文你将掌握 npm 包的安装与升级方法、launcher 的平台选择与缓存机制、常用命令的完整用法以及基于 TypeScript AppHostapphost.mts从零搭建带支撑服务的分布式应用的实战方案。Aspire CLI 的 npm 分发架构pointer 包 RID 包与直接发布单一二进制不同Aspire CLI 采用 npm 生态中成熟的指针包pointer package 平台特定包RID package双包结构。顶层包名为microsoft/aspire-cli它只包含少量 JavaScript 文件真正的原生 CLI 二进制则由各个平台专属的 optional dependencies 携带microsoft/aspire-cli # 顶层指针包launcher ├── package.json ├── README.md ├── bin/aspire.js # JavaScript launcher └── bin/aspire-package-map.json # RID - 包名映射表RIDRuntime Identifier包按操作系统、CPU 架构与 Linux libc 组合命名共七个RID 包名平台CPUlibcmicrosoft/aspire-cli-win-x64Windowsx64—microsoft/aspire-cli-win-arm64Windowsarm64—microsoft/aspire-cli-linux-x64Linuxx64glibcmicrosoft/aspire-cli-linux-arm64Linuxarm64glibcmicrosoft/aspire-cli-linux-musl-x64Linuxx64muslmicrosoft/aspire-cli-osx-x64macOSx64—microsoft/aspire-cli-osx-arm64macOSarm64—每个 RID 包内是bin/aspireWindows 上为bin/aspire.exe原生可执行文件。这种顶层命令 平台负载的设计在 npm 生态中已有成熟先例Aspire 的完整设计权衡可参见 npm CLI 包设计规格。顶层包的package.json通过os、cpu、libc元数据让 npm 只安装匹配当前平台的 RID 包具体映射关系在打包脚本 pack-cli-npm-package.ps1 中定义。安装 Aspire CLI平台要求与三步验证npm 安装包要求Node.js 20 或更高版本launcher 使用了 Node 16.9 的Erroroptions-bag 语法而libc选择器依赖 npm 10.7该版本随 Node 20.10 一同发布Node 18 已于 2025-04-30 停止维护因此 Node 20 是受支持的最低 LTS。支持的平台包括Windows x64/Arm64、macOS x64/Arm64、带 glibc 的 Linux x64/Arm64以及带 musl 的 Linux x64即 Alpine 环境。npm install -g microsoft/aspire-cli安装完成后立即验证aspire --version aspire --help安装过程中有一个容易踩的坑顶层包通过 npm optional dependencies 安装各平台的原生包切勿禁用 optional dependencies不要使用--omitoptional、--no-optional或设置npm_config_optionalfalse否则 launcher 找不到原生 CLI 二进制安装即失败。这一点在 launcher 源码 中也有对应的诊断提示。launcher 工作原理RID 检测、musl 识别与安全缓存npm install -g安装的aspire命令实际执行的是 bin/aspire.js launcher它的启动流程如下读取 RID 映射表加载bin/aspire-package-map.json将当前 RID 映射到具体 npm 包名包名在打包时生成launcher 不硬编码。检测当前 RID基于process.platform、process.arch判定 Windows/macOS/Linux 分支Linux 下还需额外区分 glibc 与 musl见 detectRid。解析原生包用require.resolve(rid-package/package.json)定位已安装的 RID 包并校验 RID 包版本与顶层包版本一致防止部分安装或版本错配resolveNativeBinary。复制到 Aspire 自有缓存将原生二进制复制到~/.aspire/npm/version/rid/bin/Windows 为%USERPROFILE%\.aspire\npm\version\rid\bin\aspire.exe。转发信号并启动子进程以继承 stdio 的方式 spawn 缓存二进制透传全部命令行参数。关于 Linux libc 检测有一个值得注意的细节glibc 与 musl 混装环境下二进制与动态链接器不匹配会在 exec 时崩溃报错如missing ld-linux-aarch64.so.1或GLIBC_X.Y not found。因此 launcher 采用三层探测策略isMusl优先使用 Node 的 runtime reportglibcVersionRuntime字段存在即排除 musl其次以ldd --version输出为权威依据最后才回退到检查/lib、/usr/lib下是否存在ld-musl-*.so文件。任何探测失败都会落到友好的 Unsupported platform 错误而不是静默加载错误二进制。为什么必须复制到缓存目录因为 Aspire CLI 首次运行时会在进程路径相对位置自解压内嵌 bundle。若直接从node_modules执行解压目标可能落在 pnpm store、Yarn unplugged 目录、npm 全局缓存等只读的包管理器路径中。复制到 Aspire 自有的可写缓存布局目录以 0700 权限创建即可规避这一问题。缓存新鲜度采用文件大小 mtime双重校验不一致时通过临时文件原子重命名更新缓存避免并发首次运行时读到残缺二进制ensureCachedBinary。launcher 还会设置三个环境变量透传给 CLI使 CLI 感知自己运行自 npm 安装ASPIRE_NPM_PACKAGEmicrosoft/aspire-cli ASPIRE_NPM_PACKAGE_VERSIONversion ASPIRE_NPM_PACKAGE_RIDridCLI 端的 NpmInstallDetection 检测到这些变量后会把aspire update --self与更新提示路由到npm install -g microsoft/aspire-clilatest而不是用 GitHub 二进制下载器去覆盖 npm 拥有的文件。若需要调试或测试缓存根目录可通过环境变量ASPIRE_NPM_CACHE_DIR覆盖。快速开始从空目录到运行中的 AppHost安装完成后有三种入门路径全新应用运行aspire new从模板创建 Aspire 应用。现有仓库运行aspire init为仓库添加 AppHost然后运行aspire run。仅需仪表板运行aspire dashboard run启动独立仪表板。对于已有一个或多个应用项目的现有仓库aspire init aspire runaspire run会启动 AppHost 并自动打开 Aspire 仪表板其中汇集了日志、链路追踪、指标、资源与健康检查信息。常用命令一览命令作用aspire new从模板创建新的 Aspire 应用aspire init为现有仓库添加 AppHostaspire add integration安装集成例如 PostgreSQL、Redisaspire run启动 AppHost 并打开仪表板aspire publish根据 AppHost 模型准备部署产物aspire deploy将 AppHost 部署到支持的部署目标aspire dashboard run仅启动仪表板供已导出 OpenTelemetry 的应用接入aspire --help/aspire command --help查看当前命令选项独立仪表板单命令接入 OpenTelemetryAspire 仪表板可以独立于 AppHost 运行任何导出了 OpenTelemetry 数据的应用都可以接入无需 AppHost 参与。启动方式只需一条命令aspire dashboard run启动后你的应用通过OTEL_EXPORTER_OTLP_ENDPOINT环境变量指向仪表板暴露的 OTLP 端点即可上报数据。更细粒度的控制可通过aspire dashboard run --help查看常用选项包括--frontend-url、--otlp-grpc-url与--allow-anonymous。一个简单的 TypeScript AppHost 应用定义Aspire 是 code-first 模型应用结构用 TypeScript AppHostapphost.mts以代码描述项目、容器、数据库、缓存以及它们之间的连接关系全部声明在代码中。下面的例子运行一个 Express API 和一个 Vite 前端将 API 通过 HTTP 对外暴露并把前端与 API 连接起来import { createBuilder } from ./.aspire/modules/aspire.mjs; const builder await createBuilder(); // Run the Express API and expose its HTTP endpoint externally. const app await builder .addNodeApp(app, ./api, src/index.ts) .withHttpEndpoint({ env: PORT }) .withExternalHttpEndpoints(); // Run the Vite frontend after the API and inject the API URL for local proxying. const frontend await builder .addViteApp(frontend, ./frontend) .withReference(app) .waitFor(app); // Bundle the frontend build output into the API container for publish/deploy. await app.publishWithContainerFiles(frontend, ./static); await builder.build().run();每个 builder 调用都返回 promise因此在另一个资源引用某资源之前必须用await先拿到该资源对象。aspire run会构建并启动全部资源然后打开仪表板。添加支撑服务数据库与缓存数据库、缓存等资源用同样的方式添加并通过withReference建立连接waitFor让依赖方等待资源就绪后再启动import { createBuilder } from ./.aspire/modules/aspire.mjs; const builder await createBuilder(); const postgres await builder.addPostgres(postgres); const db await postgres.addDatabase(db); const cache await builder.addRedis(cache); await builder .addNodeApp(api, ./api, src/index.ts) .withHttpEndpoint({ env: PORT }) .withExternalHttpEndpoints() .withReference(db) .withReference(cache) .waitFor(db) .waitFor(cache); await builder.build().run();注意addPostgres与addRedis只有在先用aspire add postgresql和aspire add redis安装对应集成后才可用。更新与卸载更新到最新的 npm 发布版本npm install -g microsoft/aspire-clilatest如果是从 npm 安装的 CLI 执行aspire update --selfCLI 会引导你回到上面的 npm 更新命令而不会尝试用二进制下载器覆盖 npm 管理的文件。卸载同样通过 npm 完成npm uninstall -g microsoft/aspire-cli故障排查optional dependencies 被禁用导致安装失败如果安装失败或 launcher 提示原生包未安装请检查是否使用了--omitoptional、--no-optional或npm_config_optionalfalse环境变量然后重新执行npm install -g microsoft/aspire-cli顶层包的postinstall脚本node bin/aspire.js --npm-postinstall-check会在支持平台上立即校验原生 RID 包是否存在从而把缺原生二进制的问题提前到安装阶段暴露而不是拖到首次执行aspire时才报错。不过若使用--ignore-scripts跳过生命周期脚本运行时 launcher 仍会保留同样的缺失原生包诊断。PATH 中找不到aspire确认 shell 能访问 npm 的全局可执行目录npm prefix -g可以显示全局前缀macOS 与 Linux 上aspireshim 通常位于该前缀的bin目录下Windows 上通常位于用户配置文件下的 npm 目录中。平台与架构不受支持当前 npm 包仅提供 Windows x64/Arm64、macOS x64/Arm64、带 glibc 的 Linux x64/Arm64、带 musl 的 Linux x64 原生二进制。其他平台不受该包支持。RID 包与顶层包的平台元数据在打包脚本中一一对应且 launcher 的 RID 检测与打包脚本的 RID 列表由单元测试交叉验证见 AspireJsLauncherTests防止两端失配。安装损坏或版本错配如果 launcher 报告包损坏、原生包版本与顶层包版本不匹配或缺失原生二进制请重装npm uninstall -g microsoft/aspire-cli npm install -g microsoft/aspire-clilauncher 在每次启动时都会校验 RID 包版本与指针包版本一致并在复制到缓存前用lstat而非stat拒绝将符号链接视为有效缓存条目避免缓存被低权限攻击替换为指向外部内容的链接needsCopy。此外launcher 会把 SIGINT、SIGTERM、SIGHUPPOSIX 下还有 SIGQUITWindows 下为 SIGBREAK转发给原生子进程确保程序化kill wrapper不会让长期运行的aspire run会话遗留孤儿进程。构建、验证与发布npm 包如何从仓库走向 npmjs理解使用层面的机制后可以进一步了解这个 npm 包是如何从本仓库产出并保证质量的打包构建流程从已签名的原生 CLI 归档中提取aspire或aspire.exe二进制由 pack-cli-npm-package.ps1 生成指针包与 RID 包各自的临时目录与package.json再调用npm pack产出.tgz。你正在阅读的这份 README 正是指针包 README 的模板其中的__PACKAGE_NAME__与__VERSION__占位符在打包时被替换为实际包名与版本。RID 包 README各平台专属包的 README 来自 pack-cli-npm-package.rid.README.md同样在打包时填充占位符。验证verify-cli-npm-package.ps1 会逐个核对 RID 包中的二进制与签名归档二进制逐字节一致并校验指针包的bin声明、postinstall脚本、版本戳记的 README、aspire-package-map.json及 optionalDependencies 版本对齐。端到端安装测试CI 会在 Windows、Linux 与 macOS 上执行真实的npm install -g冒烟测试断言aspire --version输出与构建版本一致并确认运行时缓存落在预期的~/.aspire/npm/version/rid/bin布局下最终汇总为validation-summary.json发布流水线以此作为放行门槛。测试保障仓库内还包含针对 launcher 的单元测试AspireJsLauncherTests覆盖 RID 包版本错配、损坏的 package.json、chmod/复制失败时的临时文件清理、缓存复制与环境变量转发、以及 RID 检测与打包脚本的一致性等场景保证 launcher 在各种异常与并发条件下行为可靠。对发布细节、RID 检测的完整设计决策与安全权衡感兴趣的读者可进一步阅读 npm CLI 包设计规格 与 launcher 源码。【免费下载链接】aspireAspire is the tool for code-first, extensible, observable dev and deploy.项目地址: https://gitcode.com/GitHub_Trending/as/aspire创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表