FFBox icon indicating copy to clipboard operation
FFBox copied to clipboard

[Bugs] ArchLinux 下编译的问题

Open zxp19821005 opened this issue 11 months ago • 1 comments

如题。我已经将软件移植到了ArchLinux的AUR (https://aur.archlinux.org/packages/ffbox) ,3.x版本运行正常,但4.0版本编译成功但无法运行。 PKGBUILD 文件内容:

# Maintainer: zxp19821005 <zxp19821005 at 163 dot com>
pkgname=ffbox
_pkgname=FFBox
pkgver=4.0
_electronversion=24
_nodeversion=16
pkgrel=1
pkgdesc="An user-friendly ffmpeg GUI.一个多媒体转码百宝箱/一个 FFmpeg 的套壳"
arch=('x86_64')
url="https://github.com/ttqftech/FFBox"
license=('LicenseRef-custom')
conflicts=("${pkgname}")
depends=(
    "electron${_electronversion}-bin"
    'ffmpeg'
)
makedepends=(
    'gendesk'
    'yarn'
    'npm'
    'nvm'
    'git'
)
source=(
    "${pkgname}.git::git+${url}.git#tag=v${pkgver}"
    "${pkgname}.sh"
)
sha256sums=('99497d0fe95a663951baa9a189343222078208d90e22eeaaa4d0d0408fb6c055'
            '0c7b4041ba449cb35cb5cb23503be164af78e85572dda2d8db0ae3dc7fa2629c')
_ensure_local_nvm() {
    export NVM_DIR="${srcdir}/.nvm"
    source /usr/share/nvm/init-nvm.sh || [[ $? != 1 ]]
    nvm install "${_nodeversion}"
    nvm use "${_nodeversion}"
}
build() {
    sed -e "s|@electronversion@|${_electronversion}|" \
        -e "s|@appname@|${pkgname}|g" \
        -e "s|@runname@|app|g" \
        -e "s|@options@||g" \
        -i "${srcdir}/${pkgname}.sh"
    _ensure_local_nvm
    gendesk -f -n -q --categories="AudioVideo" --name="${_pkgname}" --exec="${pkgname} %U"
    cd "${srcdir}/${pkgname}.git"
    export npm_config_build_from_source=true
    export ELECTRON_SKIP_BINARY_DOWNLOAD=1
    export SYSTEM_ELECTRON_VERSION="$(electron${_electronversion} -v | sed 's/v//g')"
    export npm_config_target="${SYSTEM_ELECTRON_VERSION}"
    export ELECTRONVERSION="${_electronversion}"
    export npm_config_disturl=https://electronjs.org/headers
    HOME="${srcdir}/.electron-gyp"
    pnpm config set store-dir "${srcdir}/.pnpm_store"
    pnpm config set cache-dir "${srcdir}/.pnpm_cache"
    pnpm config set link-workspace-packages true
    if [ `curl -s ipinfo.io/country | grep CN | wc -l ` -ge 1 ];then
        export npm_config_registry=https://registry.npmmirror.com
        export npm_config_electron_mirror=https://registry.npmmirror.com/-/binary/electron/
        export npm_config_electron_builder_binaries_mirror=https://registry.npmmirror.com/-/binary/electron-builder-binaries/
    else
        echo "Your network is OK."
    fi
    rm -rf app release pnpm-lock.yaml
    sed 's|"electron-builder",|"electron-builder --dir",|g' -i package.json
    sed "s|'../FFBoxService'|'../../ffbox/FFBoxService'|g" -i src/main/index.ts
    pnpm install
    pnpm add -D pkg
    install -Dm755 "${srcdir}/.nvm/versions/node/v${_nodeversion}"*/bin/node "${srcdir}/${pkgname}.git/app/backend/node${_nodeversion}-linux-x64"
    pnpm run build:everything
}
package() {
    install -Dm755 "${srcdir}/${pkgname}.sh" "${pkgdir}/usr/bin/${pkgname}"
    install -Dm755 "${srcdir}/${pkgname}.git/release/linux-"*/FFBoxService -t "${pkgdir}/usr/lib/${pkgname}"
    cp -r "${srcdir}/${pkgname}.git/release/linux-"*/resources "${pkgdir}/usr/lib/${pkgname}"
    install -Dm644 "${srcdir}/${pkgname}.desktop" -t "${pkgdir}/usr/share/applications"
    install -Dm644 "${srcdir}/${pkgname}.git/src/renderer/public/images/icon_256_transparent.png" "${pkgdir}/usr/share/pixmaps/${pkgname}.png"
    install -Dm644 "${srcdir}/${pkgname}.git/LICENSE" -t "${pkgdir}/usr/share/licenses/${pkgname}"
}

ffbox.sh 文件内容:

#!/bin/bash
set -e
_APPDIR="/usr/lib/@appname@"
_RUNNAME="${_APPDIR}/resources/@runname@"
_OPTIONS="@options@"
export PATH="${_APPDIR}:${PATH}"
export LD_LIBRARY_PATH="${_APPDIR}/swiftshader:${_APPDIR}/lib:${LD_LIBRARY_PATH}"
export ELECTRON_IS_DEV=0
export ELECTRON_FORCE_IS_PACKAGED=true
export NODE_ENV=production
cd "${_APPDIR}"
if [[ $EUID -ne 0 ]] || [[ $ELECTRON_RUN_AS_NODE ]]; then
    exec electron@electronversion@ "${_RUNNAME}" "${_OPTIONS}" "$@" || exit $?
else
    exec electron@electronversion@ "${_RUNNAME}" "${_OPTIONS}" --no-sandbox "$@" || exit $?
fi

编译日志如下:

$ updpkgsums && makepkg -f && namcap *.zst
==> 获取源代码...
  -> 正在升级 ffbox.git git 仓库...
  -> 找到 ffbox.sh
==> 正在为源代码文件创建完整性检查值...
==> 正在创建软件包:ffbox 4.0-1 (2024年04月01日 星期一 11时04分08秒)
==> 正在检查运行时依赖关系...
==> 正在检查编译时依赖关系
==> 获取源代码...
  -> 正在升级 ffbox.git git 仓库...
  -> 找到 ffbox.sh
==> 正在验证 source 文件,使用sha256sums...
    ffbox.git ... 通过
    ffbox.sh ... 通过
==> 正在释放源码...
  -> 正在创建 ffbox.git git 仓库的活动拷贝...
重置分支 'makepkg'
==> 正在删除现存的 $pkgdir/ 目录...
==> 正在开始 build()...
v16.20.2 is already installed.
Now using node v16.20.2 (npm v8.19.4)
Now using node v16.20.2 (npm v8.19.4)
Your network is OK.
 WARN  4 deprecated subdependencies found: @types/[email protected], [email protected], [email protected], [email protected]
Packages: +602
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Progress: resolved 640, reused 616, downloaded 0, added 602, done

dependencies:
+ @khanacademy/simple-markdown 0.11.4
+ crypto-js 4.2.0
+ events 3.3.0
+ koa 2.15.2
+ koa-body 6.0.1
+ koa-mount 4.0.0
+ koa-router 12.0.1
+ koa-static 5.0.0
+ path-browserify 1.0.1
+ pinia 2.1.7
+ vue 3.4.21
+ ws 8.16.0

devDependencies:
+ @types/crypto-js 4.2.2
+ @types/koa 2.15.0
+ @types/koa-mount 4.0.5
+ @types/koa-router 7.4.8
+ @types/koa-static 4.0.4
+ @types/node 18.19.28 (20.12.2 is available)
+ @types/path-browserify 1.0.2
+ @types/ws 8.5.10
+ @vitejs/plugin-vue 4.6.2 (5.0.4 is available)
+ @vitejs/plugin-vue-jsx 3.1.0
+ electron 24.8.8 (29.1.6 is available)
+ electron-builder 23.6.0 (24.13.3 is available)
+ eslint 8.57.0
+ less 4.2.0
+ prettier 2.8.8 (3.2.5 is available)
+ ts-loader 9.5.1
+ typescript 4.9.5 (5.4.3 is available)
+ vite 4.5.3 (5.2.7 is available)
+ vite-plugin-vue-type-imports 0.2.5
+ vite-svg-loader 4.0.0 (5.1.0 is available)
+ webpack 5.91.0
+ webpack-cli 5.1.4

Done in 16.8s
 WARN  4 deprecated subdependencies found: @types/[email protected], [email protected], [email protected], [email protected]
Packages: +54
++++++++++++++++++++++++++++++++++++++++++++++++++++++
Progress: resolved 691, reused 667, downloaded 0, added 54, done

devDependencies:
+ pkg 5.8.1

Done in 4.4s

> [email protected] build:everything /home/zxp-endeavouros/.cache/paru/clone/ffbox/src/ffbox.git
> npm run build:frontend && npm run build:backend && npm run package


> [email protected] build:frontend
> node scripts/build-frontend.mjs

 注入环境变量信息  {"gitCommit":"*2eaef11","isDev":false}
 开始编译 main 
vite v4.5.3 building for production...
✓ 83 modules transformed.
../app/main/index.cjs  81.44 kB │ gzip: 30.91 kB │ map: 411.69 kB
✓ built in 609ms
 开始编译 preload 
vite v4.5.3 building for production...
✓ 1 modules transformed.
../app/preload/index.cjs  1.00 kB │ gzip: 0.41 kB │ map: 3.66 kB
✓ built in 13ms
 开始编译 renderer 
vite v4.5.3 building for production...
transforming (209) ../../node_modules/.pnpm/@[email protected]/node_modules/@khanacademy/perseus-core/dist/es/index.js[@vue/compiler-sfc] the >>> and /deep/ combinators have been deprecated. Use :deep() instead.

[@vue/compiler-sfc] the >>> and /deep/ combinators have been deprecated. Use :deep() instead.

[@vue/compiler-sfc] the >>> and /deep/ combinators have been deprecated. Use :deep() instead.

[@vue/compiler-sfc] the >>> and /deep/ combinators have been deprecated. Use :deep() instead.

✓ 250 modules transformed.
../../app/renderer/index.html                                 0.60 kB │ gzip:   0.41 kB
../../app/renderer/assets/menu_button-74f06b30.svg            0.75 kB │ gzip:   0.36 kB
../../app/renderer/assets/×-f0bff76c.svg                      0.78 kB │ gzip:   0.42 kB
../../app/renderer/assets/deleteNpause_button-5ff38eca.svg    5.97 kB │ gzip:   1.61 kB
../../app/renderer/assets/alipay-56ee6c49.png                 8.29 kB
../../app/renderer/assets/wechatpay-03bdfefd.svg             12.59 kB │ gzip:   5.00 kB
../../app/renderer/assets/qqpay-a6406fb6.png                 21.97 kB
../../app/renderer/assets/drop_files_ok-4dcedf93.png         25.34 kB
../../app/renderer/assets/drop_files-69d120a3.png            28.42 kB
../../app/renderer/assets/index-99ff6730.css                 67.80 kB │ gzip:  11.13 kB
../../app/renderer/assets/index-b5084712.js                 398.55 kB │ gzip: 144.31 kB │ map: 1,753.74 kB
✓ built in 3.07s

> [email protected] build:backend
> node scripts/build-backend.mjs

 注入环境变量信息  {"gitCommit":"*2eaef11","isDev":false}
 开始编译后端 
vite v4.5.3 building for production...
✓ 16 modules transformed.
../app/backend/index.cjs  77.04 kB │ gzip: 21.84 kB │ map: 284.02 kB
✓ built in 385ms

> [email protected] pkg:backend:linux
> pkg --config ./config/pkg.linux.config.json ./app/backend/index.cjs

> [email protected]
> Fetching base Node.js binaries to PKG_CACHE_PATH
  fetched-v16.16.0-linux-x64          [====================] 100%

> Warning Failed to make bytecode node16-x64 for file /snapshot/ffbox.git/node_modules/.pnpm/[email protected]/node_modules/mime/dist/src/index.js
> Warning Failed to make bytecode node16-x64 for file /snapshot/ffbox.git/node_modules/.pnpm/[email protected]/node_modules/mime/dist/src/Mime.js
> Warning Failed to make bytecode node16-x64 for file /snapshot/ffbox.git/node_modules/.pnpm/[email protected]/node_modules/mime/dist/types/other.js
> Warning Failed to make bytecode node16-x64 for file /snapshot/ffbox.git/node_modules/.pnpm/[email protected]/node_modules/mime/dist/types/standard.js

> [email protected] package
> electron-builder --dir

  • electron-builder  version=23.6.0 os=6.6.23-1-lts
  • loaded configuration  file=/home/zxp-endeavouros/.cache/paru/clone/ffbox/src/ffbox.git/electron-builder.json5
  • description is missed in the package.json  appPackageFile=/home/zxp-endeavouros/.cache/paru/clone/ffbox/src/ffbox.git/package.json
  • writing effective config  file=release/builder-effective-config.yaml
  • packaging       platform=linux arch=x64 electron=24.8.8 appOutDir=release/linux-unpacked
  • asar usage is disabled — this is strongly not recommended  solution=enable asar and use asarUnpack to unpack files that must be externally available
  • asar usage is disabled — this is strongly not recommended  solution=enable asar and use asarUnpack to unpack files that must be externally available
==> 正在进入 fakeroot 环境...
==> 正在开始 package()...
==> 正在清理安装...
  -> 正在删除 libtool 文件...
  -> 正在清除不打算要的文件...
  -> 正在移除静态库文件...
  -> 正在从二进制文件和库中清除不需要的系统符号...
  -> 正在压缩 man 及 info 文档...
==> 正在检查打包问题...
==> 正在构建软件包"ffbox"...
  -> 正在生成 .PKGINFO 文件...
  -> 正在生成 .BUILDINFO 文件...
  -> 正在生成 .MTREE 文件...
  -> 正在压缩软件包...
: Can't translate pathname 'usr/lib/ffbox/app/app/renderer/assets/×-f0bff76c.svg' to UTF-8==> 正在离开 fakeroot 环境。
==> 完成创建:ffbox 4.0-1 (2024年04月01日 星期一 11时05分19秒)
ffbox W: No ELF files and not an "any" package
ffbox W: File name usr/lib/ffbox/app/app/renderer/assets/×-f0bff76c.svg contains non standard characters
ffbox W: Dependency bash detected and implicitly satisfied (programs ['bash'] needed in scripts ['usr/bin/ffbox'])
ffbox W: Dependency included, but may not be needed ('electron24-bin')
ffbox W: Dependency included, but may not be needed ('ffmpeg')

目前来看,几个问题: 1是缺少pkg依赖,我自己手动添加了; 2是我这边访问https://registry.npm.taobao.org总是提示reason: certificate has expired,然后编译报错,所以我只好删除pnpm-lock.yaml;个人建议可以生成一个.npmrc文件,然后指定国内镜像; 3是config目录里面的pkg.linux.config.json中需要的node16-linux-x64我使用代理后能够正常下载,不使用代理无法下载,会报错,且无法正常生成FFBoxService;我使用nvm中的node可执行文件替代无效; 4是按照ArchLinux相关打包准则(https://wiki.archlinux.org/title/Electron_package_guidelines),我直接使用系统自带的electron24,但找不到FFBoxService文件,我现在是直接修改src/main/index.ts文件指定路径,结果虽然没有报错,但是无法正常启动服务,报错信息: “服务器 未连接 连接出错,建议检查网络连接或防火墙。”

zxp19821005 avatar Apr 01 '24 03:04 zxp19821005

3.0 的版本距今已经接近两年了,在这期间我都没维护过,所以 3.0 和更久远的版本暂时是给不了你太多帮助了❤️。

我个人很少接触 Linux 生态,因此 Linux 我只编译了我用过的 debian 的版本。其他方面,你应该会比我了解更多😂。另外,我对 FFBox 的主要精力可能目前只停留在“能用”了,也就是先保证功能,再保证适配。看着官网上叮叮咚咚排着一堆下载按钮,我认为跨平台还是个不小的工作量😂。

同理,我只保证我自己能顺畅写、比较有前端开发经验的人能看懂,不保证多数人能把我的项目编译出来,所以我的 readme 里是没有写如何从零开始编译的。这点望理解😂。

然后是下面几个问题的一些回答:

  1. 文档中确实遗漏了这点,pkg 是需要全局安装的一个额外依赖(否则需要修改打包脚本手动指定到项目的 pkg)。
  2. 淘宝镜像的 SSL 证书在最近过期了,目前我的常用解决方案是 pnpm config get strict-ssl。后期我可以看下如何更好地解决这个问题。
  3. pkg 的问题我倒是很少遇到,暂时不清楚如何配置它的镜像。pkg 的作用是将 node.js 项目编译成单个可执行文件,它不是一个简单的 node 解释器 + js 静态文件那样的东西,而是包含了一些像预编译为字节码之类的东西,所以是不能直接用 node 代替的,它们不是同一个东西。
  4. 我没有接触过 ArchLinux,还不清楚改用系统 electron 是如何实现的,因为在生产环境总得有一个载体负责启动主进程的 js 文件,总不能让用户在 console 里输入 electron main.js 吧?改用系统 electron 的话各种相关路径会发生变化。这里涉及到 electron 启动 FFBoxServiceFFBoxService 启动 ffmpeg 两个步骤。由于涉及到多个进程的调用,console.log 信息可能不能直接看到。这里推荐一些个人会使用的调试方式,用来看各种方式获取到的路径具体是什么:第一个步骤是通过向渲染进程发送 debugMessage 的方式(已经在代码中保留了这些注释掉的内容)去在控制台里接收打印的消息;第二个步骤可以尝试的调试方式是在 initFFmpeg 的时候把 ffmpegVersion 改成自己要打印的内容,这样它会出现在主界面上的相应位置。

ttqftech avatar Apr 05 '24 00:04 ttqftech