如何在Cordova中使用Electron平台执行Bash命令

xtfmy6hx  于 2022-11-15  发布在  Electron
关注(0)|答案(1)|浏览(223)

我正在尝试使用Cordova(现在包括Electron)创建Linux桌面应用程序。
我需要一个触发shell命令的按钮:

const exec = require('child_process').exec

document.querySelector('button').onclick = () =>
  exec('ls -la', (err, stdout, stderr) => {
    console.log(stdout)
  })

Electron将Chromium与Node.js集成在一起,但在 cordova 默认被禁用。激活后,我得到以下错误:

Uncaught ReferenceError: require is not defined

注意:这个简单的按钮单击示例在Electron Quick Example上运行良好,但当我尝试使用Cordova + Electron require is not defined执行相同操作时
是否需要配置额外的参数和/或在不同的作用域中执行index.js
任何帮助都将非常感激:)

t8e9dugd

t8e9dugd1#

没有直接的方法。只有在没有Cordova的情况下使用Electron才有可能。您需要在您的Electron的main.js中要求“child_process”。Cordova会自动生成此文件,并且可能会在您更新版本时更新它。您可以手动将上述代码添加到"www\cdv-electron-main.js""platform_www\cdv-electron-main.js"中,或者您可以设置一个Cordova挂钩。例如,一个before_run挂钩:

<platform name="electron">
    <hook type="before_run" src="hooks/beforeRun.js" />
</platform>

在beforeRun.js文件中添加以下代码:

const fs = require('fs');
const util = require('util');
const path = require('path');

module.exports = function(ctx) {
    // Make sure electron platform is part of build
    if (!ctx.opts.platforms.includes('electron')) return;

    const platformRoot = path.join(ctx.opts.projectRoot, 'platforms/electron');
    
    const main1 = path.join(platformRoot, 'www/cdv-electron-main.js');
    const main2 = path.join(platformRoot, 'platform_www/cdv-electron-main.js');

    const extra = "const electron = require('child_process');" +
          "document.querySelector('button').onclick = () =>\n" +
               "  exec('ls -la', (err, stdout, stderr) => {\n" +
                                   "    console.log(stdout)\n" +
                                                         "  })";

    fs.appendFile(main1, extra, function (err) {
        if (err) throw err;
        console.log('Saved!');
    });
    fs.appendFile(main2, extra, function (err) {
        if (err) throw err;
        console.log('Saved!');
    });
};

这将把你的常量和单击函数添加到电子的主JS文件中。你可能需要在每次运行前清除,因为钩子会把上面的代码多次添加到文件的末尾。如果需要,你可以设置一个检查器值来防止这种情况。

相关问题