Wine 包裹指南
许多 Windows 程序在 Linux 下仍然可能很有用,因此我们可能需要为它们打包。两个操作系统之间的差异使得这项任务有些复杂。在本指南中,我们将讨论 Win32 二进制文件,因为有源代码的项目通常会被移植到 Linux。
需要立即检查的事项
- 许可证:许可证是否允许重新打包该程序?
- 安装程序:是否可以静默安装程序?更好的是,是否存在无需安装程序的版本?
- 便携性和纯净性:程序是便携的吗?它纯净吗?
这里我们说的程序是便携的,如果它*从不*写入注册表或其目录之外的任何地方;我们说的程序是纯净的,如果它*从不*写入其目录,但它可能在用户文件夹中写入其设置。一个程序也可以两者兼有(例如,它从不写入设置)或两者都不是(例如,它写入其目录、它到处写入、它写入注册表……)
许可证
通常许可证位于安装目录中的文本文件中。如果您找不到它,请尝试在安装过程中遵循屏幕提示。如果关于重新打包的内容没有说明,请继续。作者不在乎。否则,许可证通常不允许删除文件,或者根本不允许重新打包。在前一种情况下,只需注意 makepkg 过程不会丢失任何文件,您可以在 post_install 阶段删除不需要的文件(例如,卸载程序);在后一种情况下,所有安装过程都必须在 post_install 阶段完成。build 阶段将仅用于复制安装文件。
安装程序
处理像 .zip 这样的压缩文件比处理 Windows 安装程序容易得多。如果您别无选择,因为作者坚持分发其程序时使用安装程序,请在网上搜索是否可以静默安装该软件。MSFN 通常是一个不错的搜索地点。如果您找不到方法,请尝试使用不同的 解压缩工具 打开安装程序;这可能有效。
便携性和纯净性
便携式程序不需要自己的 Wine 模拟文件系统,因此请在 Portable Freeware 上查看您要打包的程序是否是便携的。
指南简述
打包 Windows 程序背后的想法是使用程序的*文件*作为 Wine 将解释的*数据*,就像 JVM 和 Java 字节码一样。
因此,我们将程序安装在 /usr/share/"$pkgname" 中,程序将写入它所需的所有内容到 "$HOME"/."$pkgname"。所有内容都将由一个保存在 /usr/bin/"$pkgname" 中的小脚本准备,该脚本将创建文件夹,在需要时进行准备,最后启动程序。
在接下来的章节中,我们将讨论每一步。
这样,每个用户将拥有自己的设置,他们的决定不会打扰其他用户。
安装
如果程序没有安装程序,安装仅仅是将文件解压;将其解压到 "$pkgdir"/usr/share/$pkgname,并确保权限正确。这些命令将完成
$ find "$pkgdir"/usr/share -type f -exec chmod 644 "{}" \;
$ find "$pkgdir"/usr/share -type d -exec chmod 755 "{}" \;
如果程序无法以简单的方式安装,您需要创建一个 Wine 环境
$ install -m755 -d "$srcdir"/tmp "$srcdir"/tmp/env "$srcdir"/tmp/local $ export WINEPREFIX="$srcdir"/tmp/env $ export XDG_DATA_HOME="$srcdir"/tmp/local $ wine "$srcdir"/installer.exe /silentoptions
我们还没有讨论便携性,但如果您的程序不需要修改注册表项,您可以直接从
"$srcdir"/tmp/env/drive_c/Program\ Files/programname
否则,您需要复制所有注册表文件,以及程序安装在其他地方的文件。"$srcdir"/tmp/local 将包含菜单图标和桌面文件,您可能想将它们复制到包中。如果不存在静默安装程序的方法……也许您可以创建一个 .tar.gz 文件并将其上传到某个地方?如果无法自动化,请强制用户按照安装程序进行操作,并希望他们不要弄乱安装,在盲目复制可能不存在的文件夹之前(例如,用户按了“取消”),编写一些检查。
/usr/bin 脚本
此脚本准备设置文件夹并启动程序。如果您的程序是便携的,它看起来会像这样
#!/bin/bash unset WINEPREFIX if [ ! -d "$HOME"/.programname ] ; then mkdir -p "$HOME"/.programname #prepare the environment here fi WINEDEBUG=-all wine "$HOME"/.programname/programname "$@"
如果它是纯净的,它看起来会像这样
#!/bin/bash export WINEPREFIX="$HOME"/.programname/wine if [ ! -d "$HOME"/.programname ] ; then mkdir -p "$HOME"/.programname/wine wineboot -u #copy the registry file if needed fi WINEDEBUG=-all wine /usr/share/programname "$@"
正如您所见,在第二种情况下,没有环境准备。实际上,一个纯净的应用程序将直接从 /usr/share 启动,因为它不需要在其文件夹中写入,所以它的设置将写入模拟文件系统中的某个地方。
如果应用程序既不纯净也不便携,则必须结合这两种思想。
如果应用程序根本不写入设置,则跳过 if 并从 /usr/share 启动它。
准备环境的任务可能因应用程序而异,但请遵循以下经验法则:如果程序
- 只需要读取一个文件,则链接它。
- 需要写入一个文件,则复制它。
- 不使用文件,则忽略它。
当然,最基本的就是启动 WINEDEBUG=-all wine /usr/share/programname "$@"。
通常,环境将通过在 "$HOME"/.programname 目录和 /usr/share/programname 文件之间创建符号链接来构成。但由于某些 Windows 程序对它们的路径非常挑剔,您可能需要在 "$HOME"/.programname/wine/drive_c/Program\ Files/programname 目录中直接创建符号链接。
当然,这些只是将 Win32 应用程序集成到 Linux 环境中的想法,不要忘记您的智慧和勇气。
例如,μTorrent 默认是一个纯净的应用程序,但只需简单一步即可作为便携式应用程序使用。由于它是一个文件并且很小,创建它的 wine 环境(约 5MB)可能有些过度。最好是链接可执行文件,创建一个空的 settings.dat 文件,以便在 $HOME/.utorrent 目录中使用它作为便携式应用程序。此外,通过访问 .utorrent 目录,用户可以看到他们下载的 .torrent 文件的副本。
UnionFsFuse
您可以考虑使用 UnionFsFuse 程序,该程序可在 unionfs-fuseAUR 中获得。UnionFsFuse 允许将基础目录保留在 /usr/share 中,并将应用程序需要写入的文件复制到 $HOME/.programname 中,几乎是自动的。
使用 UnionFsFuse 需要额外的依赖项,并且它需要 fuse 模块,并非所有用户可能都会加载该模块。尽管如此,如果应用程序需要大量的符号链接,或者不清楚它具体需要写入什么,这可能是值得的。只需确保正确挂载和卸载 UnionFs。
一个示例
要查看依赖于 wine 的 AUR 软件包的示例,请参阅 https://aur.archlinux.org/rpc/v5/search/wine?by=depends
我们将为 eMule 创建一个包。根据 Portable Freeware,eMule 不是完全便携的,因为它会在注册表中写入一些(无用的)键。
另一方面,它也不纯净,因为它在其安装文件夹中写入其配置文件并放置其下载。
幸运的是,有一个 无需安装程序的版本可用。
因此,我们创建我们的 PKGBUILD;唯一的依赖项是 wine。应添加 md5sums。
# Maintainer: You <youremail>
pkgname=emule
pkgver=0.49b
pkgrel=1
pkgdesc="One of the biggest and most reliable peer-to-peer file sharing
clients around the world."
arch=('x86_64')
url="https://www.emule-project.net"
license=('GPL')
depends=()
depends=(wine)
makedepends=(unzip)
source=(emule https://sourceforge.net/projects/emule/files/eMule/$pkgver/eMule$pkgver.zip)
noextract=()
options=(!strip)
build() {
rm -f src/eMule"$pkgver"/license* #It is GPL
install -d -m755 pkg/usr/share/emule
cp -ra src/eMule"$pkgver"/* pkg/usr/share/emule
find pkg/usr/share/emule -type d -exec chmod 755 "{}" \;
find pkg/usr/share/emule -type f -exec chmod 644 "{}" \;
install -d -m755 pkg/usr/bin
install -m755 emule pkg/usr/bin
}
现在我们创建我们的 emule 文件,根据 build,该文件将被复制并设置为在 /usr/bin 中可执行。
#!/bin/bash export WINEARCH=win32 WINEPREFIX="$HOME/.emule/wine" if [ ! -d "$HOME"/.emule ] ; then mkdir -p "$HOME"/.emule/wine || exit 1 #Each user will have its config, we copy the default file since emule #needs to write here. cp -r /usr/share/emule/config "$HOME"/.emule || exit 1 #We symlink the files emule needs to read to work ln -s /usr/share/emule/emule.exe "$HOME"/.emule/emule || exit 1 ln -s -T /usr/share/emule/lang "$HOME"/.emule/lang || exit 1 ln -s -T /usr/share/emule/webserver "$HOME"/.emule/webserver || exit 1 fi wine "$HOME"/.emule/emule "$@"
如果您想更精确,可以在 .install 文件中添加一条消息,告知用户他们应该禁用搜索历史记录,因为 wine 会弄乱该菜单。您甚至可以提供一个具有最佳设置的默认配置文件。就这样……运行 $ makepkg,检查软件包文件夹以确保无误,然后安装。
Gecko 和 Mono
除非您确定软件需要浏览器或 .NET 运行时(软件包 wine-gecko 和 wine-mono),否则默认的 wine 安装会提示 Gecko/Mono,这是不希望的。
要禁用 HTML 渲染、字节码支持和对话框,您需要在脚本中使用 dlloverride。对于 Gecko
export WINEDLLOVERRIDES="mshtml="
对于 Mono
export WINEDLLOVERRIDES="mscoree="
两者都
export WINEDLLOVERRIDES="mscoree,mshtml="
您也可以通过 winecfg 禁用它们:只需将 mscoree/mshtml 设置为 Disable。