在通过 gulp-submodule 注入依赖项的模块上运行 gulp 任务,而该模块又通过 gulp-submodul



标题听起来可能有点模糊,但这里有一个出错的例子。假设我们有三个模块模块 A、模块B 和模块C,因此模块 A 依赖于模块 B,模块B依赖于模块 C当我们需要针对ModuleA运行任务时,我们通常还需要针对其依赖项运行一些任务 -ModuleBModuleC,这就是 gulp-submodule 发挥作用的地方。Gulp-submodule 让我们定义依赖模块的任务与其依赖关系之间的依赖关系,以便依赖模块的任务触发其依赖关系的相应任务。

如果我们有一个扁平结构,这工作得很好,即SomeModule依赖于一堆没有自己依赖关系的其他模块。但是,一旦这些依赖项中的任何一个都有自己的依赖项,整个生态系统就会中断,并显示一条模糊的错误消息,告知gulp无法找到某个任务。

下面是演示代码。要在本地环境中对此进行测试,必须至少将gulp作为全局包安装,并且gulp和gulp-submodule作为项目的本地包安装。

module-a.gulpfile.js

const gulp = require("gulp");
require("gulp-submodule")(gulp);
gulp.submodule("module-b", {filepath: "module-b.gulpfile.js"});
gulp.task("default", ["module-b:default"], () => {
console.log("Running task 'default' for module 'module-a'...");
});

module-b.gulpfile.js

const gulp = require("gulp");
require("gulp-submodule")(gulp);
gulp.submodule("module-c", {filepath: "module-c.gulpfile.js"});
gulp.task("default", ["module-c:default"], () => {
console.log("Running task 'default' for module 'module-b'...");
});

module-c.gulpfile.js

const gulp = require("gulp");
gulp.task("default", [], () => {
console.log("Running task 'default' for module 'module-c'...");
});

一旦在module-a.gulpfile.js上运行任务"default",你会得到类似于这样的输出:

gulp --gulpfile module-a.gulpfile.js[07:15:27] 使用 gulpfile module-a.gulpfile.js[07:15:27]

任务"模块-b:模块-c:default"不在 gulpfile 中[07:15:27] 请查看文档以了解正确的 gulpfile
格式


正如人们可能会注意到的那样,gulp 正在寻找一个名为"module-b:module-c:default"的某个任务,尽管在任何项目文件中都没有定义或引用具有这种名称的任务。

这个奇怪的不存在的任务来自gulp-submodule处理模块和任务之间依赖关系的方式。简而言之,它执行以下操作:

  1. 首先,在此调用gulp.submodule("module-b", {filepath: "module-b.gulpfile.js"})gulp-submodule 会临时替换原始gulp.task并将指定的 gulpfile 作为模块加载。
  2. 加载 gulpfile 时,它会获取修改后的 gulp 实例,其中 task 方法修改作为其参数提交的任务的名称,方法是在它前面加上模块名称和分隔符(默认情况下为":")。
  3. 稍后,当gulp运行模块"模块-a"的任务"default">
  4. 时,它会遇到一个我们引用为"module-b:default"的依赖项,这正是在步骤2中为模块"模块-b"的任务"default"构造的特殊名称。

对于多个级别的依赖层次结构,这种简单的逻辑会中断,因为从 module-b.gulpfile 调用gulp.submodule("module-c", {filepath: "module-c.gulpfile.js"}).js会导致gulp.task被包装 第二次通过gulp-submodule,因此模块"模块-c"的任务"默认"的名称被前缀两次:第一次是"模块-c",然后是"模块-b"。

为了快速解决此问题,我向原始子模块的私有版本提交了一个快捷方式修复:5864ae5(gulp-submodule)。这只是一个快速解决方案,绝对不是最好的解决方案,但它为我提供了诀窍。我将更新这个答案,我会为这个问题提供一个更可靠的解决方案。

最新更新