在构建 Electron.js 项目时,如何修复根目录之间的差异?
How can I fix the discrepancy between root directories when building an Electron.js project?
当 运行 我的 Electron 项目正常时,如 electron ./artist-test-kit-main.js
,一切正常。当我将项目构建为可执行文件时,尝试加载文件开始失败,例如:Uncaught Error: ENOENT: no such file or directory, open 'asset-editor\data.json'
所以我 运行 进行测试以查看根目录与正常(electron ./artist-test-kit-main.js
) 执行和 .exe 的。
在 index.js
中(由 [=17= 启动],由 artist-test-kit-main.js
启动,这是一个标准的 electron.js 发起程序文件):
console.log(fs.readdirSync('./'))
在 .exe
中输出:
在正常的开发执行中(electron ./artist-test-kit-main.js
),输出:
这个普通的项目根目录,打包后存放在.exe
执行根目录下看到的resources
目录下。所以现在我所有的文件读取似乎都被破坏了,因为根目录中的这种差异。
我该如何解决这个问题?
我的 package.json
显示了使用的构建参数:
{
"name": "app",
"version": "1.0.0",
"description": "",
"main": "artist-test-kit-main.js",
"dependencies": {
...
},
"scripts": {
"start": "electron .",
"start-artist": "electron ./artist-test-kit-main.js",
"build": "electron-packager ./ game --platform=win32 --arch=x64 --overwrite=true",
"build-art": "electron-packager ./ asset-editor --platform=win32 --arch=x64 --overwrite=true"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"electron-packager": "^15.4.0"
}
}
TLDR
使用__dirname
代替.
说明
.
指的是当前工作目录(cwd),也就是node进程启动的目录
对于未打包的应用程序,这通常是项目的根文件夹,可产生预期的结果。对于打包的应用程序,cwd 可能是存储 Electron 可执行文件的位置。应用程序的内容(以前是根文件夹)放在相对于可执行文件的 resources/app
或 resources/app.asar
内。
统一打包和未打包场景的方法是使用__dirname
,其中包含当前运行个Node脚本的目录。这样,它将与在未打包的应用程序中使用 .
相同,但将 return 打包场景中带有 resources/app
的路径,因为这就是当前 运行节点脚本。
这就是为什么您会经常看到人们使用 `file://${__dirname}/assets/index.html`
之类的东西在 Electron 中寻址文件的原因。
旁注
如果您使用 require('./file.js')
,路径是相对于调用脚本的位置进行评估的,并且将像您使用 __dirname
.
一样工作
当 运行 我的 Electron 项目正常时,如 electron ./artist-test-kit-main.js
,一切正常。当我将项目构建为可执行文件时,尝试加载文件开始失败,例如:Uncaught Error: ENOENT: no such file or directory, open 'asset-editor\data.json'
所以我 运行 进行测试以查看根目录与正常(electron ./artist-test-kit-main.js
) 执行和 .exe 的。
在 index.js
中(由 [=17= 启动],由 artist-test-kit-main.js
启动,这是一个标准的 electron.js 发起程序文件):
console.log(fs.readdirSync('./'))
在 .exe
中输出:
在正常的开发执行中(electron ./artist-test-kit-main.js
),输出:
这个普通的项目根目录,打包后存放在.exe
执行根目录下看到的resources
目录下。所以现在我所有的文件读取似乎都被破坏了,因为根目录中的这种差异。
我该如何解决这个问题?
我的 package.json
显示了使用的构建参数:
{
"name": "app",
"version": "1.0.0",
"description": "",
"main": "artist-test-kit-main.js",
"dependencies": {
...
},
"scripts": {
"start": "electron .",
"start-artist": "electron ./artist-test-kit-main.js",
"build": "electron-packager ./ game --platform=win32 --arch=x64 --overwrite=true",
"build-art": "electron-packager ./ asset-editor --platform=win32 --arch=x64 --overwrite=true"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"electron-packager": "^15.4.0"
}
}
TLDR
使用__dirname
代替.
说明
.
指的是当前工作目录(cwd),也就是node进程启动的目录
对于未打包的应用程序,这通常是项目的根文件夹,可产生预期的结果。对于打包的应用程序,cwd 可能是存储 Electron 可执行文件的位置。应用程序的内容(以前是根文件夹)放在相对于可执行文件的 resources/app
或 resources/app.asar
内。
统一打包和未打包场景的方法是使用__dirname
,其中包含当前运行个Node脚本的目录。这样,它将与在未打包的应用程序中使用 .
相同,但将 return 打包场景中带有 resources/app
的路径,因为这就是当前 运行节点脚本。
这就是为什么您会经常看到人们使用 `file://${__dirname}/assets/index.html`
之类的东西在 Electron 中寻址文件的原因。
旁注
如果您使用 require('./file.js')
,路径是相对于调用脚本的位置进行评估的,并且将像您使用 __dirname
.