代码之家  ›  专栏  ›  技术社区  ›  Gardelin

Gulp watch/tmp权限被拒绝

  •  2
  • Gardelin  · 技术社区  · 7 年前

    我正在我的一个项目中使用gulp。运行时 gulp watch 从操作系统(Arch Linux)

    fs.js:921
      return binding.readdir(pathModule.toNamespacedPath(path), options.encoding);
                 ^
    
    Error: EACCES: permission denied, scandir '/tmp/systemd-private-c33e4391b18f4b24af3055190fb15730-systemd-hostnamed.service-zrxyaX/'
    at Object.fs.readdirSync (fs.js:921:18)
    at Gaze._addToWatched (/home/majmun/code/wp/wp-content/plugins/project/node_modules/glob-watcher/node_modules/gaze/lib/gaze.js:274:22)
    at Gaze._internalAdd (/home/majmun/code/wp/wp-content/plugins/project/node_modules/glob-watcher/node_modules/gaze/lib/gaze.js:191:10)
    at /home/majmun/code/wp/wp-content/plugins/project/node_modules/glob-watcher/node_modules/gaze/lib/gaze.js:400:16
    at Array.forEach (<anonymous>)
    at /home/majmun/code/wp/wp-content/plugins/project/node_modules/glob-watcher/node_modules/gaze/lib/gaze.js:396:12
    at FSReqWrap.oncomplete (fs.js:153:20)
    

    我从主机操作系统运行gulp,而不是从虚拟机运行gulp,因为它要快得多。

    我知道问题是gulp在做什么 /tmp 主机操作系统的文件夹,并且某些文件具有根权限。

    如果我跑步 sudo chown -R majmun:users /tmp ,之后,将出现一个具有root权限的新文件,该文件将停止运行。

    为什么gulp watch需要 /tmp公司 文件夹 是否有人解决了此问题?

    这是gulp watch任务的代码 //大口手表

     Gulp.task('watch', ['dev'], function() {
            console.log('Initializing assets watcher:')
    
        let stream = new Stream();
        let filter = '*.{css,scss,sass,less,js,png,jpg,jpeg,svg}';
        let tmp = Tmp.fileSync();
        let glob = [
            path.src.assets + '**/' + filter,
            path.src.elements + '**/' + filter,
            path.src.properties + '**/' + filter,
        ];
    
        for (let i = 0; i < glob.length; i++) {
            console.log('- ' + glob[i]);
        }
    
        let watcher = Gulp.watch(glob, ['dev']);
        watcher.add(tmp.name);
    
        process.on('SIGINT', function() {
            stream.emit('end');
            process.exit(0);
        });
    
        KeyPress(process.stdin);
        process.stdin.on('keypress', function(char, key) {
            if (key && key.ctrl && key.name == 'c') {
                process.emit('SIGINT');
            }
            else if (key && key.ctrl && key.name == 'r') {
                Fs.utimes(tmp.name, new Date(), new Date(), function() {});
            }
        });
        process.stdin.setRawMode(true);
        process.stdin.resume();
    
        console.log('Watcher up and running, Ctrl+R to refresh, Ctrl+C to exit.');
        return stream;
    });
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   Gardelin    6 年前

    我通过在使用时添加一些选项来修复此问题 tmp 图书馆我指定临时文件夹的位置及其权限,而不是默认选项。

    因此,与此相反:

    let tmp = Tmp.fileSync();
    

    我做到了:

    let tmp = Tmp.fileSync({ 
        // Use settings from .env if defined 
        dir: process.env.MY_TMP_DIR || ''
        mode: process.env.MY_TMP_MODE || '', 
        prefix: process.env.MY_TMP_PREFIX || '', 
    });