艺术-摩纳哥
Art-monorepo是管理一个JavaScript monorepo的依赖性的工具. 这是一个有意见的工具,有一个核心设计原则:
- Monrepo中的所有软件包都应该使用任何外部依赖的同版本.
因此,鉴于这一原则,只应有一个 package-lock.json 文件和一个 node_modules/ 文件夹 - 整个单列波的根.
与其他单列波工具不同,Art-monorepo对于文件夹结构是灵活的. 它只是扫描一下 package.json 在任何子文件夹中的文件,允许您随意组织软件包。 这使得将相干软件包组合在一起并有选择地根据路径对特定软件包组运行命令变得容易.
艺术莫诺雷波的主要用途是管理 art-monorepo sync-install 命令.
Art-monorepo还拥有用于运行所有包上的命令的手动工具,例如测试,任何npm标记或任何 shell-command.
快速启动指南
添加到已存在的 Repo
可以立即开始在现有的回放中添加子包而无需任何重大重构. 只要确保使用 --preserveRootDependencies 运行时选项 art-monorepo sync,或设置在一次 art-monorepo.config.json 文件(参见 配置文件) (中文(简体) ). 这就是:
安装艺术莫诺雷波 :
npm install art-monorepo --save-dev
在您的软件包中添加脚本。 json:
{
"scripts": {
"monorepo:sync": "npx art-monorepo sync --preserveRootDependencies",
"monorepo:sync:install": "npx art-monorepo sync-install --preserveRootDependencies",
"monorepo:sync:reset:install": "npx art-monorepo sync-reset-install --preserveRootDependencies",
// optional shortcuts to test, build and clean both your core package and all sub-packages
"monorepo:test": "npm run test && npx art-monorepo test", // test all packages
"monorepo:build": "npm run build && npx art-monorepo build", // build all packages
"monorepo:run": "npx art-monorepo run -- ", // npm run XXX on all packages with that script defined
"monorepo:exec": "npx art-monorepo exec -- " // run shell command XXX on all packages
}
}
新鲜的 Mono Repo 快速启动( 建议)
尽管您可以使用 art-monorepo , 其中根包也是一个"代码"包. 我建议,根包 仅应前置管理单一repo。 与其他分包相比,它一般更清洁更灵活,因为它不给一个包(根包)特殊考虑.
安装艺术莫诺雷波 :
npm install art-monorepo --save-dev
在您的软件包中添加脚本。 json:
{
"scripts": {
"sync": "npx art-monorepo sync",
"sync:install": "npx art-monorepo sync-install",
"sync:reset:install": "npx art-monorepo sync-reset-install",
// optional shortcuts to test, build and clean both your core package and all sub-packages
"test": "npx art-monorepo test", // test all packages
"build": "npx art-monorepo build", // build all packages
"monorepo:run": "npx art-monorepo run -- ", // npm run XXX on all packages with that script defined
"monorepo:exec": "npx art-monorepo exec -- " // run shell command XXX on all packages
}
}
运行艺术- Monorepo
您可以在任何地方运行 Art-Monorepo :
npx art-monorepo
如果在全球安装:
npm install -g art-monorepo
你可以运行它只是:
art-monorepo
图标概览
扩展的帮助是通过 --help 所有命令的旗帜。 并非所有可用的选项在此列出,但命令行帮助将始终是最新的和完整的.
每次运行时使用的设置, 例如 --preserveRootDependencies 和要忽略的文件夹列表, 可以在 art-monorepo.config.json 文档。 见 配置文件。 。 。 .
核心命令
art-monorepo sync [--preserveRootDependencies, --quiet]:将根包.json与所有子包同步.art-monorepo sync-install [--preserveRootDependencies, --quiet]: 运行art-monorepo sync然后运行npm install。 。 。 .art-monorepo sync-reset-install [--preserveRootDependencies, --quiet]:完整地,新鲜地重建所安装的单列波中的所有软件包.
工具命令
art-monorepo build [--folder, --sync, --verbose]: 运行npm run build每个子文件夹中都有一个 package.json 文件.art-monorepo test [--folder, --sync, --verbose]: 运行npm test每个子文件夹中都有一个 package.json 文件.art-monorepo run X [--folder, --sync, --verbose]: 运行npm run X所有软件包中.art-monorepo exec X [--folder, --sync, --verbose]: 在每个子文件夹中运行 shell command X,并带有一个 package.json 文件.art-monorepo versions [--verbose]: 显示所有软件包版本(本地版本并发布).art-monorepo check: 检查单列波是否干净( 根部只有一个包锁. json和一个节点 模块文件夹) .art-monorepo clean: 高级: 在所有子文件夹中删除所有 package-lock.json 文件和节点 模块文件夹.
示例使用
同步依赖
艺术-Monorepo的主要用途是同步您单曲的依赖. 简单运行 :
art-monorepo sync-install
或者你可以分两步走
art-monorepo sync
# review how sync updated your package.json files
npm install
这可确保您的软件包在依赖性版本中保持一致 。 也允许您并行开发多个软件包,因为单曲内的任何交叉依赖都会被绑定到本地版本.
如何同步工作
同步保证 :
- 所有子包都使用每个外部依赖的同版本.
- 所有内部的跨包引用都会被更新到最新版本并链接到使用本地包而不是已发布的npm版本.
- Root package.json包括所有子包中使用的所有外部依赖性.
同步分三个步骤进行:
- 干净:去除子包中所有包锁.json文件和节点 模块文件夹. 根应该是唯一一个有锁文件和已安装模块的地方.
- 更新子软件包: 将所有子包依赖性版本相互和根对齐. 版本分辨率 :
- 如果软件包已经在根包.json文件中存在,则使用该版本.
- 如果包存在于多子包中,且版本不同,则报告出错.
- 更新根: 从子包中合并任何新的或更新的依赖性,并确保所有跨包依赖性使用"file:..." npm协议(即所有包都链接到使用本地包而不是被发布的npm版本).
关于保存的依赖性选项
默认情况下,root package.json只作为单一repo管理器处理——而不是活动代码包. 它的依赖性领域被充分再生,以代表所有子包依赖性和devdependents的结合. 它的devdependents field是未受侵犯的(保留给艺术-monorepo等单重工具). 子包中没有使用的任何根依赖将被去除.
如果根也用于编码,则使用 --preserveRootDependencies 选项。 这防止了根的依赖性。 相反,该工具将子包依赖性合并到根上. 您负责手动消除过时的依赖性 .
配置文件
在命令行上重复的设置 art-monorepo.config.json 单列波根中的文件 :
{
"preserveRootDependencies": true,
"ignore": ["packages/legacy", "experiments"]
}
保留依赖性
默认 false设定为 true 跟过去一样 --preserveRootDependencies 改为 sync, (中文(简体) ), sync-install 财务报告和审定财务报表 sync-reset-install,它保持根的依赖性而不使用子包(见 关于保存的依赖性选项) (中文(简体) ). 明确的命令行值仍然胜利,所以 --preserveRootDependencies=false 覆盖一个运行的配置 .
忽略
默认 []。相对于单一repo 根的文件夹路径列表,其软件包 art-monorepo 应当留下。 每个条目名称包含一个文件夹的文件夹 package.json,而不是 package.json 存档。 当 art-monorepo 搜索软件包时, 文件夹和下面所有的东西都会跳过, 因此它适用于每个命令 : sync, (中文(简体) ), test, (中文(简体) ), build, (中文(简体) ), run, (中文(简体) ), exec, (中文(简体) ), versions, (中文(简体) ), check 财务报告和审定财务报表 clean。 。 。 .
被忽略的文件夹就艺术-莫诺雷波而言,位于单列波外. 他们可以保留自己的 node_modules/ 财务报告和审定财务报表 package-lock.json, (中文(简体) ), check 不以他们为污秽 clean 永不删除其中的内容。 它们的依赖性版本与所剩的单列波不相统一,它们的名字也不被添加到根上 package.json。 。 。 .
路径被匹配为已写入, 并带有线索 ./ 和任何线索 / 容忍: "./packages/legacy/" 财务报告和审定财务报表 "packages/legacy" 意思一样 由于条目被作为图案交给文件搜索, glob 语法如 "packages/legacy-*" 也行,但平道是预定用途.
行为
- 当文件缺失时,所有默认都适用.
- 未知密钥产生警告, 否则会被忽略 .
- 无效的 JSON, 或一个错误类型的值, 以错误的方式停止命令 .
- 当文件设置任何东西时,每个命令都会打印一个活动设置的一行摘要.
--quiet压制之.
批量命令
Art-Monorepo为您所有软件包的批量运行命令提供了多个工具. 对于每个这些工具,您可以选择仅在给定子文件夹内的包上运行它们(使用 --folder XYZ) 你可以选择同步运行它们,一次一个(与 --sync) (中文(简体) ). 默认情况下,它们都将平行运行.
默认情况下,不显示成功命令的输出 。 使用 --verbose 以显示所有命令的输出.
对所有子软件包进行测试
art-monorepo test
此命令执行 npm run test 包含一个 package.json 文件的子文件夹中.
在所有子软件包上运行脚本
art-monorepo run script-name
如果一个包没有匹配名的脚本,它就会被跳过.
> art-monorepo run foobar
FOOBARING: 36 packages
SKIPPED: packages/neptune-namespaces-runtime (package.json does not have a 'foobar' script)
SKIPPED: packages/neptune-namespaces (package.json does not have a 'foobar' script)
RESULTS:
succeeded: 0
skipped: 2
运行任意命令
art-monorepo exec "ls -la" [--folder, --sync, --verbose]
执行 monrepo 中所有包中的任何 shell 命令 。 如果你提供 --folder 参数,它只会运行该子路径内对软件包的命令。 您想要传递给您的命令的任何选项, 都应该在引用的命令内 。 例如: "ls -la"。 。 。 .
完全重置并重建
如果您遇到 npm 创建多套件锁的问题 。 json 文件或节点模块文件夹,您可以进行完整的重置 :
art-monorepo sync-reset-install
此命令 :
- 同步: 所有 package.json 文件在单列波
- 重装: 删除全部
./package-lock.json财务报告和审定财务报表./node_modules/,包括根 - 安装: 运行
npm install在树根中 - 检查: 单相机现在已清空( 根中只有一个 package- lock.json 和一个节点- 模块文件夹)
说明1: 此重建根
./package-lock.json,因此一些依赖性可能会被更新. 说明2:这触发了单列波中所有软件包的新安装,所以如果有很多软件包的话可能会很慢.
共同活动
在子包中添加依赖性
cd packages/foo输入子包文件夹npm install xyz您的依赖性 - 这将创建一个临时节点 模块/ and package-lock.json, 但没关系cd ../..回到根头art-monorepo sync-install- 将依赖同步到根包. json
- 删除临时子包的节点 模块/和包锁.json
- 在根节点/ 和包锁中安装新的依赖性. json
添加一个新的子包
- 创建一个新文件夹并依照其他子包的图案创建文件. 最重要的是
name在 package.json 文件中必须是独有的,并且您计划用来导入/要求该软件包在其他地方的名称. - 根内:
art-monorepo sync-install
从 Monorepo 中排除文件夹
有时一个文件夹会持有一个你不希望管理的软件包:一个拥有自己锁文件的销售项目,一个给不相容的版本打针的实验,或者一个包的中程迁移. 把它列在下面 ignore 内 art-monorepo.config.json 在根中:
{
"ignore": ["vendor/legacy-app", "experiments"]
}
从那时起,每个命令都会跳过那些文件夹和下面的一切. 见 配置文件 详细情况.
检查 Monorepo 健康
art-monorepo check
这验证您的单重键遵循了核心原则 - 只有一个 package-lock.json 和 root 中的一个节点 模块文件夹 .
查看软件包版本
art-monorepo versions
这显示了所有软件包的所有本地版本和已出版版本,如果它们不同步,则简要地说明不同的内容. 如果您正在发布许多软件包, 并试图保持所有软件包的同步, 这是一个强大的工具 .
诡计
同步发布所有软件包
有时候我只想用一个快速的方法 来公布我所有的最新和同步的包裹 这个简短的剧本做得相当不错,在多数情况下是有效的.
art-monorepo exec `npm version patch` # version bump everything - just in case
art-monorepo sync # sync all cross-dependencies to use the latest version
art-monorepo exec `npm publish` # publish!
git commit . -m 'patched, synced and published all packages'