目录

在github-action工作流使用nw和nw-builder打包

在github action工作流使用nw和nw-builder打包

前言

经过vite打包后生成html等的文件,虽然可以运行,突然想把打包成exe文件

可以使用electron,笔者在网上搜索了一下,居然有个东西交nw,也可以进行打包,

既然如此,好好好,使用一下工作流。

参考文章

[十分钟轻松入门 nw.js 实现桌面应用程序-CSDN博客

https://csdnimg.cn/release/blog_editor_html/release2.3.8/ckeditor/plugins/CsdnLink/icons/icon-default.png?t=P1C7 “十分钟轻松入门 nw.js 实现桌面应用程序-CSDN博客”) [使用 nw-builder 构建跨平台桌面应用程序 - axl234 - 博客园

https://csdnimg.cn/release/blog_editor_html/release2.3.8/ckeditor/plugins/CsdnLink/icons/icon-default.png?t=P1C7 “使用 nw-builder 构建跨平台桌面应用程序 - axl234 - 博客园”) [nw-builder - npm

https://csdnimg.cn/release/blog_editor_html/release2.3.8/ckeditor/plugins/CsdnLink/icons/icon-default.png?t=P1C7 “nw-builder - npm”)

正文

本地打包

安装

笔者在本地使用pnpm

pnpm add -g nw nw-builder

一个不必要的bug

安装nw后,按道理来说,

运行如下命令

nw -v

就可以出现一个窗口。

但是

运行上面的命令。出现的内容如下

➜ nw -v
Error: spawn C:\Users\26644\AppData\Local\pnpm\global\5pnpm\nw@0.96.0\node_modules\nw\nwjs-v0.96.0-win-x64\nw.exe ENOENT
    at ChildProcess._handle.onexit (node:internal/child_process:286:19)
    at onErrorNT (node:internal/child_process:484:16)
    at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
  errno: -4058,
  code: 'ENOENT',
  syscall: 'spawn C:\\Users\\26644\\AppData\\Local\\pnpm\\global\\5\pnpm\\nw@0.96.0\\node_modules\\nw\\nwjs-v0.96.0-win-x64\\nw.exe',
  path: 'C:\\Users\\26644\\AppData\\Local\\pnpm\\global\\5\pnpm\\nw@0.96.0\\node_modules\\nw\\nwjs-v0.96.0-win-x64\\nw.exe',
  spawnargs: [ '-v' ]
}
node:internal/modules/run_main:104
    triggerUncaughtException(
    ^

Error: spawn C:\Users\26644\AppData\Local\pnpm\global\5pnpm\nw@0.96.0\node_modules\nw\nwjs-v0.96.0-win-x64\nw.exe ENOENT
    at ChildProcess._handle.onexit (node:internal/child_process:286:19)
    at onErrorNT (node:internal/child_process:484:16)
    at process.processTicksAndRejections (node:internal/process/task_queues:90:21) {
  errno: -4058,
  code: 'ENOENT',
  syscall: 'spawn C:\\Users\\26644\\AppData\\Local\\pnpm\\global\\5\pnpm\\nw@0.96.0\\node_modules\\nw\\nwjs-v0.96.0-win-x64\\nw.exe',
  path: 'C:\\Users\\26644\\AppData\\Local\\pnpm\\global\\5\pnpm\\nw@0.96.0\\node_modules\\nw\\nwjs-v0.96.0-win-x64\\nw.exe',
  spawnargs: [ '-v' ]
}

Node.js v23.7.0

报错了,经过deepseek的回答,它判断是否有nw.exe文件?

即下面这个目录的存在

C:\\Users\\26644\\AppData\\Local\\pnpm\\global\\5\pnpm\\nw@0.96.0\\node_modules\\nw\\nwjs-v0.96.0-win-x64\\nw.exe

我打开目录。

https://i-blog.csdnimg.cn/direct/373d4c5cd4934a43a092b85111426449.png

没有nwjs-v0.96.0-win-x6目录了。然后,笔者发现这里面既有src,又有node_modes,难道这是个项目,因此。笔者打开package.json,在script中,发现了一个脚本postinstall

https://i-blog.csdnimg.cn/direct/fee8a458f25843ffad3c338b4db01c64.png

猜测这个postinstall脚本的意思是

post 请求进行install

意思就是发送一个post请求,进行安装,笔者尝试了一下

https://i-blog.csdnimg.cn/direct/d4c5974869cd4223995c79b963bd6ae1.png

虽然报错了, 但是,查看目录

https://i-blog.csdnimg.cn/direct/81803a70f5a048eaa29061d0f04699f2.png

感觉有了。

再次刚开始的目录下运行 nw -v

结果如下

https://i-blog.csdnimg.cn/direct/fb673fb62d0944aa8a111c429cfd2c22.png

运行成功。

准备打包

笔者通过vite打包生成的目录如下,

https://i-blog.csdnimg.cn/direct/7f30dee3790e4af29af9c26079ec785d.png

可惜没有一个关键的东西,需要在01-dist目录下新建一个package.json,才能运行。感觉很麻烦。

但是,笔者突然想到 只要在publice目录下写下package.json,打包之后不就有package.json 了。

https://i-blog.csdnimg.cn/direct/0ffbca2b320742e5b87b87d222b3292e.png

先public目录下新建一个package.json文件,内容如下

{
  "name": "01-dist",
  "version": "1.0.0",
  "main": "index.html",
  "window": {
    "icon": "vite.svg"
  }
}

上面四点name,version,main,icon,缺一不可。

少了一个,要么无法运行,要么报错。

再次打包

https://i-blog.csdnimg.cn/direct/22fcfbde7f434d3ba79869e16f18d04b.png

完美。

运行命令

nwbuild --mode=build --glob=false --flavor=sdk --cacheDir=./node_modules/nw --outDir=../build ./

具体命令的含义可参考官网,也许可以把运行命令也写入public/package.json中

{
  "name": "01-dist",
  "main": "index.html",
  "version": "1.0.0",
  "window": {
    "icon": "vite.svg"
  },
  "scripts": {
    "build": "nwbuild --mode=build --glob=false --flavor=sdk --cacheDir=./node_modules/nw --outDir=../build ./"
  }
}

再次打包。进入01-dist目录, 运行 pnpm run build

结果如下,。

https://i-blog.csdnimg.cn/direct/e38813adfa644829883f72fc7652bf7f.png

这里就发现,好像不需要安装nw,因为nw-builder在运行的时候会自动安装nw,所以前面的bug是不必要的。

https://i-blog.csdnimg.cn/direct/af187e519e8447c0b1b7627019a525bc.png

本地安装成功,很好。

再次思考,我是通过全局nw-builder进行打包。如果不使用全局,懂了,因此

再次修改public/package.json目录,使其拥有nw-builder依赖。

最终内容如下

public/package.json

{
  "name": "01-dist",
  "main": "index.html",
  "version": "1.0.0",
  "window": {
    "icon": "vite.svg"
  },
  "dependencies": {
    "nw-builder": "^4.13.9"
  },
  "scripts": {
    "build": "nwbuild --mode=build --glob=false --flavor=sdk --cacheDir=./node_modules/nw --outDir=../build ./"
  }
}

工作流打包

流程

1、读取仓库代码

2、安装node

3、第一次打包(vite)

4、第二次打包(nw-builder)

5、上传打包结果

因此

.github/workflows/01-start.yaml文件的内容如下

name: 打包01项目
on:
  workflow_dispatch:
    inputs:
      ad:
        description: '打包'
        required: true
        default: 'true'
        type: boolean
jobs:
  build:
    runs-on: windows-latest
    steps:
      - name: 读取项目
        uses: actions/checkout@v4

      - name: 设置node版本
        uses: actions/setup-node@v4
        with:
          node-version: '22'

      - name: 安装依赖并第一次打包
        run: |
          cd 01-quick-start
          npm install
          npm run build

      - name: 第二次打包
        run: |
          cd 01-dist
          npm install
          npm run build
      - name: 上传
        uses: actions/upload-artifact@v4
        with:
          name: build
          path: build

结果如下

https://i-blog.csdnimg.cn/direct/330c415d5ed1458d95b2e8abc3802d40.png https://i-blog.csdnimg.cn/direct/a378b6de9a424bd49f976254fbb74934.png

有点大。