Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Options to exclude files #3

Closed
meaku opened this issue Apr 24, 2013 · 9 comments
Closed

Options to exclude files #3

meaku opened this issue Apr 24, 2013 · 9 comments

Comments

@meaku
Copy link

meaku commented Apr 24, 2013

Hey @sokra!

I just had some troubles on osx and the max. file watcher limit.
Is it possible to exclude certain folders via options?

Excluding node_modules would probably solve my problems.

@sokra
Copy link
Member

sokra commented Apr 24, 2013

There is no option, but you can add an option with an plugin.

Watching is handled by a WatchFileSystem on the watchFileSystem property of the Compiler. In node.js it is set to a instance of a NodeWatchFileSystem.

A simple decorator can filter the calls to this instance.

interface WatchFileSystem {
  watch(files, dirs, startTime, delay, callback, callbackUndelayed)
}

The callback has to deliver timestamps of all files and dirs, so the decorator must add timestamps for ignored files.

Here is a (untested) prototype:

function WatchIgnorePlugin(paths) {
  this.paths = paths;
}

module.exports = WatchIgnorePlugin;

WatchIgnorePlugin.prototype.apply = function(compiler) {
  compiler.plugin("after-environment", function() {
    compiler.watchFileSystem = new IgnoringWatchFileSystem(compiler.watchFileSystem, this.paths);
  });
};

function IgnoringWatchFileSystem(wfs, paths) {
  this.wfs = wfs;
  this.paths = paths;
}

IgnoringWatchFileSystem.prototype.watch = function(files, dirs, startTime, delay, callback, callbackUndelayed) {
  var ignored = function(path) {
    return this.paths.some(function(p) {
      return path.indexOf(p) == 0;
    });
  }.bind(this);
  var notIgnored = function(path) { return !ignored(path); };
  var ignoredFiles = files.filter(ignored);
  var ignoredDirs = dirs.filter(ignored);
  this.wfs.watch(files.filter(notIgnored), dirs.filter(notIgnored), startTime, delay, function(err, filesModified, dirsModified, fileTimestamps, dirTimestamps) {
    if(err) return callback(err);
    ignoredFiles.forEach(function(path) {
      fileTimestamps[path] = 1;
    });
    ignoredDirs.forEach(function(path) {
      dirTimestamps[path] = 1;
    });
    callback(err, filesModified, dirsModified, fileTimestamps, dirTimestamps);
  }, callbackUndelayed);
};

Than add it in the webpack options:

{
  plugins: [
    new WatchIgnorePlugin([path.join(__dirname, "node_modules")])
  ]
}

@sokra sokra closed this as completed May 15, 2013
@meaku
Copy link
Author

meaku commented May 15, 2013

Thanks! I increased the limit of file watchers on OSX to solve this issue for me.

@sokra
Copy link
Member

sokra commented May 15, 2013

Have you tried the WatchIgnorePlugin?

@meaku
Copy link
Author

meaku commented May 15, 2013

No i didn't yet.. But maybe someday, we'll need it.

@maxkostow
Copy link

Is this outdated now? I tried using the plugin but the compiler object has no watchFileSystem property

@sokra
Copy link
Member

sokra commented Oct 24, 2014

EDIT:

WatchIgnorePlugin.prototype.apply = function(compiler) {
  compiler.plugin("after-environment", function() {
    compiler.watchFileSystem = new IgnoringWatchFileSystem(compiler.watchFileSystem, this.paths);
  });
};

@maxkostow
Copy link

@sokra thanks!

Here's the complete working version for anybody else.

function WatchIgnorePlugin(paths) {
    this.paths = paths;
}

module.exports = WatchIgnorePlugin;

WatchIgnorePlugin.prototype.apply = function (compiler) {
    compiler.plugin("after-environment", function () {
        compiler.watchFileSystem = new IgnoringWatchFileSystem(compiler.watchFileSystem, this.paths);
    }.bind(this));
};

function IgnoringWatchFileSystem(wfs, paths) {
    this.wfs = wfs;
    this.paths = paths;
}

IgnoringWatchFileSystem.prototype.watch = function (files, dirs, startTime, delay, callback, callbackUndelayed) {
    var ignored = function (path) {
        return this.paths.some(function (p) {
            return path.indexOf(p) === 0;
        });
    }.bind(this);
    var notIgnored = function (path) { return !ignored(path); };
    var ignoredFiles = files.filter(ignored);
    var ignoredDirs = dirs.filter(ignored);
    this.wfs.watch(files.filter(notIgnored), dirs.filter(notIgnored), startTime, delay, function (err, filesModified, dirsModified, fileTimestamps, dirTimestamps) {
        if(err) return callback(err);
        ignoredFiles.forEach(function (path) {
            fileTimestamps[path] = 1;
        });
        ignoredDirs.forEach(function (path) {
            dirTimestamps[path] = 1;
        });
        callback(err, filesModified, dirsModified, fileTimestamps, dirTimestamps);
    }, callbackUndelayed);
};

@christophercliff
Copy link

I moved this plugin to npm: https://www.npmjs.com/package/watch-ignore-webpack-plugin

@sokra
Copy link
Member

sokra commented Jan 24, 2015

@christophercliff cool... Could you add it to this list? http://webpack.github.io/docs/list-of-plugins.html

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants