python - 使用 angular-electron 打包可执行二进制文件
问题描述
我正在尝试在 Linux 上使用 angular-electron 打包一个 python 二进制可执行文件。我从堆栈溢出中遵循了这个答案。 将预编译的二进制文件捆绑到电子应用程序中。
在 main.ts 中,我编写了这个额外的代码片段。我已将可执行二进制文件放在 node_modules/datapod/datapod 中,并将此路径符号链接到 node_modules/.bin/ 文件夹中。
const spawn = require('child_process').spawn;
var appRootDir = require('app-root-dir').get();
var datapodpath=appRootDir+'/node_modules/datapod/datapod';
console.log(datapodpath)
const datapod = spawn(datapodpath, [], {}); //add whatever switches you need here
datapod.stdout.on( 'data', data => {
console.log( `stdout: ${data}` );
});
datapod.stderr.on( 'data', data => {
console.log( `stderr: ${data}` );
})
datapod.on( 'close', code => {
console.log( `child process exited with code ${code}` );
})
当我这样做时,一切都很好
npm 开始
我还可以看到 python 应用程序的日志。当我做 ,
npm 运行电子:linux
应用程序使用二进制文件成功编译(因为使用二进制文件编译的应用程序的大小正好等于裸角应用程序 + 二进制文件的大小)。当我尝试运行这个编译的应用程序时,它失败并出现以下错误。
更新:我尝试了另一种方法,但仍然没有结果。我创建了一个新文件夹 externals/bin 并在此文件夹中复制了可执行二进制文件“datapod”。要将此文件夹复制到打包的应用程序中,请将这些行添加到 electron-builder.js
"files": [
"**/*",
"!**/*.ts",
"!*.code-workspace",
"!LICENSE.md",
"!package.json",
"!package-lock.json",
"!src/",
"!e2e/",
"!hooks/",
"!angular.json",
"!_config.yml",
"!karma.conf.js",
"!tsconfig.json",
"!tslint.json",
"externals/bin"
],
在 main.ts 文件中编辑了我的代码
const appPath = process.env.NODE_ENV === 'production' ? process.resourcesPath : __dirname;
const execPath =path.join(appPath, 'externals/bin/datapod');
console.log(execPath)
编译成功,当我尝试运行这个应用程序时,我得到了同样的错误。我在 /tmp/.moun-angular***/resources/app.asar 中解压了应用程序
npx asar extract /tmp/.mount_angulaG6ARST/resources/app.asar extrractedApp
该文件夹的内容确实有 externals/bin/datapod 文件但无法运行。
解决方案
将此代码段添加到您的 electron-builder.json 中。
"extraResources": [
{
"from": "src/bin",
"to": "bin",
"filter": "**/*"
}
],
在生产的这一点上,文件将被复制到应用程序的根 bin 文件夹中。下面是我创建的一个函数,用于在开发和生产模式下执行文件。
const root = process.cwd();
getBinaryPath(binaryName: string) {
const binariesPath = this.isProduction() ? path.join(root, 'resources', 'bin') : path.join(root, 'src', 'bin');
return path.resolve(path.join(binariesPath, binaryName));
}
推荐阅读
- vba - 使用 VBA 在 Word 中创建另一个范围对象的副本
- python - 如何从 pandas df 制作这样的图表?
- php - 避免重复 Stripos() PHP
- javascript - 如何从 Firebase 地图对象获取数据?
- html - javascript中数字字符串的词法比较
- amazon-web-services - “长时间”运行上传失败,403 禁止使用预签名 URL
- python-3.x - sphinx, rinohtype:每节后的分页符
- javascript - 使用 Ramda 将函数列表应用于参数列表
- azure-data-factory - Azure 逻辑应用错误:响应不是 JSON 格式
- c - 编译图