[ 已解决 ] 请问,在 OBS 里,如何做 Layering?

我现在要给 rampartc 打个包,但是它依赖 Cloud:Eucalyptus 这个源,该源不是官方标准源的一部分,按 这里 ](openSUSE:Build Service Tutorial - openSUSE) 的说法,Layering(添加一个源作为依赖,在标准源里找不到的包会去添加的源里找)是解决这个问题的方法,但是如何在 OBS 或者 osc 里做这个 layering 呢?

哦,layering 中文叫嫁接,意思是把别人的某个源整个当作你的源的编译依赖。方法是:

osc meta prj -e home:MargueriteSu

编辑你的软件源的元数据里的 repoository 标记,比如我的 openSUSE_12.2 原来的标记是这样:

  <repository name="openSUSE_12.2">
    <path project="openSUSE:12.2" repository="standard"/>
    <arch>x86_64</arch>
    <arch>i586</arch>
  </repository>

现在我想要加个 KDE:Release:410 源去供应那些用 12.2 又用非官方直接支持的 KDE 4.10 的人。就改 Path

  <repository name="openSUSE_12.2">
    <path project="KDE:Release:410" repository="openSUSE_12.2"/>
    <path project="openSUSE:12.2" repository="standard"/>
    <arch>x86_64</arch>
    <arch>i586</arch>
  </repository>

project 和 repository 在网页访问那个源就能看到。这个在 openSUSE 用的非常普遍了。

另外 Path 的顺序是有关系的,比如 410 在上,那就会优先使用它里面的 KDE 包作为编译依赖(不用去指定 BuildRequires: libkde4-devel >= 4.10.0 来排除 12.2 源里默认的 4.8.4)。

同样的还有分支(branch)和聚合(aggregation)。

这两个好理解,分支就是那个 branch existing package from other repository。命令行是:

osc linkpac 原来的软件源 原来软件源中的包名 你的软件源 在你的软件源中叫的名字(可选,不写包名不变)

聚合网页干不了,命令行:

osc aggregatepac 参数一样

区别就是分支的包你能改,聚合的你改不了(直接取 RPM)。它们都是用户直接添加你的源就能下载到包的,而嫁接不是,要多加一个源,不符合有限封闭原则。具体用哪个要自己权衡,用的包实在太多那只有嫁接,一两个一般都是聚合。对方打包技术比你烂,比如 warning 太多,有些 warning 会影响使用,那使用分支,自己顺手修一下还给他。

经过一系列死不要脸的尝试之后终于开始编译了。。。。。