6

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

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

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

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

问题是不支持这种语法。glob 模式在此处所述的部分中支持,但在以下部分中不受支持:https ://angular.io/guide/workspace-config#assets-configurationassetsangular.jsonscripts

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

是否可以通过某种方式使用 glob 模式或类似方法来选择目录中的所有文件,scripts这样angular.json我就不必手动列出数百个单独的.js文件?

4

2 回答 2

7

坏消息

scripts部分不支持与该部分相同的全局模式assets

好消息(?)

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

进入src/app/angular目录并运行以下命令:

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

这将为您提供您的清单,为了您的方便已经引用了。您可能需要进行快速搜索/替换(将“.”更改为“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'

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

于 2019-11-05T19:51:42.243 回答
0

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

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

之后,node file-name.js这会将所有找到的文件路径保存到resultPath准备result.txt好的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"
于 2019-11-05T21:30:10.140 回答