GULP:就地修改监视文件而不导致无限循环

2024-01-07

我尝试使用 gulp 和 jscs 来防止代码异味。我还想使用手表,以便在进行更改时发生这种情况。我遇到的问题是 jscs 修改正在监视的源文件。这会导致 gulp 进入 jscs 修改文件的无限循环,然后观察更改并一次又一次地触发 jscs ...

const gulp = require('gulp');

gulp.task('lint', function() {
    return gulp.src('/src/**/*.js')
        .pipe(jscs({
            fix: true
        }))
        .pipe(jscs.reporter())
        .pipe(gulp.dest('/src'));
});

gulp.task('watch', function() {
    gulp.watch('/src/**/*.js', ['lint']);
});

从 gulp 任务中覆盖源文件通常是一个坏主意。任何打开这些文件的编辑器/IDE 可能会也可能不会妥善处理该问题。通常最好将文件写入单独的文件中dist folder.

话虽如此,这里有两种可能的解决方案:

解决方案1

你需要停止gulp-jscs插件不会再次运行并再次写入文件,从而防止您遇到无限循环。要实现这一点,您所要做的就是添加gulp-cached https://github.com/contra/gulp-cached#usage给你的lint task:

var cache = require('gulp-cached');

gulp.task('lint', function() {
  return gulp.src('/src/**/*.js')
    .pipe(cache('lint'))
    .pipe(jscs({
        fix: true
    }))
    .pipe(cache('lint'))
    .pipe(jscs.reporter())
    .pipe(gulp.dest('/src'));
});

首先cache()确保磁盘上只有自上次调用以来发生更改的文件lint都通过了。第二cache()确保只有实际已修复的文件jscs()首先写入磁盘。

该解决方案的缺点是lint任务仍在执行两次。这不是什么大问题,因为在第二次运行期间,文件实际上并没有被检查。gulp-cache防止这种情况发生。但如果你绝对想确保lint仅当有另一种方式时才运行。

解决方案2

首先你应该使用gulp-watch plugin https://www.npmjs.com/package/gulp-watch而不是内置的gulp.watch() https://github.com/gulpjs/gulp/blob/5944c1b/docs/API.md#gulpwatchglob--opts-tasks-or-gulpwatchglob--opts-cb(那是因为它使用了优越的chokidar https://www.npmjs.com/package/chokidar图书馆而不是gaze https://www.npmjs.com/package/gaze).

然后你可以自己写一个简单的pausableWatch()函数并在您的中使用它watch task:

var watch = require('gulp-watch');

function pausableWatch(watchedFiles, tasks) {
  var watcher = watch(watchedFiles, function() {
    watcher.close();
    gulp.start(tasks, function() {
      pausableWatch(watchedFiles, tasks);
    });
  });
}

gulp.task('watch', function() {
  pausableWatch('/src/**/*.js', ['lint']);
});

在上面的watcher之前停止lint任务开始。任何.js期间写入的文件lint因此任务不会触发watcher。之后lint任务已经完成,watcher再次启动。

该解决方案的缺点是,如果您保存.js文件同时lint任务正在执行,更改不会被watcher(因为它已被停止)。你必须保存.js后的文件lint任务已完成(当watcher又开始了)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GULP:就地修改监视文件而不导致无限循环 的相关文章

  • 缩进 Sass 语法不适用于 node-sass 和 gulp-sass

    Libsass 2 0 为 libsass 用户带来了缩进语法 但到目前为止我还无法让它与node sass and gulp sass 我有所有最新版本 节点 sass 0 93 gulp sass 0 7 2 gulp 3 8 2 这个
  • 如何在 gulp 任务中运行 shell 命令并检测它何时完成?

    我正在尝试使用以下命令在 gulp 任务中运行 shell 命令child process spawn 我必须检测任务何时完成运行 所以我正在使用stdout检查我在命令末尾发出的特定字符串 但由于某种原因 它看起来不像我的字符串正在发出
  • 如何调试 gulp-sourcemaps 不执行任何操作?

    我有一个相当标准的用例gulp sourcemaps https github com floridoo gulp sourcemaps https github com floridoo gulp sourcemaps gulp src
  • Gulp 伊斯坦布尔完整覆盖报告

    我正在使用 gulp istanbul 通过 Gulp 生成 JavaScript 单元测试覆盖率报告 有没有办法配置 Istanbul 以生成我的 gulp 流中所有 JS 文件的完整覆盖率报告 而不仅仅是测试用例涉及的文件 我正在开发一
  • aws s3 同步命令仅基于文件大小?

    是否可以运行 s3 同步命令 但仅根据文件大小上传文件 而不仅仅是包含文件的修改日期时间 我目前正在运行 aws s3 sync app dist s3 mywebsite me dist acl public read 我遇到的问题是我在
  • BrowserSync Gulp 无法在 Chrome 中打开

    我尝试在 Chrome 中使用 BrowserSync 和 Gulp 在本地主机上打开我的网站 但它不起作用 默认情况下 它在 Firefox 中打开 一切正常 但是 当我更改 gulpfile js 中的参数以在 Chrome 中打开网站
  • 如何使用 gulp 在浏览器中进行刷新

    我有一个应用程序在 iis 中 它是一个用 angularjs 和 webapi C 2 0 制作的应用程序 我想创建一个任务 在保存任何 js 文件后立即更新浏览器 吞咽版本 3 9 1 gulp task livereload func
  • Gulp Typescript + Browserify;捆绑的 sourcemap 指向转译的 JS 而不是源 TS

    我正在开发一个 Typescript 项目 该项目被转换为 ES5 JS 然后通过 browserify 运行以创建单个 js 包和源映射 捆绑的源映射指向转译的 JS而不是源TS即使我生成的源映射在转换为 JS 时正确指向源 TS 这就好
  • Visual Studio 2015 RC Gulp 任务运行程序未检测到任务

    我在 Visual Studio 2015 RC 中有一个 Gulpfile js 其中有一个默认任务 由于某种原因它没有出现在Task Runner Explorer 我已将 gulp 添加到我的 devDependencies 中pac
  • 在 VS2015 中构建后执行 Gulp.js 任务

    我有一个基本的 Asp Net 5 站点 它使用 Gulp JS 任务来清理 复制和缩小 CSS 和 JS 文件 在任务运行程序资源管理器中运行这些任务时 一切都很好 旧脚本被删除 新脚本被复制 文件被缩小 我希望在 VS2015 中自动执
  • Gulp:无依赖的同步性

    我正在将构建系统迁移到 gulp 并且遇到了一个问题 我定义了各种构建任务 scripts style jade等 以及clean删除所有构建文件的任务 我想确保构建任务不会在清理任务之前运行 BUT我还希望能够在不先清理的情况下运行构建任
  • Gulp-sass 无法编译 scss 文件

    我正在使用 Gulp 将我的 sass 编译为 css 一个简单的任务编译style scss文件在 sass目录并将输出保存到项目的根目录中 style scss仅用于导入其他文件 sass目录 当我从命令行运行默认任务时 gulp 我收
  • 如何将 Istanbul Code Coverage 与转译的 Typescript 结合使用?

    我整个早上都在阅读有关此问题的文章 试图正确设置我的环境 但由于某种原因我不明白 我的设置 app source mixed js and ts scripts copied source js typescripts js transpi
  • Gulp - 处理多个主题和文件夹

    我正在努力创造一个终极gulpfile我们可以在我们的大型网站之一上使用它 一个具有多个主题 具体取决于您所在网站的部分 我试图让它只运行它需要运行的进程 而不是重新编译所有内容 让我准确地布局我想要实现的目标 文件夹结构 src mast
  • 打开 PHPStorm 项目时可以自动运行终端命令吗?

    我有一个 Gulp 工作流程 我希望在 PHPStorm 中打开我的项目时自动启动该工作流程 这可能吗 Not possible at the moment https youtrack jetbrains com issue WEB 11
  • Angular js gulp sourcemap ngannonate 和 babel 中 JavaScript 堆内存不足

    我在我的 Angular JS 项目中使用 es6 语法 但运行时会抛出错误gulp build 在 github 上搜索 但是有些人说这是由于 gulp uglify 导致的错误 而有些人说这是 babel 问题 其他人说这是 ng an
  • -bash: gulp: 在 Mac 中找不到命令

    我尝试在 mac 中安装 gulp 如下所示 Is iMac itop npm root Users itop node modules Is iMac itop npm config set prefix usr local Is iMa
  • 保存到服务器后,隐藏字符“\u0”添加到文件中

    我正在使用 Apache 服务器为 Web 开发网站提供服务 这样我就可以不断保存和编辑文件 我使用 Gulp for Sass 来连接和丑化 css 和 js 文件 一个月前 我的 js 和 css 文件遇到问题 似乎在文件下面添加了随机
  • Angular2 - 在 SystemJS 中导入第 3 方 javascript

    由于某种原因 fileSaver 没有被映射 angular2 jwt 工作正常 I did npm install file saver save获取文件保护程序 然后按如下方式引用它 我有一个 gulp 任务将 js 文件移动到 lib
  • 找不到模块“lodash”

    今天我尝试了解有关 Google Web Starter Kit 的更多信息 因此我关注了这些说明 https developers google com web fundamentals getting started web start

随机推荐