教程:开放式软件包管理器(OPPM)

开放式软件包管理器(The OpenPrograms Package Manager),简称OPPM,是OpenComputers模组的一个可从奖励箱软盘中获取的软件。此软件提供了种类繁多的程序(下文称为“软件包”)供您方便地下载与安装。此软件致力于帮助用户降低分发自己程序的难度,在此软件上安装、升级与卸载软件就像创建与登记软件那么容易。

使用OPPM

为了能够使用OPPM,你需要有至少2级的机箱,并插入因特网卡。 在你获得了装有OPPM的软盘之后,先将它插到电脑里,然后你做的第一件事应该是运行oppm install oppm,来将最新版本的软件包管理器安装到你的主硬盘上。安装完成后,你可以随意关闭电脑、取出磁盘或重启电脑。

OPPM支持若干参数,参数将会在下文讲解:

  • oppm list [filter] [-i]
    此命令将会列出所有可用软件包的名称。列表按字母顺序排列。可选参数filter可以让列表只显示名称匹配指定过滤条件的软件包。-i选项可以让命令仅列出已经被安装的软件包。

  • oppm info <package>
    列出指定软件包的详细信息,例如完整名称、作者、软件包描述以及作者可能添加的其他额外注释。

  • oppm install [-f] <package> [path]
    将软件包下载到你系统中的某个目录;若不指定path参数,则会安装到oppm.cfg中指定的默认路径(默认为/usr,如果你没有特别理由,就不要改动安装位置)。-f选项可以强制安装,即已存在的任何文件都将被下载的文件覆盖/替换。并且如果path指向不存在的目录,会先创建此目录。

  • oppm update <package>
    此命令将会卸载并重新安装指定软件包,以确保你能拥有软件包的最新版本。若package参数为“all”,则会更新已安装的所有软件包。

  • oppm uninstall <package>
    从你的系统中移除指定软件包的所有文件。

  • oppm register <userorgroup>/<repository>
    将位于https://github.com/<userorgroup>/<repository>的Github仓库作为额外软件源添加。仓库中必须有名为master的分支,且此分支的根目录下必须有名为programs.cfg的文件结构配置文件。

  • oppm unregister <userorgroup>/<repository>
    从额外软件源列表中移除位于https://github.com/<userorgroup>/<repository>的Github仓库。

注意:如果你只是想使用他人提供的软件包,而并不想自己制作软件包,那么可以停止阅读了。

软件包列表格式

如果你想创建自己的软件包,不论是因为你想更方便地在多台电脑上安装软件还是因为你想与他人分享软件,你需要创建一个Github仓库和一份软件包列表。软件包列表的位置取决你登记仓库的方式,但无论何种方式,其格式均相同。

这是软件包列表中可存在内容的参考(参见example.cfg):

snippet.lua
{--这是programs.cfg文件的一份样例。请勿在实际的programs.lua文件中添加任何注释
  ["example-package"] = {
    files = {
      ["master/somefolder/bar.lua"] = "/",--"/"斜线代表文件将会被置于用户指定的文件夹中,默认为/usr
      ["master/somefolder/barinfo.txt"] = "//etc", --双斜线代表使用绝对路径
      [":master/otherfolder"] = "/share/something", --冒号代表一个文件夹,将包含此文件夹中的所有内容
      [":master/otherfolder"] = "//etc/something", --此写法也可用于绝对路径
      ["master/somefolder/barlib.lua"] = "/subfolder",--将文件置于用户指定文件夹的一个子文件夹中
      ["?master/somefolder/something.cfg"] = "/" --此文件只会在并不存在时才会安装或更新,除非指定-f选项
    },
    dependencies = {
      ["GML"] = "/lib"--此软件包将会被安装到指定子文件夹中
    },
    name = "Package name",--此属性用于"oppm info"
    description = "This is an example description",--此属性用于"oppm info"
    authors = "Someone, someone else",--此属性用于"oppm info"
    note = "额外安装教程、通用教程以及额外信息/注释写在此处,此行内容为可选。",
    hidden = true, --添加此行可选内容,可以让你的软件包不显示在"oppm list"中,适用于自定义依赖库
    repo="tree/master/somefolder" --供网站使用。这代表软件包应当链接到网站何处
  },
  ["yet-another-package"] = {
          ...
  }
}

以下为三个真实存在软件的软件包列表样例:

snippet.lua
{
  ["song"] = {
    files = {
      ["master/song/song.lua"] = "/lib",
      ["master/song/song-example1.lua"] = "/bin",
      ["master/song/song-example2.lua"] = "/bin"
    },
    name = "Song API",
    description = "An API to play whole songs using computer.beep",
    authors = "Vexatos",
    repo = "tree/master/song"
  },
  ["oppm"] = {
    files = {
      ["master/oppm/oppm.lua"] = "/bin",
      ["master/oppm/etc/oppm.cfg"] = "//etc",
      ["master/oppm/lib/oppm.lua"] = "/lib"
    },
    name = "OpenPrograms Package Manager",
    description = "A program to browse, download, install and update various useful programs and libraries",
    authors = "Vexatos",
    note = "If you are running this program on a floppy disk, run 'oppm install oppm' to install this program locally on your main Hard Drive.\n Consider running 'oppm update oppm' to get the latest version of this program.",
    repo = "tree/master/oppm"
  },
  ["drama"] = {
    files = {
        ["master/drama/drama.lua"] = "/bin",
    },
    name = "Drama Generator",
    description = "asie's Drama Generator inside OC",
    authors = "Vexatos",
    note = "Run and have fun!",
    repo = "tree/master/drama/drama.lua",
  }
}

登记仓库

OPPM需要知道如何找到你的软件包列表以及其中描述的组成软件包所需的文件。根据你的目标不同,你有三种选择。

OPPM登记

如果你开发的是只有自己使用的软件包(例如,用于更方便地将你编写的软件安装在多台电脑上,或者你想用外部编辑器来编写代码并将其安装到OC模组的电脑上),那么、oppm register命令可能是最简单的选择。

  1. 创建一个公开Github仓库。
  2. 在仓库中,确保有名为master的分支;OPPM只会在此分支内查找programs.cfg文件。
  3. master分支中,在仓库的顶级目录中创建一个名为programs.cfg的文件,其中包含你的软件包列表。
  4. 确保你已经推送了所有文件。
  5. 以你的仓库名为参数运行oppm register命令。例如,你的Github用户名为MyUser并且你将仓库命名为MyOCPackages,你需要运行oppm register MyUser/MyOCPackages

你的软件包现在会在oppm list中显示了,并且可以用oppm install安装,就像其他软件包一样。你对programs.cfg或者构成你软件包的文件作出的改动都可以影响到OPPM。但是因为Github系统有缓存,你在推送更改后可能需要等一会。而且OPPM也有缓存,你可能需要重启OC模组的电脑才能看到改动。

当然,只要你愿意,你可以把你的仓库名分享给其他人,他们也可以登记这个仓库并且使用你的软件。

请注意,你不必把所有软件都存放到master分支中。只有programs.cfg必须位于master分支的顶级目录中,但是鉴于files表中每个元素的第一个组成部分都是分支名,你也可以指向位于其他分支的软件。

将软件包全球登记

如果你想让你的软件包对全世界公开(这样喜欢你软件的人都可以很方便的安装了),那么你需要去OpenComputers官方论坛或官方IRC找到Vexatos,让他登记你的Github仓库。你的仓库必须与上一章节所描述的一致。

oppm.cfg

你还可以通过编辑/etc/oppm.cfg来添加额外仓库。这种做法的不同之处在于你需要把整个软件包列表都放到/etc/oppm.cfg中,而不是放到仓库中(仓库中可以有软件包列表,但是如果使用此方法则会被忽略)。

大多数情况下OPPM登记更好,因为你只需要编写一次软件包列表(而无需将它复制到每一台电脑中,并且保持版本更新),还能将列表与你的代码和数据文件放在一起。然而,如果你想安装来自不属于你而且没有programs.cfg的仓库中的Lua程序,此方法可能会有所帮助。

打开/etc/oppm.cfg;文件内容应当如下文所示:

snippet.lua
{
    --默认安装路径
    path="/usr",
    --额外仓库与软件包位于此处,参阅https://github.com/OpenPrograms/Vexatos-Programs/blob/master/oppm/etc/oppm.cfg以获取正确的软件包语法
    repos={
    }
}

你可能会注意到名为repos的表。 这就是你登记你自己软件包的地方。表中的每一项都以一个仓库名(GitHub链接的用户或小组名/仓库名)作为键,以对应的软件包列表作为值。下面是oppm.cfg文件的一份样例,其中向OPPM添加了两个不同的软件包(第一个作为参考,第二个为真实样例):

snippet.lua
{
  --默认安装路径
  path="/usr",
  --额外仓库与软件包位于此处,参阅https://github.com/OpenPrograms/Vexatos-Programs/blob/master/oppm/etc/oppm.cfg以获取正确的软件包语法
  repos={
    ["YourUsername/YourRepo"] = {
      ["example-package"] = {
        files = {
          ["master/somefolder/bar.lua"] = "/",--"/"斜线代表文件将会被置于用户指定文件夹中,默认为/usr
          ["master/somefolder/barinfo.txt"] = "//etc", -- 双斜线代表使用绝对路径
          [":master/otherfolder"] = "/share/something", --冒号代表一个文件夹,将包含此文件夹中的所有内容
          [":master/otherfolder"] = "//etc/something", --此写法也可用于绝对路径
          ["master/somefolder/barlib.lua"] = "/subfolder",--将文件置于用于指定文件夹的一个子文件夹中
          ["master/somefolder/libfolder/"] = "/"
        },
        dependencies = {
          ["GML"] = "/lib"--此软件包将会被安装到指定子文件夹中
        },
        name = "Package name",--此属性用于"oppm info"
        description = "This is an example description",--此属性用于"oppm info"
        authors = "Someone, someone else",--此属性用于"oppm info"
        note = "额外安装教程、通用教程以及额外信息/注释写在此处,此行内容为可选。",
        hidden = true, --添加此行可选内容,可以让你的软件包不显示在"oppm list"中,适用于自定义依赖库
        repo="tree/master/somefolder" --供网站使用。这代表软件包应当链接到网站何处
      },
      ["yet-another-package"] = {
              ...
      }
    },
    ["OpenPrograms/samis-Programs"]={
      ["nidus"] = {
        ["files"] = {
          ["master/nidus/nidus.lua"] = "/bin", --可执行文件应当安装到 /bin 目录
          ["master/nidus/core.lua"] = "/lib/nidus", --运行库应当被安装到 /lib 目录
          ["master/nidus/hosts.db"] = "//var/lib/nidus"
        },
        ["repo"] = "tree/master/nidus",
        ["dependencies"] = {
          ["oop-system"] = "/"
        },
        ["name"] = "NiDuS DNS Server",
        ["description"] = "A DNS server that is light and easy to use. Uses its own protocol.",
        ["authors"] = "samis"
      },
    }
  }
}

我希望这篇教程让您理解了OPPM是什么,以及如何使用它。如果你还有进一步的问题,请在OC论坛或IRC上联系我(Vexatos)。

感谢阅读!

目录