【问题标题】:How to package a game for Linux?如何为 Linux 打包游戏?
【发布时间】:2010-10-28 04:23:47
【问题描述】:

我有一个目前在 Windows 和 Mac OS X 下运行的游戏,我想让它在 Linux 下可用。移植应该相当容易,因为它是基于 Java 的游戏,并且使用可在所有 3 个平台上使用的可移植库。

这个问题的难点和原因是打包它,以便它可以在尽可能多的现代 Linux 发行版上运行。主要目标是 Ubuntu 9。

Webstart 不是一种可接受的方式,.tar.gz 是最后的手段。我更喜欢具有正确定义的依赖项(例如 Java)并且易于安装的包。

我还需要能够在 Windows 环境下构建包,因为我的构建链中的一些工具是仅限 Windows 的。

【问题讨论】:

  • 最新的 webstart 允许离线模式。这样可以接受吗?

标签: java linux software-distribution rpm deb


【解决方案1】:

首先看看一个类似的项目是如何实现这一目标的。我想到的是Freecol,这是一款基于 Java 的跨平台游戏。他们的download page 有相当清楚的关于在多个平台上安装它的信息。他们还提供软件包,例如用于 Ubuntu 的 GetDEB 和用于 OpenSuse 的 PackMan

一般来说,如果您想访问尽可能多的发行版,您应该考虑的格式是(按重要性粗略排序):

  1. Ubuntu .deb(如果可以,也创建一个存储库)
  2. OpenSUSE .rpm 或 .ypm(一键安装)
  3. Fedora .rpm
  4. .tar.gz预编译包

然后是从源代码构建选项,或尽力而为的二进制安装程序。最后,看看其他流行的发行版,例如 Debian、Mandriva 和 BSD

一旦存在针对特定平台的包,您可能希望考虑将其接受到该发行版中。这将使用户更容易找到和获取。可以在此处找到有关 ubuntu 进程的信息:

(编辑:更好的列表,感谢 Jonik 的建议。)

【讨论】:

  • 对于 ubuntu,您可以使用启动板构建包并轻松创建存储库。
  • 我会在列表中添加 zip/gzip/bzip2 预编译包(不是安装程序,请注意,只是要提取的普通存档),至少高于“从源代码构建”选项。 (FreeCol 确实是一个很好的例子,他们就是这样做的,甚至提供 zip 和 gzip 两种口味。)除此之外,我喜欢这个答案。
【解决方案2】:

看看零安装 (http://0install.net/)。

  • 任何人都可以安装软件

您不必成为管理员就可以安装文字处理器 [更多]

  • 任何人都可以分发软件

您无需获得发行版(或其他任何人)的祝福即可成为零安装的一部分; 系统完全去中心化 [更多]

  • 自动更新

当更新可用时,零安装会通知您[更多]

  • 安全性

如果一个用户下载了恶意程序,其他用户不受影响; 用户无需相互信任即可共享下载; 安装不执行任何下载的代码; 新软件上线前总是会检查数字签名

【讨论】:

    【解决方案3】:

    您可以使用 Ubuntu 的 deb 系统。它将帮助您正确标记依赖项。

    包装指南here

    【讨论】:

      【解决方案4】:

      好问题 - 我不知道答案(而且我想没有一个简单、包罗万象的解决方案),但从 Linux 用户的角度来看,这里有几点需要考虑。

      我认为 .tar.gz(或 .tar.bz2)不一定那么糟糕。 Linux 用户已经习惯了,例如许多商业软件包都是以这种方式分发的。如果主要目的是在某个位置提取文件,它通常胜过图形 Windows 风格的安装程序。

      一些(也许很多?)用户在包管理系统之外安装了 JRE,因此仅提供 RPM 或 deb(这取决于将 JRE 安装为 RPM 或 deb)可能会有问题。 (我个人更喜欢在/usr/local/java 下安装几个 JRE 版本(实际上是 JDK)。)所以至少考虑提供一个 zip/gz/bz2 包以及其他选项。

      另外,要了解如何创建 Java 软件的 RPM 包,请查看JPackage

      【讨论】:

        【解决方案5】:

        每个发行版都可能有自己的通用文件存放位置约定。
        在 Ubuntu 中,常见的 java jar 进入 /usr/share/java。存在诸如 commons-cli 和 liblog4j 之类的东西。如果您使用其中任何一个,请确保您的 deb 依赖于适当的包。如果该库在您的应用程序之外使用,但不在 Ubuntu 存储库中,请考虑将其放在自己的 deb 中并依赖于它。您需要在 /usr/share/[name]/ 中为您的特定游戏 jar 创建一个文件夹,然后创建一个 shell 脚本来启动游戏。这个脚本应该放在/usr/bin(或/usr/games)并且是可执行的。

        也不要忘记依赖适当的 java 包(我建议 sun-java#-jre 包,因为 gjc 是垃圾,而 open-jdk 还不是 100% 存在(至少 METAL LaF 是 fubar ,其他的我还不知道。)

        【讨论】: