angular / angular/angular-cli

`unit-test` builder resolves include paths relative to sourceRoot instead of project root, breaking secondary entry points tests

未关闭
#33,467 0 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看
angular/build:unit-test area: @angular/build
主要语言
TypeScript
星标
27k
派生
11.8k
平均合并
14 小时 23 分钟
30 天内合并 PR
162

描述

### Command

test

### Is this a regression?

- [ ] Yes, this behavior used to work in the previous version

### The previous version in which this bug was not present was

_No response_

### Description

When using the `@angular/build:unit-test` builder in a library project that contains Secondary Entry Points (sub-packages), the builder incorrectly resolves the glob patterns defined in the `include` array (inside `angular.json`) relative to the project's `sourceRoot` (usually `.../src`) instead of the project's root.

Because the unit-test builder anchors include patterns to `sourceRoot`, it cannot discover test files located in secondary entry points unless developers use relative path traversal (for example, `../my-sub-package/**/*.spec.ts`).

### Minimal Reproduction

Create an Angular library project.
2. Generate a secondary entry point inside the library root (for example, `projects/my-lib/my-sub-package/`).
3. Add a unit test inside the secondary entry point:

```text
projects/my-lib/my-sub-package/my-sub.spec.ts
```

4. Configure the test target in `angular.json` using `@angular/build:unit-test`:

```json
{
"options": {
"include": [
"**/*.spec.ts",
"my-sub-package/**/*.spec.ts"
],
"tsConfig": "projects/my-lib/tsconfig.spec.json"
}
}
```

5. Run:

```bash
ng test
```

### Exception or Error

The builder should resolve the `include` patterns relative to the project's root, or otherwise recognize ng-packagr secondary entry points, allowing patterns such as:

```json
{
"include": [
"**/*.spec.ts",
"my-sub-package/**/*.spec.ts"
]
}
```

to correctly match test files located in:

```text
projects/my-lib/my-sub-package/
```

### Workaround

Currently, developers must escape the `sourceRoot` directory by using a parent path segment in `angular.json`:

```json
{
"options": {
"include": [
"**/*.spec.ts",
"../my-sub-package/**/*.spec.ts"
],
"tsConfig": "projects/my-lib/tsconfig.spec.json"
}
}
```

### Your Environment

```text
_ _ ____ _ ___
/ \ _ __ __ _ _ _| | __ _ _ __ / ___| | |_ _|
/ △ \ | '_ \ / _` | | | | |/ _` | '__| | | | | | |
/ ___ \| | | | (_| | |_| | | (_| | | | |___| |___ | |
/_/ \_\_| |_|\__, |\__,_|_|\__,_|_| \____|_____|___|
|___/

Angular CLI : 22.0.4
Angular : 22.0.2
Node.js : 24.16.0
Package Manager : npm 11.13.0
Operating System : linux x64

┌───────────────────────────────────┬───────────────────┬───────────────────┐
│ Package │ Installed Version │ Requested Version │
├───────────────────────────────────┼───────────────────┼───────────────────┤
│ @angular/animations │ 22.0.2 │ ^22.0.2 │
│ @angular/build │ 22.0.4 │ ^22.0.4 │
│ @angular/cli │ 22.0.4 │ ^22.0.4 │
│ @angular/common │ 22.0.2 │ ^22.0.2 │
│ @angular/compiler │ 22.0.2 │ ^22.0.2 │
│ @angular/compiler-cli │ 22.0.2 │ ^22.0.2 │
│ @angular/core │ 22.0.2 │ ^22.0.2 │
│ @angular/forms │ 22.0.2 │ ^22.0.2 │
│ @angular/localize │ 22.0.2 │ ^22.0.2 │
│ @angular/platform-browser │ 22.0.2 │ ^22.0.2 │
│ @angular/platform-browser-dynamic │ 22.0.2 │ ^22.0.2 │
│ @angular/router │ 22.0.2 │ ^22.0.2 │
│ @angular/service-worker │ 22.0.2 │ ^22.0.2 │
│ ng-packagr │ 22.0.0 │ ^22.0.0 │
│ rxjs │ 7.8.2 │ ~7.8.2 │
│ typescript │ 6.0.3 │ ^6.0.3 │
│ vitest │ 4.1.9 │ ^4.1.9 │
│ zone.js │ 0.16.2 │ ^0.16.2 │
└───────────────────────────────────┴───────────────────┴───────────────────┘
```

### Anything else relevant?

_No response_

贡献指南

打开贡献指南

调研方向

首先使用 @angular/build:unit-test builder 运行最小复现,并检查其来自 angular.json 的 include 模式是如何解析的。使用包含所示路径 my-sub-package/**/*.spec.ts 的库验证该行为。完成的标准是:模式从项目根目录解析,并且 ng test 能够发现次级入口点中的测试,而不通过 ../ 进行路径遍历。

由索引模型根据 Issue 内容生成。

评估

技术栈
angular, typescript
领域
build-system, testing
Issue 类型
缺陷
难度
3/5
预计耗时
1-2 天
活跃度
冷清
描述清晰度
基本清楚
新手友好度
58/100

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。