node pkg 打包 的笔记

文章介绍了如何使用pkg@5.8.1和pkg@4.5.1版本打包Node应用,以及遇到的支持x86平台的问题。在更换应用图标和修改部分应用信息时,作者提到了resource_hacker的限制,并提供了使用resedit模块的解决方案。对于隐藏Windows中的终端窗口,文章探讨了几种方法,包括修改Subsystem和使用create-node-w-exe。此外,作者还尝试了pkgx进行打包,发现它能减小文件大小但无法修改图标,并对pkgx的可靠性提出疑问。
摘要由CSDN通过智能技术生成

打包应用

我是用的版本是 pkg@5.8.1。打包部分没啥好记录的,网上分享的帖子都很详尽了。只记录些没怎么看到别人写的:

  1. 如果要支持 x86,要使用 pkg@4.5.1 。而pkg-fetch的二进制文件版本为 2.6
  2. 如果使用pkg@4.5.1 配合 pkg-fetch@2.6,会有些问题。
    1. node 最高支持到14.4,需要注意调用函数是否可用。比如 child_process 的 spawn 事件就是在后续版本才更新的
    2. 由于-C 压缩参数在后续版本才引入,这个版本打包(node14)的执行文件在75MB左右,比5.8.1的60M大许多。

更换图标和部分应用信息

之前通过resource_hacker可以很愉快的修改图标,但是这次,在我这行不通吗,修改完后直接运行报错。

pkg: Error reading from file

这似乎是一个很早就在讨论且一直没解决的问题,经过一番尝试后,我用的时一下方法。

  1. 生成图标
    可以在网站https://icoconvert.com/上生成需要的 icon。尺寸需要选中 16x16, 32x32, 48x48, 64x64 and 128x12 .
  2. 替换图标和部分应用信息
    1. 安装resedit
      npm install -D resedit@1.7
      
    2. 代码
'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中,正常打包后运行,会出现终端窗口。

解决思路大概分为几种:

  1. 引入vbs、powershell 作为启动脚本
    这个方法有些缺点,比如
    • 用户可能没有权限运行脚本
    • 运行脚本也会闪终端窗口
    • 多一个启动脚本
  2. 修改 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]进行打包,简单记录下。

  1. 打包win的代码后的文件极小,75Mb=>16MB。这应该归功于pkgx项目中自己编译的 pkgx-win-x86.exe
  2. 和说明的一致,无虚拟文件系统,这意味着如果不能打包到代码里面的资产文件,只能复制到执行文件的同目录下。
  3. 修改程序icon失败,配置中的 -ri 不生效,resource_hacker同样无法修改。应该是pkgx-win-x86.exe本身就缺少icon。
  4. 前文中隐藏终端窗口(create-nodew-exe)依然可用。
  5. pkgx 并没有开源 pkgx-win-x86.exe 的代码,不确定是否可靠。

原文地址

https://bjun.tech/blog/xphp/225

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要安装和打包Node.js的软件包(pkg),您可以按照以下步骤进行操作: 1. 首先,确保您已经在您的系统上安装了Node.js。您可以在终端或命令提示符中输入以下命令来检查Node.js的版本: ``` node --version ``` 如果显示了Node.js的版本号,则表示已经安装。 2. 接下来,您需要安装 `pkg` 运行时。可以使用以下命令进行全局安装: ``` npm install -g pkg ``` 3. 创建一个目录,并在该目录中创建一个 `package.json` 文件。您可以使用以下命令创建 `package.json` 文件: ``` npm init ``` 您可以根据提示输入相关信息,或者直接按回车键接受默认值。 4. 在 `package.json` 文件中添加一个脚本,用于打包您的应用程序。打开 `package.json` 文件,并在 `"scripts"` 字段中添加以下内容: ```json "scripts": { "build": "pkg your-app.js --output your-app" } ``` 替换 `your-app.js` 为您的应用程序的入口文件的路径。 5. 接下来,您可以使用以下命令来运行打包过程: ``` npm run build ``` 这将使用 `pkg` 工具将您的应用程序打包到可执行文件中。 6. 打包完成后,您将在当前目录中找到一个名为 `your-app` 的可执行文件。您可以使用以下命令来运行您的应用程序: ``` ./your-app ``` 这样,您就可以安装和打包Node.js应用程序了。请注意,这些步骤假设您已经在您的系统上正确安装了Node.js和npm。如果遇到任何问题,请参考相关文档或在社区寻求帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值