2

我正在尝试创建一个无需先执行“ng new project-name”然后运行“ng g my-schematic”即可运行的新原理图

当我什至在本地运行我的原理图时,我必须首先将我的 CLI 的 defaultCollection 设置为我的原理图,这没有意义,我不确定为什么会发生这种情况。

我得到的错误是“在@schematics/angular 中找不到我的示意图”

我的原理图非常简单,我希望它能够运行并在运行时生成项目的整个脚手架。

export function nextGen(options: any): Rule {
  return (tree: Tree, _context: SchematicContext) => {
    const rule = mergeWith(apply(url('./files'), [
      template({
        ...options
      }),
      forEach((fileEntry: FileEntry) => {
        console.log(fileEntry.path);
        if (tree.exists(fileEntry.path)) {
          tree.overwrite(fileEntry.path, fileEntry.content);
          return null;
        }
        return fileEntry;
      })
    ]))
    return rule(tree, _context); 
  }
};

有没有一种已知且简单的方法来实现这一点?我不确定尝试“扩展”“新”原理图或使用“ng new project-name collection=my-schematic”是否可行?

如果这些选项中的任何一个都是可能的,那么就传入的树而言,这意味着什么,以及如何操纵它来生成包含在“./files”库中的文件?

谢谢!

4

2 回答 2

3

您的问题中有一些与原理图相关的不同问题,所以我会尽可能多地回答。首先,听起来您想运行单个 Angular CLI 命令来生成基础项目。我从未使用过您建议的选项来更改全局 CLI 安装的默认示意图集合,而是运行ng new project-name --collection collection-name.

现在,让我们谈谈您考虑过的两个选项:扩展与覆盖。如果您要扩展默认ng new原理图,您的原理图规则可能如下所示:

const ruleChain = chain([
                    externalSchematic('@schematics/angular', 'ng-new', options),
                    mergeWith(apply(url('./files'), [
                    template({
                        ..options
                    }), ...

您执行 Angular 示意图 ng-new 命令,然后添加您的应用程序需要的不属于 Angular 默认值的任何新文件,例如,您的应用程序需要的新组件文件,覆盖您需要的 Angular 默认值中的任何文件大幅改变行为,例如,app.module.ts导入您的自定义组件的更新,或修改任何略有不同的文件,例如,添加新的依赖项package.json(作为一般规则,我将修改JSON 文件并覆盖 .ts文件。

关于您关于文件树的问题,规则启动时它将是空的,在ng-new原理图执行后具有约 30 个 Angular 文件的默认集合,并在您的链中的其余规则已执行时具有您配置的应用程序。你可以选择用你喜欢的方式命名这个原理图collection.json,或者调用它ng-new,这将隐藏默认的 Angular 行为,或者ng-new-custom,这将允许它与默认的新应用程序原理图并排存在。

我发现另一个有用的原理图行为是在原理图中指定原理collection.json图扩展了 Angular 原理图,即,"extends":"@schematics/angular"然后在新应用程序的规则链中,修改angular.json使用我的自定义原理图作为默认值。以我的经验,这为不熟悉指定原理图集合的同行创造了更加统一和无缝的体验。

于 2019-01-27T05:44:29.673 回答
0

我的问题实际上非常相似,但上述解决方案似乎不起作用。

我想先调用Angular的ng-new,然后我的Rule需要对结果进行操作。

所以像:

 chain([
                    externalSchematic('@schematics/angular', 'ng-new', options),
                    schematic('someRule', options)
])

但这不起作用。我的规则需要 angular.json ngNew 应该创建,当我的规则运行时它显然还不存在。

那么有没有办法等待外部原理图完成然后运行另一个原理图,或者告诉第二个原理图使用 ng-new 返回的树?

就像:

chain([
      externalSchematic('@schematics/angular', 'ng-new', options),
      mergeWith(apply(source(/* source created by ng-new */), [
        schematic('someStuff', options)
      ])
    )])

@ericksoen?

于 2020-01-04T19:44:07.843 回答