You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义NX插件生成器调用@angular/material:ng-add无文件变更问题求助

在自定义NX插件生成器中调用@angular/material:ng-add无文件变更的问题

我在自定义NX插件生成器中尝试调用@angular/material:ng-add生成器,执行后日志显示生成完成,但styles.scss、index.html、app.module.ts等预期文件完全没有变更,尽管node_modules中已存在@angular/material和@angular/cdk依赖。

已实现的代码

应用生成器(安装依赖)

export default async function (tree: Tree, options: ApplicationGeneratorOptions) {
  const { appName, } = normalizeOptions(tree, options);

  const angularInitOptions: AngularInitOptions = {...};
  await angularInitGenerator(tree, angularInitOptions);

  const angularAppOptions: AngularApplicationOptions = {...};
  await applicationGenerator(tree, angularAppOptions);

  const addDepsToTargetWorkspace = addDependenciesToPackageJson(tree, {
    '@angular/material': VERSIONS.ANGULAR_MATERIAL,
    '@angular/cdk': VERSIONS.ANGULAR_CDK,
  }, {});

  await formatFiles(tree);
  return addDepsToTargetWorkspace;
}

Material生成器(调用ng-add)

export default async function (tree: Tree, options: MaterialGeneratorSchema) {
  const { appName } = normalizeOptions(tree, options);

  const ngAddOptions: NgAddOptions = { project: appName, animations: 'enabled', theme: 'indigo-pink', typography: true };

  const ngAddMaterialGenerator = wrapAngularDevkitSchematic('@angular/material', 'ng-add');

  await ngAddMaterialGenerator(tree, ngAddOptions);

  return () => {
    logger.info(`Nx Qmaterial Generator: ${appName} has been generated.`);
  }
}

问题排查及解决方案

1. 显式添加skipInstall参数

由于依赖已提前安装,需告知Angular Material的ng-add schematic跳过依赖安装检查,避免因内部安装逻辑导致的无操作:

const ngAddOptions: NgAddOptions = { 
  project: appName, 
  animations: 'enabled', 
  theme: 'indigo-pink', 
  typography: true,
  skipInstall: true // 新增参数
};

2. 验证项目名称的正确性

检查normalizeOptions处理后的appName是否与NX项目的**完整名称(含scope)**完全匹配,ng-add会严格校验项目名称,不匹配则无法定位目标项目进行修改。可通过以下代码确认项目配置:

import { readProjectConfiguration } from '@nx/devkit';

// 在Material生成器中添加
const projectConfig = readProjectConfiguration(tree, appName);
console.log('目标项目配置:', projectConfig);

3. 确保变更被格式化并持久化

调用ng-add后需对更新的文件进行格式化,并确保Tree的变更被正确处理:

export default async function (tree: Tree, options: MaterialGeneratorSchema) {
  const { appName } = normalizeOptions(tree, options);

  const ngAddOptions: NgAddOptions = { 
    project: appName, 
    animations: 'enabled', 
    theme: 'indigo-pink', 
    typography: true,
    skipInstall: true
  };

  const ngAddMaterialGenerator = wrapAngularDevkitSchematic('@angular/material', 'ng-add');
  const updatedTree = await ngAddMaterialGenerator(tree, ngAddOptions);
  
  await formatFiles(updatedTree); // 格式化更新后的文件

  return () => {
    logger.info(`Nx Qmaterial Generator: ${appName} has been generated.`);
  }
}

4. 捕获隐藏错误

用try-catch包裹schematic调用,排查是否有未暴露的异常:

try {
  await ngAddMaterialGenerator(tree, ngAddOptions);
} catch (err) {
  console.error('Material ng-add执行失败:', err);
  throw err;
}

内容的提问来源于stack exchange,提问作者pax

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 07:53:28