[ 已解决 ] 打包之经验分享与问题求教

按照女王大人的视频教程成功打包了一个简单的小程序。
感谢女王!
(也参考了 hottea 童鞋和其他几个 obs 上没记住名字的外国童鞋的 config,在此一并感谢!)

在这个过程中遇到的几个问题:

0,同时存在多个 OBS:
(没错,就是 0,^_^)

在~/.oscrc 中每个 api 下面添加 aliases:

[api.opensuse.org]
……
aliases = sobs 
……

[api.pub.meego.com]
……
aliases = cobs
……

……

此处的 sobs 就是 openSUSE OBS 的别名了。
使用的时候就是给 osc 加 -A 参数。

osc -A sobs ls
osc -A sobs meta pkg -c home:xtzh test

1,原来.desktop 文件是必须要写 Categories 的。否则编译会出错。

类似:

Categories=AudioVideo;Player;

2,原来有的 OBS 账户是有两个相关仓库的,一个是:

download.opensuse.org/repositories/home:/用户名 /

另一个是:
download.opensuse.org/repositories/home:/用户名:/

注意第二个后面的冒号! 为什么会有两个呢?

update: 应该是因为不同的项目名称。
home project 像 home:xtzh 应该在第一个仓库中,其它的像 home:xtzh:ffmpeg 这样的 project 应该就会出现在第二个仓库中。

ps: 然后意外的发现了自己年少懵懂时把一个黑名单里的包提交到工厂了。。。
曾经第一次就撞枪口了 (那时还没有发现女王的教程。。。),貌似没成功,反正有个 ffmpeg 的空仓库在那,后来就没有后来了。
(尝试删了 ffmpeg 的 Project,但是 repositories 没删掉,重新建了同名的 project,改天继续删。)

3,有一个奇怪的问题是 zypper in 的时候会安装两个 bin 文件:

whereis linux1g1g
linux1g1g: /usr/bin/linux1g1g /usr/bin/X11/linux1g1g




rpm -ql linux1g1g
/usr/bin/linux1g1g
/usr/share/applications/linux1g1g.desktop
/usr/share/doc/packages/linux1g1g
/usr/share/doc/packages/linux1g1g/README
/usr/share/doc/packages/linux1g1g/changelog
/usr/share/doc/packages/linux1g1g/copyright
/usr/share/pixmaps/linux1g1g.png

spec:

# Please submit bugfixes or comments via http://bugs.opensuse.org/
#

Name:           linux1g1g
Version:    0.9
Release:    2
License:    GPL-3.0
Summary:    1g1g client for linux
Url:        http://www.1g1g.com/
Group:      Productivity/Multimedia/Sound/Players
Source:     %{name}-%{version}.tar.bz2
BuildRequires: libqt4
BuildRequires: libqt4-devel 
BuildRequires: libQtWebKit-devel
BuildRequires: libQtWebKit4
Provides: 	linux1g1 = %{version}
BuildRoot:      %{_tmppath}/%{name}-%{version}-build

Patch1:  0001-add-system-tray.patch 
Patch2:  0002-add-desktop-entry-optimize-installation.patch


%description

 Linux 1g1g is a desktop application for 1g1g.com
 Linux1g1g is a desktop application for linux user 
 to listen to 1g1g.com without opening a browser.
 It is  based on Qt and Webkit and developed by 
 two fans of 1g1g.com

 Visit www.1g1g.com and you will like it.


%prep
%setup -q
%patch1 -p1
%patch2 -p1

%build
/usr/bin/qmake
make %{?_smp_mflags}

%install
make INSTALL_ROOT=%{buildroot} install

%post

%postun

%files
%defattr(-,root,root)
%doc README debian/copyright debian/changelog
%{_bindir}/%{name}
%{_datadir}/applications/%{name}.desktop
%{_datadir}/pixmaps/%{name}.png



%changelog

求指教。谢谢啦先!

omg, 又是 Qt 啊,真是讨厌。
==============
这个,我觉得既然加了 package-devel 包,那么 package 就可以省略了。安装了 .desktop 文件就需要使用 %suse_update_desktop_file 来 update .desktop 文件。see en.opensuse.org/openSUSE:Packaging_Conventions_RPM_Macros#.25suse_update_desktop_file 。最简单的就是省略所有可选参数,直接 %suse_update_desktop_file filename。

Qt 的怎么了?有什么讨厌的?KDE 也是用 Qt 开发的。

好吧,update 还添加 catories,原以为只是 translation 相关的。

因为我打包了一个 qt 程序,没有写好的 .pro,qmake 生成的 Makefile 不能满足安装需求,坑爹啊。

* 

没写好就怪不着 Qt 啦,Qt 只是个库,只是个开发工具,用的好与坏得看人。

开个玛莎拉蒂不用方向盘转弯撞树上了,能怪车不好么?
您说对吧?:stuck_out_tongue:

什么 qt 程序,回头我也试试看。

我说出来的话岂不是公开嘲笑开发者?好吧,就算是 bug 好了。see code.google.com/p/shadaradio

/usr/bin/X11 的那个是你手动编译时弄上去的。spec 里没有的文件绝对不会装,否则编译时直接就报错了。

不信你

rpm -qf /usr/bin/X11/linux1g1g

肯定告诉你这个文件不属于任何 rpm。

有了 -devel 不用再 BuildRequires 主包
linux1g1 是什么情况?另外 Provides 和 Obsoletes 总是成对出现的:

Provides:   linux1g1 = %{version}
Obsoletes:  linux1g1 < %{version}

它们的意思是说我虽然没有名字叫这个的 rpm,但是我 zypper in linux1g1 的时候可以自动安装上 linux1g1g 来替代。你不把老版本淘汰掉就会出现同时安装的冲突。

我们不是 debian,你留空格只是浪费最终在用户机器上的显示空间而已。

直接 qmake 即可

如果你的软件没有 /usr/lib{64}/ 下的 so 文件的话可以删除它们,留着反而报错。不信你看 rpmlint 日志。

1赞

更奇怪的事情来了:

rpm -qf /usr/bin/X11/linux1g1g
linux1g1g-0.9-2.x86_64

这里的 /usr/bin/X11/linux1g1g 在 zypper rm linux1g1g 的时候会被自动删除。

有了 -devel 不用再 BuildRequires 主包
linux1g1 是什么情况?另外 Provides 和 Obsoletes 总是成对出现的:

Provides:   linux1g1 = %{version}
Obsoletes:  linux1g1 < %{version}

它们的意思是说我虽然没有名字叫这个的 rpm,但是我 zypper in linux1g1 的时候可以自动安装上 linux1g1g 来替代。你不把老版本淘汰掉就会出现同时安装的冲突。

这里是我写错了,没注意。现在明白了。:stuck_out_tongue:

我们不是 debian,你留空格只是浪费最终在用户机器上的显示空间而已。

这个是从原始代码里复制过来的,后面我再改下。

直接 qmake 即可

我的电脑上不止一个 qmake,默认是 Qt 5 的,改成这样会默认链接 Qt 5 的库。这个包目前是基于 Qt 4 的。

以后这样:测试的时候用绝对路径,ci 的时候改过来。(或者有空的时候 porting 成双版本的)

如果你的软件没有 /usr/lib{64}/ 下的 so 文件的话可以删除它们,留着反而报错。不信你看 rpmlint 日志。

恩。是两个 warnings

linux1g1g.x86_64: W: empty-%post
linux1g1g.x86_64: W: empty-%postun

去掉了之后还有一个 Error:

rpmlint -i linux1g1g-0.9-2.x86_64.rpm
linux1g1g.x86_64: E: useless-provides linux1g1g
This package provides 2 times the same capacity. It should only provide it
once.

linux1g1g.x86_64: W: no-manual-page-for-binary linux1g1g
Each executable in standard binary directories should have a man page.

1 packages and 0 specfiles checked; 1 errors, 1 warnings.

这个 useless-provides 和 This package provides 2 times the same capacity 是什么情况?

因为你提供了自己。自己本身就能提供自己。

Sent from my Galaxy Note 2 using Tapatalk 2

没太懂,要提供自己 2 次? 意思是这个是正确的?

还有 rpm -qf /usr/bin/X11/linux1g1g 结果和预期不太相符。返回那个包了。

你这个包名就叫 linux1g1g,那这个包本身就能提供 linux1g1g。现在你又加上了一个。所以是 useless 的。Provides 只能提供别的包名比如 1g1g。另外必须有意义。比如历史曾用包名,搜索得多的名字,通俗叫法等等。你随便 Provides 没有意义,因为 Provides 的意义就在于让软件包管理器能够以近似方式检索。

你那个文件是你本地打包或之前打包放错位置留下的。去 yast 里看你应该装了多个版本。尤其在你把 provides 搞乱了的情况下。

现在:1, 我 zypper rm 把原来的版本删除了。

查看结果:

rpm -ql linux1g1g
package linux1g1g is not installed



whereis linux1g1g
linux1g1g:



ls /usr/bin/linux1g1g
ls: cannot access /usr/bin/linux1g1g: No such file or directory

ls /usr/bin/X11/linux1g1g
ls: cannot access /usr/bin/X11/linux1g1g: No such file or directory

检查也没有残留。

2, 把 spec 里的 provides 和 obsoletes 去掉了,重新打了包。
查看包信息:

zypper if linux1g1g
Loading repository data...
Reading installed packages...


Information for package linux1g1g:

Repository: myrepo
Name: linux1g1g
Version: 0.9-8.1
Arch: x86_64
Vendor: obs://build.opensuse.org/home:xtzh
Installed: No
Status: not installed
Installed Size: 40.2 KiB
Summary: 1g1g client for linux
Description: 
 Linux 1g1g is a desktop application for 1g1g.com
 Linux1g1g is a desktop application for linux user
 to listen to 1g1g.com without opening a browser.
 It is  based on Qt and Webkit and developed by
 two fans of 1g1g.com
 Visit www.1g1g.com and you will like it.

3,安装:

 sudo zypper in linux1g1g
Loading repository data...
Reading installed packages...
Resolving package dependencies...

The following NEW package is going to be installed:
  linux1g1g 

1 new package to install.
Overall download size: 17.5 KiB. After the operation, additional 40.2 KiB will be used.
Continue? [y/n/?] (y): y
Retrieving package linux1g1g-0.9-8.1.x86_64                                                                                                                                                 (1/1),  17.5 KiB ( 40.2 KiB unpacked)
Retrieving: linux1g1g-0.9-8.1.x86_64.rpm ..................................................................................................................................................................................[done]
(1/1) Installing: linux1g1g-0.9-8.1 .......................................................................................................................................................................................[done]

安装后:

 whereis linux1g1g
linux1g1g: /usr/bin/linux1g1g /usr/bin/X11/linux1g1g



ll /usr/bin/linux1g1g /usr/bin/X11/linux1g1g
-rwxr-xr-x 1 root root 36216 Apr 30 00:53 /usr/bin/linux1g1g
-rwxr-xr-x 1 root root 36216 Apr 30 00:53 /usr/bin/X11/linux1g1g

两个文件修改的时间是一样的。

 rpm -qf /usr/bin/X11/linux1g1g 
linux1g1g-0.9-8.1.x86_64



 rpm -qf /usr/bin/linux1g1g
linux1g1g-0.9-8.1.x86_64




 rpm -ql linux1g1g
/usr/bin/linux1g1g
/usr/share/applications/linux1g1g.desktop
/usr/share/doc/packages/linux1g1g
/usr/share/doc/packages/linux1g1g/README
/usr/share/doc/packages/linux1g1g/changelog
/usr/share/doc/packages/linux1g1g/copyright
/usr/share/pixmaps/linux1g1g.png



zypper if linux1g1g
Loading repository data...
Reading installed packages...


Information for package linux1g1g:

Repository: myrepo
Name: linux1g1g
Version: 0.9-8.1
Arch: x86_64
Vendor: obs://build.opensuse.org/home:xtzh
Installed: Yes
Status: up-to-date
Installed Size: 40.2 KiB
Summary: 1g1g client for linux
Description: 
 Linux 1g1g is a desktop application for 1g1g.com
 Linux1g1g is a desktop application for linux user
 to listen to 1g1g.com without opening a browser.
 It is  based on Qt and Webkit and developed by
 two fans of 1g1g.com
 Visit http://www.1g1g.com and you will like it.

yast:

!](Imgur: The magic of the Internet)

!](Imgur: The magic of the Internet)

!](Imgur: The magic of the Internet)

OBS 上的 rpmlint result:

linux1g1g.x86_64: W: no-manual-page-for-binary linux1g1g
Each executable in standard binary directories should have a man page.

2 packages and 0 specfiles checked; 0 errors, 1 warnings.

比较诡异,按以上的信息来看,我觉得可能不是之前留下来的,因为之前已经删除了; 还有, 安装好后再删除的话,两个包也是一起被删除的。

或者我安装的步骤有问题?

sorry,

/usr/bin/X11

/usr/bin

的链接。

$ rpm -qf /usr/bin/X11
xorg-x11-7.6_1-7.1.1.noarch

然后去 software.opensuse.org 搜 xorg-x11,看 spec:

# Compatibility symlink (Bug #223524)
mkdir -p "${RPM_BUILD_ROOT}%{_bindir}"
%{__ln_s}nf . "${RPM_BUILD_ROOT}%{_bindir}/X11"
1赞

我了个去!还带这样的。万万没想到,被 whereis 表象给蒙蔽了。 :joy:
女王你太厉害了,这都能发现。
万分感谢! :slight_smile: