【发布时间】:2018-08-04 01:23:01
【问题描述】:
我想写一个Rule,它每次都会覆盖一个文件。在下面并将MergeStrategy 设置为Overwrite:
collection.json
{
"$schema": "../node_modules/@angular-devkit/schematics/collection-schema.json",
"schematics": {
"function": {
"aliases": [ "fn" ],
"factory": "./function",
"description": "Create a function.",
"schema": "./function/schema.json"
}
}
}
function/index.ts
export default function(options: FunctionOptions): Rule {
options.path = options.path ? normalize(options.path) : options.path;
const sourceDir = options.sourceDir;
if (!sourceDir) {
throw new SchematicsException(`sourceDir option is required.`);
}
const templateSource: Source = apply(
url('./files'),
[
template({
...strings,
...options,
}),
move(sourceDir),
]
)
return mergeWith(templateSource, MergeStrategy.Overwrite);
}
files/__path__/__name@dasherize__.ts
export function <%= camelize(name) %>(): void {
}
我运行schematics .:function --name=test --dry-run=false 我得到了
创建 /src/app/test.ts(33 字节)
但是,第二次。
错误! /src/app/test.ts 已经存在。
它不应该覆盖文件test.ts而不出错吗?
编辑:
所有答案都有效并且很棒,但似乎它们是变通方法,没有明显的“正确”答案,并且可能基于偏好/自以为是。所以不知道如何标记为已回答。
【问题讨论】:
-
实际上不,默认行为是保留文件原样。您可以使用
--force标志来强制覆盖文件,如下所示:schematics .:function --name=test --dry-run=false --force。 BTW:你在模板函数中为...strings导入了什么? -
我可能不明白
MergeStrategy.Overwrite的含义,如果那不是行为那么MergeStrategy.Overwrite的意义/意义是什么。 -
哦,对不起,我完全错过了
MergeStrategy.Overwrite,现在我同意它应该完全有效。至少在归档的 angular/dev-kit 项目中曾经存在过一个问题:github.com/angular/devkit/issues/745 -
@jlang
import { strings } from '@angular-devkit/core';
标签: angular angular-cli angular-schematics