chore: 签出 to 检出

This commit is contained in:
Cheng Liu 2024-08-28 16:35:31 -07:00
parent 9d3d49a2ea
commit 784c443ab7
No known key found for this signature in database
GPG key ID: EEC8452F7DB85CD6
11 changed files with 49 additions and 49 deletions

View file

@ -28,10 +28,10 @@ Sparo 优化了 Git 操作在大型前端 monorepo 中的性能。
- **熟悉的界面:** `sparo` 命令行工具 (CLI) 提供了 **更好的默认设置****性能建议**,而无需更改熟悉的 `git` 语法。(本地 `git` CLI 也受支持。)
- **经过验证的解决方案:** Git 提供了[许多优化大型仓库的基础能力](https://tiktok.github.io/sparo/pages/reference/git_optimization/); Sparo 基于这些能力提供上层的解决方案。
- **简化的稀疏签出:** 使用稀疏签出[配置文件](https://tiktok.github.io/sparo/pages/guide/sparo_profiles/) 来定义文件签出范围,而不是复杂的 "cones" 和 globs。
- **前端集成:** Sparo 利用了 [Rush](https://rushjs.io/) 和 [PNPM](https://pnpm.io/) 的工作区配置,甚至可以自动出项目依赖项。
- **双重工作流程:** `sparo-ci` 工具实现了一个专门为持续集成 (CI) 流水线优化的出模型。
- **额外的安全措施:** 避免常见的 Git 错误,例如在活动视图之外的暂存文件出。
- **简化的稀疏检出:** 使用稀疏检出[配置文件](https://tiktok.github.io/sparo/pages/guide/sparo_profiles/) 来定义文件检出范围,而不是复杂的 "cones" 和 globs。
- **前端集成:** Sparo 利用了 [Rush](https://rushjs.io/) 和 [PNPM](https://pnpm.io/) 的工作区配置,甚至可以自动出项目依赖项。
- **双重工作流程:** `sparo-ci` 工具实现了一个专门为持续集成 (CI) 流水线优化的出模型。
- **额外的安全措施:** 避免常见的 Git 错误,例如在活动视图之外的暂存文件出。
- **超越 Git hooks:** 可选地收集您的 monorepo 中的匿名化 Git 计时数据使您的构建团队能够为_本地_开发者体验不仅仅是 CI设定数据驱动的目标。
_(这些指标会传输到您自己的服务,其他任何方都无法访问。)_
@ -45,7 +45,7 @@ Sparo 优化了 Git 操作在大型前端 monorepo 中的性能。
1. _**升级到最新的 Git 版本!**_ 对于 macOS我们推荐使用 [brew install git](https://git-scm.com/download/mac)。对于其他操作系统,请参阅 [Git 文档](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git) 了解安装说明。
2. 在此演示中,我们将使用 Azure SDK这是 GitHub 上一个大型的公共 [RushJS](https://rushjs.io/) monorepo。以下命令将签出[骨架文件夹](./pages/reference/skeleton_folders.md),但不会签出源代码:
2. 在此演示中,我们将使用 Azure SDK这是 GitHub 上一个大型的公共 [RushJS](https://rushjs.io/) monorepo。以下命令将检出[骨架文件夹](./pages/reference/skeleton_folders.md),但不会检出源代码:
```shell
# 从 NPM 全局安装 Sparo CLI
@ -59,7 +59,7 @@ Sparo 优化了 Git 操作在大型前端 monorepo 中的性能。
> 💡 目前支持 PNPM 和 Yarn 工作区的功能计划中,但尚未实现。欢迎贡献!
3. 定义一个 [Sparo 配置文件](./pages/configs/profile_json.md),描述 Git 稀疏出的仓库文件夹子集。
3. 定义一个 [Sparo 配置文件](./pages/configs/profile_json.md),描述 Git 稀疏出的仓库文件夹子集。
```shell
# 将模板写入 common/sparo-profiles/my-team.json
@ -73,14 +73,14 @@ Sparo 优化了 Git 操作在大型前端 monorepo 中的性能。
{
"selections": [
{
// 此演示配置文件将出 "@azure/arm-commerce" 项目及其所有依赖项:
// 此演示配置文件将出 "@azure/arm-commerce" 项目及其所有依赖项:
"selector": "--to",
"argument": "@azure/arm-commerce"
}
]
}
```
`--to` [项目选择器](https://rushjs.io/pages/developer/selecting_subsets/#--to) 指示 Sparo 出工作区中构建 `my-rush-project` 所需的所有依赖项。
`--to` [项目选择器](https://rushjs.io/pages/developer/selecting_subsets/#--to) 指示 Sparo 出工作区中构建 `my-rush-project` 所需的所有依赖项。
@ -95,7 +95,7 @@ Sparo 优化了 Git 操作在大型前端 monorepo 中的性能。
```shell
rush install
# 构建应该成功,因为 Sparo 确保依赖项目被包含在稀疏出中:
# 构建应该成功,因为 Sparo 确保依赖项目被包含在稀疏出中:
rush build --to @azure/arm-commerce
```

View file

@ -2,7 +2,7 @@
title: 概述
---
虽然日常开发涉及多种复杂的 Git 操作,例如在分支之间切换、从服务器获取增量更改以及浏览历史记录。但是相比之下,当持续集成 (CI) 流水线出一个 Git 分支时通常是一个更简单的操作。CI 执行任务过程中所用到的文件夹或整个虚拟机可能在作业完成后立即被丢弃。因此,这两种用例需要不同的 Git 优化方法。
虽然日常开发涉及多种复杂的 Git 操作,例如在分支之间切换、从服务器获取增量更改以及浏览历史记录。但是相比之下,当持续集成 (CI) 流水线出一个 Git 分支时通常是一个更简单的操作。CI 执行任务过程中所用到的文件夹或整个虚拟机可能在作业完成后立即被丢弃。因此,这两种用例需要不同的 Git 优化方法。
Sparo 提供了一个单独的命令行工具 `sparo-ci`,专门针对 CI 流水线进行了优化。当前实现采用以下方法:
@ -10,7 +10,7 @@ Sparo 提供了一个单独的命令行工具 `sparo-ci`,专门针对 CI 流
_Shallow clone 是一种常见的替代方案但在支持需要与基准分支进行比较的增量构建或发布操作时会遇到困难。_
- 配置了稀疏出,并包含了[骨架文件夹](../reference/skeleton_folders.md)。
- 配置了稀疏出,并包含了[骨架文件夹](../reference/skeleton_folders.md)。
目前,`sparo-ci` 支持两个子命令用于 CI

View file

@ -5,7 +5,7 @@ title: sparo-ci checkout
```
sparo-ci checkout
用于 CI 场景的出命令。它目前只接受项目选择器,例如 --to 和 --from。
用于 CI 场景的出命令。它目前只接受项目选择器,例如 --to 和 --from。
选项:
--help 显示帮助 [boolean]

View file

@ -8,7 +8,7 @@ Sparo 有四种类型的子命令:
1. **mirrored子命令**,例如 `sparo branch``sparo revert`,直接调用相应的 `git` 子命令。使用mirrored子命令的目的是让 Sparo 能够提供有关可能导致性能问题的参数的建议。此外,您还可以选择在 Sparo 中配置埋点数据收集,帮助您衡量在您的代码库中的使用体验。(收集的数据会发送到您自己的服务,其他任何人无法访问。)
2. **增强子命令**,其基本设计与对应的 `git` 子命令相同,但针对稀疏出配置文件和更高效的默认设置进行了调整。共有四个增强命令:
2. **增强子命令**,其基本设计与对应的 `git` 子命令相同,但针对稀疏出配置文件和更高效的默认设置进行了调整。共有四个增强命令:
- `sparo checkout`
- `sparo clone`
- `sparo fetch`

View file

@ -17,17 +17,17 @@ git checkout 还将更新 HEAD将指定分支设置为当前分支。
-b 创建一个新分支,并在 <start-point> 处启动 [boolean]
-B 创建一个新分支,并在 <start-point> 处启动;如果已存在,
将其重置到 <start-point> [boolean]
--profile 根据指定的配置文件出项目。这些配置文件将被记录,
--profile 根据指定的配置文件出项目。这些配置文件将被记录,
并被其他 sparo 命令重用。例如,在运行 "sparo checkout <branch>"
后,会基于重用的配置文件进行稀疏出 [array] [default: []]
--add-profile 使用记录的配置文件和指定的附加配置文件出项目。
后,会基于重用的配置文件进行稀疏出 [array] [default: []]
--add-profile 使用记录的配置文件和指定的附加配置文件出项目。
将指定的附加配置文件添加到 sparo 记录的配置文件中 [array] [default: []]
--no-profile 出项目时不使用任何配置文件,并清除所有记录的配置文件 [boolean]
--to 出项目直到(并包括)项目 <to..>,可以与选项 --profile/--add-profile
--no-profile 出项目时不使用任何配置文件,并清除所有记录的配置文件 [boolean]
--to 出项目直到(并包括)项目 <to..>,可以与选项 --profile/--add-profile
一起使用,以形成两个选项的并集选择。此处的项目选择器将
永远不会取代配置文件已出的内容 [array] [default: []]
--from 出项目从(包括其自身及其所有依赖项)项目 <from..> 下游开始,
永远不会取代配置文件已出的内容 [array] [default: []]
--from 出项目从(包括其自身及其所有依赖项)项目 <from..> 下游开始,
可以与选项 --profile/--add-profile 一起使用,
以形成两个选项的并集选择。此处的项目选择器将
永远不会取代配置文件已出的内容 [array] [default: []]
永远不会取代配置文件已出的内容 [array] [default: []]
```

View file

@ -14,7 +14,7 @@ title: <profile-name>.json
"$schema": "https://tiktok.github.io/sparo/schemas/sparo-profile.schema.json",
/**
* 一个 Rush 项目选择器列表,指示要包含在稀疏出中的项目文件夹。
* 一个 Rush 项目选择器列表,指示要包含在稀疏出中的项目文件夹。
* 选择器将组合以构成项目的并集。详情请参阅 Rush 选择器文档:
* https://rushjs.io/pages/developer/selecting_subsets/
*/
@ -40,7 +40,7 @@ title: <profile-name>.json
],
/**
* 要包含在出中的任意其他文件夹列表,
* 要包含在出中的任意其他文件夹列表,
* 不一定对应于任何工作区项目。
* 路径应使用正斜杠,不带前导斜杠,并且应指向 monorepo 的根文件夹。
* 出于性能原因,不支持通配符和 glob 模式。
@ -50,7 +50,7 @@ title: <profile-name>.json
],
/**
* 要从出中排除的文件夹列表。此字段优先于
* 要从出中排除的文件夹列表。此字段优先于
* "includeFolders" 和 "selections" 字段,确保指定的路径绝对不会被包含。
* 路径应使用正斜杠,不带前导斜杠,并且应指向 monorepo 的根文件夹。
* 出于性能原因,不支持通配符和 glob 模式。

View file

@ -34,9 +34,9 @@ cd my-monorepo
- 启用了 Git 无 Blob 的[部分克隆](../reference/git_optimization.md)以延迟下载文件内容。
- 使用 Git [稀疏出](https://git-scm.com/docs/git-sparse-checkout) 仅克隆["骨架"文件夹](../reference/skeleton_folders.md),其中包括所有工作区的 **package.json** 文件,但不包括源代码子文件夹。
- 使用 Git [稀疏出](https://git-scm.com/docs/git-sparse-checkout) 仅克隆["骨架"文件夹](../reference/skeleton_folders.md),其中包括所有工作区的 **package.json** 文件,但不包括源代码子文件夹。
- 稀疏出已配置为更高效的["锥形模式"](https://git-scm.com/docs/git-sparse-checkout#_internalsnon_cone_problems)。
- 稀疏出已配置为更高效的["锥形模式"](https://git-scm.com/docs/git-sparse-checkout#_internalsnon_cone_problems)。
**提示:** 如果想查看执行的操作和 Git 操作,使用 `sparo --debug clone` 代替 `sparo clone`
@ -44,7 +44,7 @@ cd my-monorepo
## 第 3 步:创建稀疏配置文件
定义一个 [Sparo 配置文件](../configs/profile_json.md),描述 Git 稀疏出的仓库文件夹子集。
定义一个 [Sparo 配置文件](../configs/profile_json.md),描述 Git 稀疏出的仓库文件夹子集。
```shell
# 将模板写入 common/sparo-profiles/my-team.json
@ -66,7 +66,7 @@ sparo init-profile --profile my-team
```
👉 _如果您正在演示 **azure-sdk-for-js**,请将 `my-rush-project` 替换为 `@azure/arm-commerce`。_
在上面的例子中,`--to` [项目选择器](https://rushjs.io/pages/developer/selecting_subsets/#--to) 指示 Sparo 出工作区中构建 `my-rush-project` 所需的所有依赖项。
在上面的例子中,`--to` [项目选择器](https://rushjs.io/pages/developer/selecting_subsets/#--to) 指示 Sparo 出工作区中构建 `my-rush-project` 所需的所有依赖项。
```shell
# 将您的配置文件提交到 Git。此步骤在快速演示中已跳过。
@ -76,11 +76,11 @@ sparo add .
sparo commit -m "Created a new Sparo profile"
```
## 第 4 步:出您的 Sparo 配置文件
## 第 4 步:出您的 Sparo 配置文件
`--profile` 参数可以与 `sparo checkout` 一起使用(未来也可以与 `sparo clone``sparo pull` 一起使用)。此参数指定要选择的 JSON 文件的名称。您还可以组合多个配置文件(`sparo checkout --profile p1 --profile p2`),在这种情况下,将使用它们选择的集合的并集。组合配置文件是一个高级场景,但在例如您的拉取请求将影响属于多个团队的项目集时非常有用。
**基于 common/sparo-profiles/my-team.json 的稀疏出**
**基于 common/sparo-profiles/my-team.json 的稀疏出**
```shell
sparo checkout --profile my-team
```
@ -89,7 +89,7 @@ sparo checkout --profile my-team
- Sparo 根据您的配置文件选择自动生成 Git 的 `$GIT_DIR/info/sparse-checkout` [配置文件](https://git-scm.com/docs/git-sparse-checkout#_internalssparse_checkout)。为避免冲突,请不要直接编辑此文件或使用其他工具(如 `git sparse-checkout`)重写它。(这样做不会破坏任何东西,但可能会干扰 Sparo 的操作。)
- 要仅出骨架(返回到第 1 步尚未选择任何配置文件的初始状态),请指定 `--no-profile` 代替 `--profile NAME`
- 要仅出骨架(返回到第 1 步尚未选择任何配置文件的初始状态),请指定 `--no-profile` 代替 `--profile NAME`
- 要添加更多配置文件,并与现有选择组合,请使用 `--add-profile NAME` 代替 `--profile NAME`。例如,以下两个命令与 `sparo checkout --profile p1 --profile p2` 产生相同的结果:
```shell

View file

@ -4,7 +4,7 @@ title: Sparo 配置文件
## 背景
Git 的稀疏出功能通常依赖于存储在 `.git/info/sparse-checkout` 配置文件中的一组 glob 模式。Git 维护者发现常规的 glob 语法效率太低,因此他们引入了一种["锥形模式"](https://git-scm.com/docs/git-sparse-checkout#_internalsnon_cone_problems)的 glob 解释,这种模式忽略文件匹配模式,只匹配目录。
Git 的稀疏出功能通常依赖于存储在 `.git/info/sparse-checkout` 配置文件中的一组 glob 模式。Git 维护者发现常规的 glob 语法效率太低,因此他们引入了一种["锥形模式"](https://git-scm.com/docs/git-sparse-checkout#_internalsnon_cone_problems)的 glob 解释,这种模式忽略文件匹配模式,只匹配目录。
语法类似于以下内容:
@ -21,7 +21,7 @@ Git 的稀疏签出功能通常依赖于存储在 `.git/info/sparse-checkout`
为了简化管理Git 还提供了 `git sparse-checkout` 命令,用于简化从该文件中添加/删除模式的语法。然而,在一个包含数百个项目的大型 monorepo 中,管理这些 globs 仍然会令人困惑且容易出错。
## Sparo 改进了稀疏
## Sparo 改进了稀疏
Sparo 通过从称为 **配置文件** 的配置文件自动生成 `.git/info/sparse-checkout` 配置,使生活变得更简单。这带来了许多好处:
@ -29,9 +29,9 @@ Sparo 通过从称为 **配置文件** 的配置文件自动生成 `.git/info/sp
- 配置文件存储在配置文件中并提交到 Git。这使得与团队成员共享它们变得容易。
- 在分支切换时,配置文件会自动更新,确保确定性结果。例如,在出一个非常旧的分支时,您希望获得旧的配置文件定义,而不是今天的版本。
- 在分支切换时,配置文件会自动更新,确保确定性结果。例如,在出一个非常旧的分支时,您希望获得旧的配置文件定义,而不是今天的版本。
- 您可以将多个配置文件组合在一起(`sparo checkout --profile team1 --profile team2`),选择它们项目的并集。这在修改一个被多个其他团队的项目使用的库项目时非常有用。当然,您可以使用 `--from the-library` 出这些项目,但其他团队可能已经在他们的配置文件中包括了其他相关项目。
- 您可以将多个配置文件组合在一起(`sparo checkout --profile team1 --profile team2`),选择它们项目的并集。这在修改一个被多个其他团队的项目使用的库项目时非常有用。当然,您可以使用 `--from the-library` 出这些项目,但其他团队可能已经在他们的配置文件中包括了其他相关项目。
- Sparo 通过施加 `git sparse-checkout` 之外的额外限制来避免常见错误。这可以避免诸如尝试切换到缺少包含本地修改文件的项目文件夹的配置文件等错误。用户最好先暂存或提交此类修改。
@ -49,7 +49,7 @@ Sparo 通过从称为 **配置文件** 的配置文件自动生成 `.git/info/sp
"$schema": "https://tiktok.github.io/sparo/schemas/sparo-profile.schema.json",
/**
* 一个 Rush 项目选择器列表,指示要包含在稀疏出中的项目文件夹。
* 一个 Rush 项目选择器列表,指示要包含在稀疏出中的项目文件夹。
* 选择器将组合以构成项目的并集。详情请参阅 Rush 选择器文档:
* https://rushjs.io/pages/developer/selecting_subsets/
*/
@ -71,8 +71,8 @@ Sparo 通过从称为 **配置文件** 的配置文件自动生成 `.git/info/sp
组合配置文件的简单方法是多次指定 `--profile`。例如:
```sh
# 出 team-a.json、team-b.json、team-c.json 配置文件的并集
# 注意: 这将替换已出的任何配置文件选择。
# 出 team-a.json、team-b.json、team-c.json 配置文件的并集
# 注意: 这将替换已出的任何配置文件选择。
sparo checkout --profile team-a --profile team-b --profile team-c
```
@ -85,10 +85,10 @@ sparo checkout --add-profile team-b
sparo checkout --add-profile team-c
```
如何完全不出任何配置文件?也就是说,如何返回到仅包含[骨架](../reference/skeleton_folders.md)文件夹的干净 `sparo clone` 的初始状态?答案是使用 `--no-profile` 参数:
如何完全不出任何配置文件?也就是说,如何返回到仅包含[骨架](../reference/skeleton_folders.md)文件夹的干净 `sparo clone` 的初始状态?答案是使用 `--no-profile` 参数:
```shell
# 尚未实现 - 仅出骨架文件夹
# 尚未实现 - 仅出骨架文件夹
# 而不应用任何配置文件
sparo checkout --no-profile
```
@ -102,10 +102,10 @@ sparo checkout --no-profile
```shell
# 假设您需要为 "example-app" 项目进行修复。
# 哪些稀疏出配置文件包含 "example-app" 项目?
# 哪些稀疏出配置文件包含 "example-app" 项目?
sparo list-profiles --project example-app
# 很好,让我们将 "example-profile" 结果添加到我们当前的出中
# 很好,让我们将 "example-profile" 结果添加到我们当前的出中
# (与现有配置文件组合)。
sparo checkout --add-profile example-profile
```

View file

@ -10,12 +10,12 @@ Git 提供了这些基本解决方案,适用于中型仓库并且易于使用
- **部分克隆 (Partial clone)** 允许在不包含文件内容(**无 Blob** 克隆)甚至提交详细信息(**无树** 克隆)的情况下进行克隆,大大加快了 `git clone` 的时间,并允许在 `git checkout` 期间获取这些详细信息。
- **大文件存储 (LFS)** 可以将二进制文件移动到单独的服务器,在出时按需下载。然而LFS 的配置非常复杂,如果配置不当,可能会导致更差的性能。
- **大文件存储 (LFS)** 可以将二进制文件移动到单独的服务器,在出时按需下载。然而LFS 的配置非常复杂,如果配置不当,可能会导致更差的性能。
然而,要在大型仓库中实现良好的性能,需要使用更复杂的 Git 功能,例如:
- Git **文件系统监视器****后台维护** 是监视更改并定期预取服务器数据的后台进程。用户必须手动注册/注销工作目录,并记得在不需要时“暂停”服务。
- **Git 工作树 (worktrees)** 允许在您的计算机上使用多个工作目录共享一个 `.git` 文件夹,避免了多次克隆的成本。然而,这一功能也有一些尴尬的限制,例如同一个分支不能在两个工作树中出,并且 Git 钩子也是共享的。
- **Git 工作树 (worktrees)** 允许在您的计算机上使用多个工作目录共享一个 `.git` 文件夹,避免了多次克隆的成本。然而,这一功能也有一些尴尬的限制,例如同一个分支不能在两个工作树中出,并且 Git 钩子也是共享的。
- **稀疏出 (Sparse checkout)** 允许 `git checkout` 提取文件的子集,而不是整个目录结构。结合部分克隆,稀疏出是 Git 优化的“战斧”:尽管无关的项目和历史会积累,但您的等待时间将与您实际需要的文件成正比。
- **稀疏出 (Sparse checkout)** 允许 `git checkout` 提取文件的子集,而不是整个目录结构。结合部分克隆,稀疏出是 Git 优化的“战斧”:尽管无关的项目和历史会积累,但您的等待时间将与您实际需要的文件成正比。

View file

@ -24,7 +24,7 @@ Git 没有提供正式的安全规范,因此为了便于分析 Sparo 贡献,
假设一个不熟悉的远程 Git 仓库包含恶意文件,其中包括恶意配置文件,如 `.gitattributes`、`.gitignore` 和 Git 钩子脚本。以下操作应被认为是安全的:
- 使用 `git clone` 克隆远程仓库。
- 使用 `git checkout` 出文件。
- 使用 `git checkout` 出文件。
- 使用 `git commit` 提交本地文件的修改。
Git 通过默认忽略 Git 钩子和 `.gitattributes` 过滤器来确保安全。用户必须显式运行命令以“选择加入”,表示他们相信该仓库没有恶意代码。例如,调用 `rush install` 将注册预定义的 Git 钩子,因为 NPM 安装涉及执行不受信任的脚本,因此表示信任克隆的仓库。另一个例子是,如果 `.gitattributes` 引用了 LFS 过滤器,用户必须先通过运行 `git lfs install` 选择加入,这表明他们相信过滤器的作者已实施安全保护措施以防止恶意输入。

View file

@ -2,9 +2,9 @@
title: 骨架文件夹
---
默认情况下,`sparo clone` 会初始化一个稀疏出,不包含任何 Sparo 配置文件选择,但会包含包含基本配置文件的文件夹,如 **package-lock.yaml****package.json**。我们将这个起点称为出的 **"骨架"**,因为它显示了 monorepo 中所有项目文件夹的完整树结构,但没有它们的源代码子文件夹。换句话说,尽管每个项目的源文件被排除在外,但骨架仍然允许工程师了解其他团队的项目,以及他们自己的项目与这些其他项目的关系。这有助于避免“隧道视野”(工程师假装他们的项目是仓库中唯一的项目),同时仍然确保 Git 的高效性能。
默认情况下,`sparo clone` 会初始化一个稀疏出,不包含任何 Sparo 配置文件选择,但会包含包含基本配置文件的文件夹,如 **package-lock.yaml****package.json**。我们将这个起点称为出的 **"骨架"**,因为它显示了 monorepo 中所有项目文件夹的完整树结构,但没有它们的源代码子文件夹。换句话说,尽管每个项目的源文件被排除在外,但骨架仍然允许工程师了解其他团队的项目,以及他们自己的项目与这些其他项目的关系。这有助于避免“隧道视野”(工程师假装他们的项目是仓库中唯一的项目),同时仍然确保 Git 的高效性能。
由于 Sparo 启用了 Git 稀疏出的“锥形模式”优化,骨架使用 glob 模式来匹配整个文件夹,而不是单个文件。
由于 Sparo 启用了 Git 稀疏出的“锥形模式”优化,骨架使用 glob 模式来匹配整个文件夹,而不是单个文件。
## 骨架规范
@ -25,4 +25,4 @@ title: 骨架文件夹
- **packages/x/y/package.json** (项目 `y` 嵌套在项目 `x` 内——请避免这样做)
- **packages/x/y/src/index.ts**
然而Sparo 可以正确支持这种场景。例如,如果您的配置文件选择了 `x` 而未选择 `y`,那么出将包含 **x/src/index.ts**,但不包含 **x/y/src/index.ts**
然而Sparo 可以正确支持这种场景。例如,如果您的配置文件选择了 `x` 而未选择 `y`,那么出将包含 **x/src/index.ts**,但不包含 **x/y/src/index.ts**