打包应用
我是用的版本是 pkg@5.8.1。打包部分没啥好记录的,网上分享的帖子都很详尽了。只记录些没怎么看到别人写的:
- 如果要支持 x86,要使用 pkg@4.5.1 。而pkg-fetch的二进制文件版本为 2.6
- 如果使用pkg@4.5.1 配合 pkg-fetch@2.6,会有些问题。
- node 最高支持到14.4,需要注意调用函数是否可用。比如 child_process 的 spawn 事件就是在后续版本才更新的
- 由于-C 压缩参数在后续版本才引入,这个版本打包(node14)的执行文件在75MB左右,比5.8.1的60M大许多。
更换图标和部分应用信息
之前通过resource_hacker可以很愉快的修改图标,但是这次,在我这行不通吗,修改完后直接运行报错。
pkg: Error reading from file
这似乎是一个很早就在讨论且一直没解决的问题,经过一番尝试后,我用的时一下方法。
- 生成图标
可以在网站https://icoconvert.com/上生成需要的 icon。尺寸需要选中 16x16, 32x32, 48x48, 64x64 and 128x12 . - 替换图标和部分应用信息
- 安装resedit
npm install -D resedit@1.7
- 代码
- 安装resedit
'use strict';
// copy https://github.com/vercel/pkg/issues/91#issuecomment-1287038976
const fs = require("fs");
const path = require("path");
const ResEdit = require('resedit');
function windowsPostBuild(output) {
const exe = ResEdit.NtExecutable.from(fs.readFileSync(output));
const res = ResEdit.NtExecutableResource.from(exe);
const iconFile = ResEdit.Data.IconFile.from(path.join(__dirname, 'icon.ico'));
ResEdit.Resource.IconGroupEntry.replaceIconsForResource(
res.entries,
1,
1033,
iconFile.icons.map(item => item.data)
);
const vi = ResEdit.Resource.VersionInfo.fromEntries(res.entries)[0];
vi.setStringValues(
{lang: 1033, codepage: 1200},
{
ProductName: 'You app name',
FileDescription: 'You app description',
CompanyName: 'My company',
LegalCopyright: `Copyright Me. MIT license.`
}
);
vi.removeStringValue({lang: 1033, codepage: 1200}, 'OriginalFilename');
vi.removeStringValue({lang: 1033, codepage: 1200}, 'InternalName');
vi.setFileVersion(1, 0, 0, 1033);
vi.setProductVersion(1, 0, 0, 1033);
vi.outputToResourceEntries(res.entries);
res.outputResource(exe);
fs.writeFileSync(output, Buffer.from(exe.generate()));
}
参考
https://github.com/vercel/pkg/issues/91
隐藏终端窗口
在win中,正常打包后运行,会出现终端窗口。
解决思路大概分为几种:
- 引入vbs、powershell 作为启动脚本
这个方法有些缺点,比如- 用户可能没有权限运行脚本
- 运行脚本也会闪终端窗口
- 多一个启动脚本
- 修改 exe 中的Subsystem,从 2改为3
方法有:- 有通过python 或者 editbin 修改的
- 有通过重新编译 pkg-fetch, ,在打包
我用的方法:create-nodew-exe,大概看了下源码,方法二的node实现
参考
Surprised by terminal window in macos & windows
补充
似乎直接使用pkg-exe-build也可以直接解决问题,不过没试过。
尝试 pkgx
后面尝试使用(node-pkgx)[https://github.com/irelance/node-pkgx]进行打包,简单记录下。
- 打包win的代码后的文件极小,75Mb=>16MB。这应该归功于pkgx项目中自己编译的 pkgx-win-x86.exe
- 和说明的一致,无虚拟文件系统,这意味着如果不能打包到代码里面的资产文件,只能复制到执行文件的同目录下。
- 修改程序icon失败,配置中的 -ri 不生效,resource_hacker同样无法修改。应该是pkgx-win-x86.exe本身就缺少icon。
- 前文中隐藏终端窗口(create-nodew-exe)依然可用。
- pkgx 并没有开源 pkgx-win-x86.exe 的代码,不确定是否可靠。