简体   繁体   English

电子包装器产生 ENOENT

[英]electron-packager spawn ENOENT

I'm working on an electron app that controls gulp tasks via gui.我正在开发一个 electron 应用程序,该应用程序通过 gui 控制 gulp 任务。 You click on a task and it runs.您单击一个任务,它就会运行。 Pretty simple stuff.很简单的东西。 On macOS, when I run npm start it runs just fine, but when I package it with electron-packager, I get this error:在 macOS 上,当我运行 npm 启动时它运行得很好,但是当我使用电子打包器 package 它时,我收到了这个错误:

Uncaught Exception:
Error: spawn gulp ENOENT
    at exports._errnoException (util.js:1022:11)
    at Process.ChildProcess._handle.onexit (internal/child_process.js:193:32)
    at onErrorNT (internal/child_process.js:359:16)
    at _combinedTickCallback (internal/process/next_tick.js:74:11)
    at process._tickCallback (internal/process/next_tick.js:98:9)

This is the code:这是代码:

exports.runTask = (taskName, projPath) => {
    const cp = spawn('gulp', [ taskName ], {cwd: projPath});
    cp.stdout.setEncoding('utf8');
    cp.stdout.on('data', data => {
        console.log(data);
        mainWindow.webContents.send('task-console-data', data);
    });

    cp.stderr.setEncoding('utf8');
    cp.stderr.on('data', data => {
        console.error(data);
        displayNotification({text: `[error] ${data}`});
        mainWindow.webContents.send('task-console-data', `[error] ${data}`);
    });

    cp.on('exit', code => {
        if (code === 0) {
          displayNotification({
            title: 'gulp',
            subtitle: 'Finished running tasks'
          });
        } else if ( !code || code === null ) {
            return;
        } else {
            console.error(`Exited with error code ${code}`);

            displayNotification({
                title: 'gulp',
                subtitle: `Exited with error code ${code}`,
                sound: 'Basso'
            });
        }
    });
};

In case anyone else is running into this problem, the answer is to correct the $PATH.如果其他人遇到此问题,答案是更正 $PATH。 There is a package on npm that does this for you. npm 上有一个 package 可以为您执行此操作。

https://www.npmjs.com/package/fix-path https://www.npmjs.com/package/fix-path

You should forward the process.env.PATH to the spawn options because the child process environment variables is overriding in options.env .您应该将process.env.PATH转发到 spawn 选项,因为child process环境变量在options.env中被覆盖。 So the OS don't know exactly where to look your command gulp .所以操作系统不知道在哪里查看你的命令gulp

So you can do this:所以你可以这样做:

const cp = spawn('gulp', [ taskName ], {
    cwd: projPath,
    env: {
        PATH: process.env.PATH,
    },
});

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM