NodeJS fs.watch没有对Docker容器内的更改做出反应

Dav*_*tti 2 javascript fs node.js docker

以下代码的想法是对文件夹内文件的更改做出反应.当我在我的macOS上运行此代码时,一切都按原样执行.

let fs = require("fs");

let options = {
    encoding: 'buffer'
}

fs.watch('.', options, function(eventType, filename) {

    if(filename)
    {
        console.log(filename.toString());
    }

});
Run Code Online (Sandbox Code Playgroud)

另一方面,在Docker容器内部,代码不会对文件更改做出反应.我按以下方式运行代码:

docker run -it --rm --name $(basename $(pwd)) -v $(pwd):/app -w /app node:slim sh -c 'node index'

是否可以选择使用Docker来允许系统通知文件更改?

Bla*_*ork 5

新答案

最初我建议Gulp(见旧帖更新后的帖子底部).它没有用,因为你试图以编程方式使用它,当Gulp是任务运行器并且有自己的使用模式时,我没有描述.既然您需要特定的东西,我会为您提供非常简单,可靠的解决方案.

它使用gulp使用的一个名为gaze - module的模块,每周下载量约为170万.它确实适用于每个系统.

npm install gaze --save

为了使其工作,我们可以index.js在根文件夹中创建(它将被挂载到appdocker中的文件夹中,然后只需按照模块README中给出的基本指令操作:

 var gaze = require('gaze');

 // Watch all .js files/dirs in process.cwd() 
 gaze('**/*.js', function(err, watcher) {
 // Files have all started watching 
 // watcher === this 
 console.log('Watching files...');

 // Get all watched files 
 var watched = this.watched();

 // On file changed 
 this.on('changed', function(filepath) {
  console.log(filepath + ' was changed');
 });

 // On file added 
 this.on('added', function(filepath) {
   console.log(filepath + ' was added');
 });

  // On file deleted 
 this.on('deleted', function(filepath) {
  console.log(filepath + ' was deleted');
 });

 // On changed/added/deleted 
 this.on('all', function(event, filepath) {
  console.log(filepath + ' was ' + event);
 });

  // Get watched files with relative paths 
   var files = this.relative();
  });
Run Code Online (Sandbox Code Playgroud)

现在让我们运行你的命令:

docker run -it --rm --name $(basename $(pwd)) -v $(pwd):/app -w /app node sh -c 'node index'

我们所做的改变 - Linux outpud,但这也适用于Mac OS.

   blackstork@linux-uksg:~/WebstormProjects/SO/case1> docker run -it --rm --name $(basename $(pwd)) -v $(pwd):/app -w /app node sh -c 'node index'
   Watching files...
   /app/bla was changed
   /app/foobar.js was changed
Run Code Online (Sandbox Code Playgroud)

老答案.

你可以用gulp做到这一点.Gulpfile.js

 const gulp = require('gulp');

 gulp.task( 'watch' , ()=>{
    return gulp.watch(['app/**'], ['doStuff']);
 });

 gulp.task( 'doStuff', cb => {
   console.log('stuff');
   //do stuff
   cb();
  });
Run Code Online (Sandbox Code Playgroud)

到目前为止,这种方法对我有用(当然,你可以构建更复杂的东西,但如果发现使用gulp conventient进行不同的文件系统任务).

  • Gaze正在做这个伎俩,并没有意识到这个模块.感谢您的帮助 :) (2认同)