如何从打包的 Electron 应用程序中 运行 可执行文件
How to run executable file from packaged Electron app
我正在使用 Electron 构建一个应用程序,其中有一些可执行文件 运行 当 运行ning npm start
从终端使用 [=26= 中的子进程时就可以了].但是,当用 electron-builder 打包时,我的应用程序找不到可执行文件。我已经阅读了很多相关帖子并且 none 回答了我的问题。
这里的解决方案https://github.com/sindresorhus/fix-path没有解决我的问题。
这是我的代码
function updateCourses(platform){
const fixPath = require('fix-path');
alert(process.env.PATH);
fixPath(); //This is the package but does not resolve my issue
alert(process.env.PATH);
const path=require('path');
var fs = require("fs");
var mysql=require("mysql");
// /Applications/mooc-platform.app/
alert(__dirname);
const { exec } = require('child_process');
var run="./../../Users/thanasis/Desktop/mooc-platform\ Mac/scrape_"+String(platform);
exec(run,(error, stdout, stderr) => {
if (error) {
alert(`exec error: ${error}`);
alert(`Something wrong happened: ${stdout}`);
alert(`stderr: ${stderr}`);
return;
}
else{
alert(platform+" courses downloaded");
alert("Updating database");
var con=mysql.createConnection({
host: "localhost",
user: "root",
password: "simple1234",
database: "moocs"
});
var v=false;
con.connect(function(err){
if(err) throw err;
console.log("Connected!");
platform=String(platform);
var num = fs.readFileSync("../../Users/thanasis/Desktop/mooc-platform\ Mac/courses/"+platform+"/numofcourses.txt");
num=parseInt(num,10);
let plat=platform;
for(i=0; i<num; i++){
pth="../../Users/thanasis/Desktop/mooc-platform\ Mac/courses/"+platform+"/course"+i.toString()+".json";
var content = fs.readFileSync(pth);
var object = JSON.parse(content);
String.prototype.setCharAt = function(index,chr) {
if(index > this.length-1) return str;
return this.substr(0,index) + chr + this.substr(index+1);
}
var ti=String(object.title);
ti=ti.replace(/'/g,'i');
sql="INSERT INTO courses (name) VALUES('"+ti+"') ON DUPLICATE KEY UPDATE hits=0";
con.query(sql,function(err,result){
if(err) throw err;
console.log(result);
});
// con.query('DELETE FROM courses',function(err,result){
// if(err) throw(err);
// console.log(result);
// });
}
v=true;
con.end(function(err,result){
if(err) throw err;
if(!alert("Updated")){
window.location.href="load_courses.html";
}
});
});
}
});
}
最理想的情况是 运行 从应用程序文件夹(在 Mac 中)没有问题。
如有任何帮助,我们将不胜感激。
假设您将应用打包为 asar:
你所有的路径都是相对于你的文件的。因此,一旦此文件更改其位置,路径将不再有效。
用 asar 打包更改
C:\myApp\scripts\main.js
到
C:\myApp\resources\myAppName.asar\scripts\main.js
因此无法从那里找到您的文件。
有几个选项。例如:
将所有可执行文件和文本文件放入 asar。
好处:您可以将它们与您的应用程序一起分发。缺点:应用程序可能
变大,这不适用于所有可执行文件,因为有些人可能
需要自己依赖。
以某种方式确定当前机器上的绝对路径(我没有
macOS 的想法。在 Windows 上,我读取了注册表并提取了我的路径
从那里需要。)
如果打包或不打包,请提供不同的路径,例如
electron-is-running-in-asar
包.
我正在使用 Electron 构建一个应用程序,其中有一些可执行文件 运行 当 运行ning npm start
从终端使用 [=26= 中的子进程时就可以了].但是,当用 electron-builder 打包时,我的应用程序找不到可执行文件。我已经阅读了很多相关帖子并且 none 回答了我的问题。
这里的解决方案https://github.com/sindresorhus/fix-path没有解决我的问题。
这是我的代码
function updateCourses(platform){
const fixPath = require('fix-path');
alert(process.env.PATH);
fixPath(); //This is the package but does not resolve my issue
alert(process.env.PATH);
const path=require('path');
var fs = require("fs");
var mysql=require("mysql");
// /Applications/mooc-platform.app/
alert(__dirname);
const { exec } = require('child_process');
var run="./../../Users/thanasis/Desktop/mooc-platform\ Mac/scrape_"+String(platform);
exec(run,(error, stdout, stderr) => {
if (error) {
alert(`exec error: ${error}`);
alert(`Something wrong happened: ${stdout}`);
alert(`stderr: ${stderr}`);
return;
}
else{
alert(platform+" courses downloaded");
alert("Updating database");
var con=mysql.createConnection({
host: "localhost",
user: "root",
password: "simple1234",
database: "moocs"
});
var v=false;
con.connect(function(err){
if(err) throw err;
console.log("Connected!");
platform=String(platform);
var num = fs.readFileSync("../../Users/thanasis/Desktop/mooc-platform\ Mac/courses/"+platform+"/numofcourses.txt");
num=parseInt(num,10);
let plat=platform;
for(i=0; i<num; i++){
pth="../../Users/thanasis/Desktop/mooc-platform\ Mac/courses/"+platform+"/course"+i.toString()+".json";
var content = fs.readFileSync(pth);
var object = JSON.parse(content);
String.prototype.setCharAt = function(index,chr) {
if(index > this.length-1) return str;
return this.substr(0,index) + chr + this.substr(index+1);
}
var ti=String(object.title);
ti=ti.replace(/'/g,'i');
sql="INSERT INTO courses (name) VALUES('"+ti+"') ON DUPLICATE KEY UPDATE hits=0";
con.query(sql,function(err,result){
if(err) throw err;
console.log(result);
});
// con.query('DELETE FROM courses',function(err,result){
// if(err) throw(err);
// console.log(result);
// });
}
v=true;
con.end(function(err,result){
if(err) throw err;
if(!alert("Updated")){
window.location.href="load_courses.html";
}
});
});
}
});
}
最理想的情况是 运行 从应用程序文件夹(在 Mac 中)没有问题。
如有任何帮助,我们将不胜感激。
假设您将应用打包为 asar:
你所有的路径都是相对于你的文件的。因此,一旦此文件更改其位置,路径将不再有效。
用 asar 打包更改
C:\myApp\scripts\main.js
到
C:\myApp\resources\myAppName.asar\scripts\main.js
因此无法从那里找到您的文件。
有几个选项。例如:
将所有可执行文件和文本文件放入 asar。 好处:您可以将它们与您的应用程序一起分发。缺点:应用程序可能 变大,这不适用于所有可执行文件,因为有些人可能 需要自己依赖。
以某种方式确定当前机器上的绝对路径(我没有 macOS 的想法。在 Windows 上,我读取了注册表并提取了我的路径 从那里需要。)
如果打包或不打包,请提供不同的路径,例如
electron-is-running-in-asar
包.