angular / angular/angular-cli

Schematics : Copy then delete can cause "This should never happen" error.

未关闭
#16,527 0 条评论 7 个 reaction 已指派 0 人 在 GitHub 查看
area: @angular-devkit/schematics freq1: low severity3: broken type: bug/fix
主要语言
TypeScript
星标
27k
派生
11.8k
平均合并
14 小时 23 分钟
30 天内合并 PR
162

描述

# 🐞 Bug report

### Description

Moving files as part of a schematic can cause an error to be thrown:

```bash
Message:
Error: This should never happen. Path: "/projects/bar".
```

It seems to happen if those files were created by a previous rule and the move is done by copy and deletion.

(As an aside here, it _seems_ that delete operations are hoisted somehow...whenever they occur in a schematic, the logger output shows them to always happen first, this is *not* what I'd expect)

I'm aware that there is a `move` rule in `@angular-devkit/schematics/src/rules`, but this **does not work**. Attempting to use this rule to move files from one folder to another results in this error: `ENOENT: no such file or directory, rename '' -> ''`

## 🔬 Minimal Reproduction

```ts
export function move(schema: Schema): Rule {
return (host: Tree, _context: SchematicContext): Tree => {
const dir = host.getDir(schema.source);
dir.visit(file => {
const newPath = file.replace(schema.source, schema.destination);

const buffer = host.read(file);
if (buffer === null) {
return;
}

host.create(newPath, buffer);
});

host.delete(schema.source);

return host;
};
}
```

See also: https://github.com/jdpearce/move-schematic

NB - this schematic will probably work if run against a pre-existing workspace, but when the tree is set up by another schematic, as in the spec file, that's when the error is thrown.

## 🌍 Your Environment

Angular CLI: 8.3.21
Node: 13.5.0
OS: darwin x64
Angular: undefined
...

Package Version
------------------------------------------------------
@angular-devkit/architect 0.803.21 (cli-only)
@angular-devkit/core 8.3.21
@angular-devkit/schematics 8.3.21
@schematics/angular 8.3.21
@schematics/update 0.803.21 (cli-only)
rxjs 6.5.4
typescript 3.5.3

贡献指南

打开贡献指南

调研方向

首先运行 issue 的 schematic 规范中的最小复现,尤其是在 Tree 由另一个 Schematic 创建时。然后检查 Tree 的 Copy/Delete 行为以及 @angular-devkit/schematics/src/rules 中的 Move 规则。完成的标准是 Copy-then-delete 情况不再抛出 “This should never happen”,并且 Move 规则不再报告 ENOENT。

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

评估

技术栈
angular, typescript
领域
tooling
Issue 类型
缺陷
难度
4/5
预计耗时
3-5 天
活跃度
停滞
描述清晰度
基本清楚
新手友好度
35/100

把新 issue 发到你的邮箱

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