我用node webkit创建了一个小应用程序。预包装,它工作正常。但是在我将其压缩并将其添加到node-webkit.app中的Contents / Resources之后,我在运行应用程序时遇到错误。它打开很好,但它的任务涉及子进程,我得到这个错误:
未捕获的node.js错误 错误:产生ENOENT。
我猜这可能与此问题中提出的问题有关:Node-Webkit Child Process Exec
因为我的子进程正在调用pdftk,这是一个单独的命令行程序。最终,我想安装pdftk作为我的应用程序的一部分 - 我无法弄清楚如何做到这一点。我尝试将其作为要与应用程序的其余部分压缩的内容之一,但这导致应用程序在启动后立即崩溃(它将打开一个具有正确标题但没有内容的窗口,这将立即关闭)。 / p>
所以,主要问题是,如何将pdftk作为打包的node-webkit应用程序的一部分进行安装,以便只需双击图标而不是使用命令行即可启动应用程序?谢谢你的帮助。
答案 0 :(得分:4)
我假设您的代码是通过node-webkit的node-main入口点执行的:https://github.com/rogerwang/node-webkit/wiki/Node-main
如果任何 异常在您的应用程序中未被捕获,那么将崩溃。
可悲的是,目前用于获取crashdumps的破解功能在OSX上无效:https://github.com/rogerwang/node-webkit/issues/2518
将代码包装在try / catches中以防止崩溃并获取崩溃发生原因的信息。
try {
the_child_process = child_process.spawn(pathToBin, args);
} catch (err) {
global.console.log( "Error while trying to start child process: " + JSON.stringify(err) );
}
这是针对您正在经历的追踪问题真正原因的情况的一般建议。
涉及到一些事情。
这应该是自我解释的 - 但有一点需要注意,这给我带来了一些麻烦: 确保通过
chmod 755
将二进制文件标记为可执行文件。如果你正在使用grunt,你可能会喜欢grunt-chmod。 现在您的二进制文件是应用程序包的一部分,您可以通过了解绝对路径来执行它们。
即使在打包时也会在运行时解析二进制文件的路径。假设您的工具是多平台的,下面的代码是我为当前平台选择正确的二进制文件的解决方案。此外,它假定您的二进制文件是以某种文件夹结构排序的。或者,在构建过程中选择正确的二进制文件,并始终使用相同的路径。
var arch = process.arch;
var platform = process.platform;
// this will return the root path of your app-package at runtime
var rootDir = process.cwd();
var isWin = false;
var execPath = rootDir;
// some base path is appended
execPath = path.join(execPath, 'path', 'to', 'bin');
// select folder for current platform
switch (platform) {
case 'darwin':
execPath = path.join(execPath, 'mac');
break;
case 'linux':
execPath = path.join(execPath, 'lin');
break;
case 'win32':
execPath = path.join(execPath, 'win');
isWin = true;
break;
default:
global.console.log("unsupported platform: " + platform);
return null;
}
// select folder for current processor architecture
switch (arch) {
case 'ia32':
execPath = path.join(execPath, 'x86');
break;
case 'x64':
execPath = path.join(execPath, 'x64');
break;
default:
global.console.log("unsupported architecture: " + arch);
return null;
}
// add executable filename
execPath = path.join(execPath, 'node');
if (isWin) {
execPath = execPath + ".exe";
}
global.console.log("Path to your binary: " + execPath);
return execPath;
最终解析作为参数提供给二进制文件的路径。这也有点令人困惑,因为所有路径都被视为相对于应用程序包的根路径。我的节点主文件驻留在我的应用程序包中的一个文件夹中,所以我认为我应该从那里引用相对文件,但事实并非如此。
app package root
|--- package.json <- node-webkit package.json
|
|--- client <- here my sources for the frontend reside
|
|--- server
|----|--- node_modules <- server runtime dependencies
|----|--- src <- server source code
|----|----|--- server.js <- this is my node server file to execute via node
|
|--- node-webkit <- node webkit code and dependencies
|----|--- bin <- a directory with my deployed binaries
|----|--- node-main.js <- this is my node main file
要使用我的服务器文件调用节点二进制文件,以下行导致成功:
child_process.spawn(absPathToNodeBin, "server/src/server.js");
答案 1 :(得分:0)
这是我的经历:
var child_process = nw.require('child_process');
//exec var exec = child_process.exec; var ret = exec('cat *');
//spawn var sp = child_process.spawn; var sr = sp('cat *');