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

资讯详情

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

Storybook 指定包管理器安装指南:`--package-manager` 参数详解

Storybook 指定包管理器安装指南:`--package-manager` 参数详解 Storybook 指定包管理器安装指南--package-manager参数详解Storybook 的官方 CLI 会自动检测当前项目使用的包管理器并据此初始化依赖但在 monorepo、CI、多包管理器混用等场景下你可能需要强制指定某一种包管理器来完成安装。本指南以 docs/_snippets/create-command-custom-package-manager.md 为主线结合仓库源码讲解--package-manager参数的用法、可选值范围与底层实现原理帮助你稳定复现可预期的安装行为。一、文档背景这段片段在官方文档中的位置create-command-custom-package-manager.md是 Storybook 官方文档站中可复用的代码片段Code Snippet被引用在 docs/get-started/install.mdx 的 Troubleshooting 一节Run Storybook with other package managers中The Storybook CLI includes support for the industrys popular package managers (e.g., Yarn, npm, and pnpm) automatically detecting the one you are using when you initialize Storybook. However, if you want to use a specific package manager as the default, add the--package-managerflag to the installation command.也就是说默认行为是自动检测需要指定时才显式传--package-manager。该片段中的完整命令如下npm create storybooklatest --package-managernpmpnpm create storybooklatest --package-managernpmyarn create storybook --package-managernpm说明上面三段是同一份按访问者包管理器切换显示的代码片段。文档为了演示以 npm 作为目标管理器三个示例统一传了--package-managernpm。在实际使用中这个值应替换为你真正想用来安装依赖的包管理器见下文可选值范围。二、理解三行命令的启动方式差异npm create storybook、pnpm create storybook与yarn create storybook三者只是把create-storybook引导包下载并执行的方式不同真正做初始化的是同一个 CLI对应仓库中的 code/lib/create-storybook 包npm create storybooklatest等价于npm init storybooklatest由 npm 临时下载并执行create-storybookpnpm create storybooklatest由 pnpm 完成同样的引导常用于 pnpm 项目yarn create storybook是 Yarn 1 时代的写法Yarn Berry 同样兼容文档片段中未附带版本 tag如需固定版本可参考 docs/_snippets/create-command-custom-version.md 的版本写法。注意二者语义的区别npm/pnpm/yarn create决定用哪个包管理器把 create-storybook 拉下来跑而--package-manager决定create-storybook 在初始化时用哪个包管理器去安装 Storybook 及其依赖、写入 package.json 脚本。前者管引导后者管落地这是整个参数体系里最容易被混淆的一点。对应地不带该参数的默认安装命令见 docs/_snippets/create-command.md。三、--package-manager的源码实现与可选值3.1 CLI 参数定义在 create-storybook 的入口 code/lib/create-storybook/src/bin/run.ts#L40-L43 中该参数由 Commander 声明.addOption( new Option(--package-manager type, Force package manager for installing deps).choices( Object.values(PackageManagerName) ) )其中两处关键信息作用描述Force package manager for installing deps强制指定用于安装依赖的包管理器取值被限定choices只能是PackageManagerName枚举中的值。3.2 可选值的真实范围PackageManagerName枚举定义在 code/core/src/common/js-package-manager/JsPackageManager.ts#L24-L30export enum PackageManagerName { NPM npm, YARN1 yarn1, YARN2 yarn2, PNPM pnpm, BUN bun, }因此源码层面--package-manager实际接受npm、yarn1、yarn2、pnpm、bun五个值其中 Yarn 被细分为 Classicv1与 Berryv2两个实现各自走不同的代理逻辑。官方文档表格docs/api/cli-options.mdx#L134中简写为 npm、yarn、pnpm是为了便于阅读的概括。值得留意的是即使你的项目里装了 Yarn Berryv2手动显式传--package-manageryarn1也是被允许但通常不建议的——两个版本的 hoisting 行为差异很大。源码中还专门处理了空目录 Yarn 1的组合见下节。3.3 参数如何参与安装流程--package-manager的真正消费点在预检命令 code/lib/create-storybook/src/commands/PreflightCheckCommand.ts#L41-L72let packageManagerType JsPackageManagerFactory.getPackageManagerType(); // ...空目录场景下的 yarn1 回退逻辑... const packageManager JsPackageManagerFactory.getPackageManager({ force: options.packageManager, });逻辑分三步先自动探测JsPackageManagerFactory.getPackageManagerType()会按当前目录存在的锁文件yarn.lock、pnpm-lock.yaml、package-lock.json、bun.lockb等推断默认类型Yarn 1 与 Yarn 2 通过解析版本区分显式值优先若传入了--package-manager则以force字段覆盖自动探测结果构造代理对象getPackageManager({ force })返回对应的JsPackageManager子类代理NPMProxy / Yarn1Proxy / Yarn2Proxy / PNPMProxy / BUNProxy后续所有依赖安装、脚本注入、版本查询都经由该代理执行。这与是否安装依赖、写入哪些脚本无关只影响用什么工具去执行这些操作。这段逻辑有完备的测试支撑例如 code/core/src/common/js-package-manager/JsPackageManagerFactory.test.ts 中对npm、pnpm、yarn1、yarn2、bun分别传入force进行构造验证。四、一个需要避开的坑空目录中的 Yarn 1 会回退在空目录或仅含极少量文件中初始化时CLI 会先走脚手架新建项目分支。PreflightCheckCommand在此处有一段保护逻辑code/lib/create-storybook/src/commands/PreflightCheckCommand.ts#L49-L57在空目录中使用 yarn1 初始化极大概率会因各种不再修复的 hoisting 问题而失败因此会回退到 npm。无论 yarn1 是被自动探测到的还是你显式用--package-manageryarn1指定的只要目标是空目录CLI 都会打印警告Empty directory with yarn1 is unsupported. Falling back to npm.并把类型改写为npm。如果你在空目录/纯脚手架场景确实想用 Yarn建议使用yarn2Berry官方同时建议优先考虑 pnpm、npm 这类 hoisting 行为更可预测的管理器。五、实际操作三种常见使用形态5.1 强制使用你偏好的管理器推荐形态以显式指定 pnpm 为例把pnpm替换成npm、yarn1、yarn2、bun即可# npm 环境 npm create storybooklatest --package-managerpnpm # pnpm 环境 pnpm create storybooklatest --package-managerpnpm # Yarn 环境 yarn create storybook --package-managerpnpm提示引导方式npm/pnpm/yarn create与目标管理器--package-manager的值不要求一致。例如用yarn create引导、再强制--package-managernpm也是合法组合——这正是文档片段演示的形式。5.2 与版本指定组合可同时使用自定义版本详见 docs/_snippets/create-command-custom-version.mdnpm create storybook8.3 --package-managerpnpm pnpm create storybook8.3 --package-managerpnpm注意pnpm create storybook8.3这类带版本写法要求 Storybook 8.3 及以上更早版本需改用init命令族。5.3 与项目类型--type组合当自动探测框架失败或你使用自定义结构时可配合--type显式指定框架docs/_snippets/create-command-manual-framework.mdnpm create storybooklatest --type solid --package-managerpnpm yarn create storybook --type solid --package-managerpnpm官方允许的--type取值见 docs/get-started/install.mdx 中的表格覆盖angular、react、vue3、nextjs、svelte、solid、react_native等主流框架。六、不止 create整个 CLI 家族都支持该参数--package-manager并不是 create-storybook 独有。在 docs/api/cli-options.mdx 中该参数在以下命令中均有相同语义用于保证跨命令的一致体验命令作用create storybook/storybook init初始化并安装 Storybook 依赖storybook add安装 addon 时指定管理器storybook remove移除 addon 时指定管理器storybook upgrade升级 Storybook 时指定管理器storybook automigrate自动迁移时指定管理器storybook doctor健康检查时指定管理器storybook ai setupAI 代理初始化时指定管理器例如npx storybooklatest add storybook/addon-a11y --package-manager pnpm npx storybooklatest upgrade --package-manager pnpm统一使用同一个管理器贯穿安装→装插件→升级全流程可以避免混用 npm/pnpm 导致的 lockfile 漂移与 node_modules 不一致。七、总结Storybook CLI 默认自动探测包管理器多数情况下无需干预需要可预期、可复现的安装行为时用--package-manager type强制指定合法值为源码层面的npm、yarn1、yarn2、pnpm、bun该参数在 code/lib/create-storybook/src/bin/run.ts 中声明、在 PreflightCheckCommand 中通过force覆盖自动探测结果语义为指定安装依赖所用的包管理器唯一例外空目录 yarn1会被强制回退到 npm想深究各管理器代理的实现差异可阅读 code/core/src/common/js-package-manager 目录及其工厂测试 JsPackageManagerFactory.test.ts。创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表