【问题标题】:Running gulp task on a module that has dependencies injected via gulp-submodule, that in turn have their own dependencies via gulp-submodule, fails在具有通过 gulp-submodule 注入的依赖项的模块上运行 gulp 任务,该模块又通过 gulp-submodule 具有自己的依赖项,失败
【发布时间】:2017-08-21 00:28:39
【问题描述】:

标题可能听起来有点含糊,但这里有一个问题示例。假设我们有ModuleAModuleBModuleC三个模块,那么ModuleA依赖于ModuleB 和 ModuleB 依赖于 ModuleC。当我们需要针对 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 模块-a.gulpfile.js
[07:15:27] 使用 gulpfile 模块-a.gulpfile.js
[07:15:27] 任务 'module-b:module-c:default' 不在您的 gulpfile 中
[07:15:27] 请检查文档以了解正确的 gulpfile 格式

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

【问题讨论】:

    标签: javascript node.js gulp


    【解决方案1】:

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

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

    由于依赖层次结构不止一层,这种简单的逻辑就会中断,因为从 module-b.gulpfile.js 调用 gulp.submodule("module-c", {filepath: "module-c.gulpfile.js"}) 会导致 gulp.task 被包装 通过 gulp-submodule 第二次,因此模块 'module-c' 的任务 'default' 的名称被添加了两次:首先是 'module-c',然后是 'module-b'。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-27
      • 1970-01-01
      • 2016-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多