如何在 angular.json 的脚本部分使用 glob 模式?

How to use a glob pattern in the scripts section of angular.json?

我有一个混合 AngularJS/Angular 应用程序,需要一些时间才能完成迁移以完全成为一个 Angular 应用程序。当这个过程发生时,我想从以前的构建系统转移到使用 CLI 和 webpack 来管理所有旧的 AngularJS 脚本。这是可能的,因为我之前通过将我的所有脚本添加到 angular.json 中的 scripts 部分,如下所示:

"scripts": [              
  "src/app/angularjs/app.js",
  "src/app/angularjs/controllers/main.js",
  "src/app/angularjs/services/someService.js",
  "src/app/angularjs/controllers/someController.js"           
],

这很好用,通过 ng serveng build 构建的 CLI 继续根据需要为混合引导应用程序工作。我 运行 现在遇到的问题是手动列出我正在迁移的当前应用程序的每个文件并不理想。我有数百个脚本需要添加,我需要的是能够使用像下面这样的通配模式:

"scripts": [              
  "src/app/angularjs/**/*.js"
],

问题是据我所知这种语法不受支持。 glob 模式 angular.jsonassets 部分中得到 支持,如此处所述,但在 scripts 部分中不受支持:https://angular.io/guide/workspace-config#assets-configuration

scripts部分我找不到类似的解决方案。它确实有一个扩展对象 API,但没有什么可以解决我可以告诉 select all .js 列出的特定目录中的文件的问题这里:https://angular.io/guide/workspace-config#styles-and-scripts-configuration

是否可以通过某种方式对 select angular.jsonscripts 部分目录的所有文件使用 glob 模式或类似方法,所以我没有手动列出数百个 .js 文件?

坏消息

scripts 部分不支持与 assets 部分相同的 glob 模式。

好消息(?)

由于您正在从 AngularJS 过渡,您希望以后不会有任何新文件要导入,因此您可以只生成需要导入的所有文件的列表。

前往 src/app/angular 目录并 运行 以下内容:

find . -iregex '.*\.\(js\)' -printf '"%p",\n'

这将为您提供清单,为方便起见已将其引用。您可能需要快速执行 search/replace(将“.”更改为 "src/app/angularjs"),并且不要忘记删除最后一个逗号,但是一旦完成,您就应该准备就绪。

额外新闻

您可以使用 -not 进一步过滤掉不需要的文件,因此(根据您的评论)您可以这样做:

find . -iregex '^.*\.js$' -not -iregex '^.*_test\.js$' -printf '"%p",\n'

这应该会给你所有的 .js 文件,但没有你的 _test.js 文件。

当然,这不是一个复杂的模式,所以正如@atconway 在下面指出的那样,这同样有效:

find . -iname "*.js" -not -iname "*_test.js" -printf '"%p",\n'

不过,我会保留上面的内容,以便在正则表达式的全部功能可能派上用场的情况下使用。

我想扩展@JasonVerber 的 anser,这里是一个 Node.JS 代码,因此(我相信)跨平台。

首先安装 find 包,然后将代码段中的内容保存在某些 file.js 中。 然后,指定路径,以便它们解析到您不想从中获取文件的位置以及将结果文件放置到的位置。

之后 node file-name.js 并且这会将所有找到的文件路径保存到 result.txt 中的 resultPath 准备 Ctrl+A, Ctrl+C, Ctrl+V.

const find = require('find');
const path = require('path');
const fs = require('fs');

// BEFORE USAGE INSTALL `find` package

// Path to the folder where to look for files
const sourcePath = path.resolve(path.join(__dirname, 'cordova-app', 'src'));
// Path that will be removed from absolute path to files
const pathToRemove = path.resolve(path.join(__dirname, 'cordova-app'));
// Path where to put result.txt
const resultPath = path.resolve(path.join(__dirname, './result.txt'));
// Collects the file paths
const res = [];
// Path with replaced \ onto /
const pathToRemovehReplaced = pathToRemove.replace(/\/g, '/');

// Get all fils that match a regex
find.eachfile(/\.js$/, sourcePath, file => {
    // First remove all \ with / and then remove the path from root to source so that only relative path is left
    const fileReplaced = file.replace(/\/g, '/').replace(`${pathToRemovehReplaced}/`, '');
    // Surround with quoutes
    res.push(`"${fileReplaced}"`);
}).end(() => {
    // Write file and concatenate results with newline and commas
    fs.writeFileSync(resultPath, res.join(',\r\n'), 'utf8');
    console.log('DONE!');
});

我在测试时得到的结果(正则表达式/\.ts$/

"src/app/app.component.spec.ts",
"src/app/app.component.ts",
"src/app/app.module.ts",
"src/environments/environment.prod.ts",
"src/environments/environment.ts",
"src/main.ts",
"src/polyfills.ts",
"src/test.ts"