- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
例如,我有一个已编译的二进制 cudaDeviceQuery
,它以 JSON 形式返回设备列表。这是一段代码:
export default function cudaDeviceQuery(): Promise<CollectorResponse> {
const throwError = () => {
throw new Error("Unfortunately your platform isn't yet unsupported");
};
const file = __DARWIN__
? path.join(__dirname, 'darwin', 'cudaDeviceQuery')
: __WIN32__
? path.join(__dirname, 'win', 'cudaDeviceQuery.exe')
: throwError();
const descriptor = spawn(file);
return new Promise((resolve, reject) => {
let outerData = '';
descriptor.stdout.on('data', data => {
outerData += data;
});
descriptor.on('close', () => {
try {
resolve(JSON.parse(outerData));
} catch (e) {
reject(e);
}
});
});
}
但是当我从渲染器进程使用这个函数时 __dirname
是 /
,所以我得到 spawn/darwin/cudaDeviceQuery ENOENT
错误。在开发环境中生成它并将其打包到生产环境中的正确方法是什么?
一个 webpack 配置:
webpack.config.base.js
:
/**
* Base webpack config used across other specific configs
*/
const webpack = require('webpack');
const path = require('path');
const getReplacements = require('./app/app-info').getReplacements;
const { dependencies: externals } = require('./app/renderer/package.json');
module.exports = {
module: {
noParse: [path.join(__dirname, 'node_modules/ws')],
rules: [
{
test: /\.tsx?$/,
use: [
{
loader: 'babel-loader',
},
{
loader: 'ts-loader',
},
],
exclude: /node_modules/,
},
],
},
output: {
path: path.join(__dirname, 'app', 'renderer'),
filename: 'bundle.js',
libraryTarget: 'commonjs2',
},
// https://webpack.github.io/docs/configuration.html#resolve
resolve: {
extensions: ['.js', '.ts', '.tsx', 'json'],
modules: [path.join(__dirname, 'app', 'renderer'), 'node_modules'],
},
plugins: [new webpack.DefinePlugin(getReplacements())],
externals: [...Object.keys(externals || {}), 'ws'],
};
webpack.config.development.js
:
/**
* Build config for development process that uses Hot-Module-Replacement
* https://webpack.github.io/docs/hot-module-replacement-with-webpack.html
*/
const webpack = require('webpack');
const merge = require('webpack-merge');
const baseConfig = require('./webpack.config.base');
const getReplacements = require('./app/app-info').getReplacements;
const port = process.env.PORT || 3000;
module.exports = merge(baseConfig, {
devtool: 'inline-source-map',
entry: [
'react-hot-loader/patch',
`webpack-hot-middleware/client?path=http://localhost:${port}/__webpack_hmr&reload=true`,
'./app/renderer/index',
],
output: {
publicPath: `http://localhost:${port}/dist/`,
},
module: {
rules: [
// Css, SCSS, woff loaders are here
],
},
plugins: [
// https://webpack.github.io/docs/hot-module-replacement-with-webpack.html
new webpack.HotModuleReplacementPlugin(),
new webpack.LoaderOptionsPlugin({
debug: true,
}),
],
// https://github.com/chentsulin/webpack-target-electron-renderer#how-this-module-works
target: 'electron-renderer',
});
webpack.config.electron.js
:
/**
* Build config for electron 'Main Process' file
*/
const webpack = require('webpack');
const merge = require('webpack-merge');
const baseConfig = require('./webpack.config.base');
const getReplacements = require('./app/app-info').getReplacements;
module.exports = merge(baseConfig, {
devtool: 'source-map',
entry: ['./app/main/index.ts'],
// 'main.js' in root
output: {
path: __dirname,
filename: './app/main/main.js',
},
plugins: [
// Add source map support for stack traces in node
// https://github.com/evanw/node-source-map-support
// new webpack.BannerPlugin(
// 'require("source-map-support").install();',
// { raw: true, entryOnly: false }
// ),
],
/**
* Set target to Electron specific node.js env.
* https://github.com/chentsulin/webpack-target-electron-renderer#how-this-module-works
*/
target: 'electron-main',
/**
* Disables webpack processing of __dirname and __filename.
* If you run the bundle in node.js it falls back to these values of node.js.
* https://github.com/webpack/webpack/issues/2010
*/
node: {
__dirname: false,
__filename: false
},
});
如您所见,我正在使用开发服务器进行热模块更换,所以也许这就是原因...我有 server.js
用脚本创建服务器然后我使用它从主进程。这是 server.js
:
/**
* Setup and run the development server for Hot-Module-Replacement
* https://webpack.github.io/docs/hot-module-replacement-with-webpack.html
*/
const argv = require('minimist')(process.argv.slice(2));
const { spawn } = require('child_process');
async function createMiddleware(port, configPath) {
const express = require('express');
const webpack = require('webpack');
const webpackDevMiddleware = require('webpack-dev-middleware');
const webpackHotMiddleware = require('webpack-hot-middleware');
const config = require(configPath);
const app = express();
const compiler = webpack(config);
const PORT = process.env.PORT || port;
const wdm = webpackDevMiddleware(compiler, {
publicPath: config.output.publicPath,
stats: {
colors: true,
},
});
app.use(wdm);
app.use(webpackHotMiddleware(compiler));
const server = app.listen(PORT, serverError => {
if (serverError) {
return console.error(serverError);
}
console.log(`Listening at http://localhost:${PORT}`);
});
process.on('SIGTERM', () => {
console.log('Stopping dev server');
wdm.close();
server.close(() => {
process.exit(0);
});
});
}
createMiddleware(3000, './webpack.config.development'); // A main renderer process
createMiddleware(3010, './webpack.config.server'); // A backend for communicating between renderer and remote server
if (argv['start-hot']) {
spawn('npm', ['run', 'start-hot'], {
shell: true,
env: process.env,
stdio: 'inherit',
})
.on('close', code => process.exit(code))
.on('error', spawnError => console.error(spawnError));
}
换句话说,我需要从 Electron 渲染器进程中调用 cudaDeviceQuery
库。我正在使用 electron-builder
但没关系,我可以切换到另一个构建器。
最佳答案
有两件事。如果您在 Web 应用程序配置中设置 __dirname: true
,您将从上下文目录中获取文件的相对
路径
如果您设置 __dirname: false
,则 __dirname
将具有完整路径。
开发模式
你有两个选择
__dirname: true
并将其与os.cwd()
连接起来__dirname: false
并直接使用__dirname
生产模式
__dirname: true
并使用 os.cwd()
。__dirname: true
并使用process.resourcePath
我更喜欢 2 作为生产中的首选方法
关于node.js - 如何使用 Electron 运行和打包外部可执行文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49003829/
首先,我创建了一个标签,并使用electron-packager构建了我的应用程序: node_modules/.bin/electron-packager . MyApp --platform=wi
我正在寻找一种基于 Electron 加载页面中提供的信息来更新MAC应用程序的徽章值的方法。 我在启动时使用main.js文件中的以下代码加载页面。 function createWindow ()
我正在使用 Electron 构建一个应用程序,并使用 Electron Builder 进行打包。当运行 Electron 时,我想通过这个command line argument: --enab
我遇到一种情况,当用户安装我的 Electron 应用程序时,我实际上需要安装2个应用程序:我的应用程序+一个单独的Windows MSI,它将作为我的应用程序工件的一部分包含在内。 我是Electr
使用 Electron 生成器构建 Electron 应用程序后,我无法从dist文件夹中打开该应用程序。我确实更改了所有链接以使用path.join(__ dirname,“relative_pat
我使用Linux,并正在制作要在Windows,Mac和Linux上分发的Electron App。我想要的是我的应用程序可以自我更新-但这需要代码签名。 这是否意味着我需要同时购买Windows和M
我在 Electron 应用主程序中使用foreverjs,如下所示: const forever = require("forever-monitor"); let child = forever.
在我在 Windows 10 上运行的 electron-forge 应用程序中,没有呈现 ejs 模板,尽管没有可见错误。 我可以使用创建的应用程序重现该问题 electron-forge init
我有一个 Electron 应用程序,该应用程序可以完美运行到开发环境中,并且日志引擎可以写入文件(使用winston.js)。 该项目的结构是这样的: 当我运行 Electron 构建器来打包我的应
Electron 应用程序是使用 electron-forge webpack 模板初始化的,一切都适用于 macOS。 使用 运行开发版本时 Electron 锻造开始该应用程序在 Windows
我正在尝试将我的 Electron 应用发布到GitHub版本,但无法正常工作。 这就是我所拥有的:package.json .... "scripts": { "start": "elect
我现在使用electron-builder并设法达到事件监听器的设置和触发点,但是我认为我没有完全正确设置它,因为当我使用electron .打开应用程序时,出现以下错误: Checking for
我想要的不是排除未使用的文件,而是将使用过的文件包排除到.exe文件中 我提供了一个像 config.json 这样的文件供用户编辑一些自定义配置,然后应用程序可以读取该文件来做一些事情。所以我不希望
我想了解 Signal Desktop 或 Visual Studio Code 等 Electron 桌面应用程序正在使用哪个版本的 Electron。有没有简单的方法——比如在开发控制台中输入命令
我有一个Electron我想在其中引入并行发布 channel 的应用程序:stable、next(用于早期采用者)和dev(用于测试最新版本)。 这些都会有一个分支,新功能首先出现在 dev 中,然
我是 Electron 新手,我想在主窗口中运行非 Electron 可执行文件。可以这样做吗? 这是我的代码: mainWindow = new BrowserWindow({width: 860,
我开始使用 GitHub 按需培训学习 Electron。当我执行以下命令时。系统抛出错误。 electron % electron-forge init electron-app ⚠ Could n
在我的 Electron 应用程序中,我使用“electron-json-storage”模块在本地存储一些设置数据。 但是,为了访问这些数据,我必须先找到本地路径。 为此,我正在使用 app.get
最近开始接触 Electron 。任何人都可以帮助我选择数据库。似乎没有直接的选择。 建议中型项目的数据库。 最佳答案 在 Electron 应用程序中,您可以使用您选择的数据库: https://g
我是Electron的新手,无法找到应用程序菜单的工作示例。 尝试将Quick Start应用程序与Electron文档的Class: Menu页面中的示例结合使用时,似乎什么都没发生-更改label
我是一名优秀的程序员,十分优秀!