[ Content contribution] 【教程】简单构建一个玲珑应用实例-Demo-htop
Tofloor
poster avatar
neko
deepin
Ecological co-builder
2024-05-25 01:02
Author

以htop为例,实现一个简单的玲珑应用Demo

先创建一个linglong.yaml配置文件用于构建容器:
linglong.yaml:

version: "1"

package:
  id: demo.htop.linyaps #ID
  name: demo.htop #包名
  version: 3.3.0.0 #版本号
  kind: app #应用类型
  description: |
    描述:这是一个Demo 

command:
  - RUN #执行你的二进制文件,建议自己创建一个RUN文件方便给应用配置环境变量

base: org.deepin.foundation/23.0.0
#runtime: org.deepin.Runtime/23.0.1
#该应用用不到qt库所以可以注释掉减少体积

build: | 
  #把除了yaml、layer、linglong的其它文件复制到玲珑容器内部
  cp -av $(ls -A | grep -vE '\.yaml$|Makefile$|.deb$|ld-test$|missing_lib.list$|\.layer$|^linglong$|^tmp$')  $PREFIX;
  #将要执行的二进制文件放到本文件同级的bin目录下
  #将二进制文件依赖的库放到本文件同级的lib目录下

然后我们再创建2个目录分别是bin和lib,现在目录结构如下

image.png

其中bin目录里面放我们要构建的二进制文件htop,lib目录里面放二进制文件所依赖的库文件,现在目录结构如下:

image.png

htop是哪里来的:
#假设当前目录为demo,即yaml配置文件所在的目录

cp /usr/bin/htop bin #复制系统的htop到demo/bin/目录

RUN文件:

#!/bin/bash
export TERM=xterm-256color #设置所需的环境变量
htop #启动程序

#为什么创建RUN而不是执行在yaml里面启动htop?
#因为yaml里面的command:只支持一个参数,这样就没办法配置环境变量,所以写个RUN文件作为桥梁。

lib目录里面的库文件:

image.png
这两个是htop所需要的库。
我们试试删除它用来看看会发生什么

image.png

#开始构建
ll-builder build

image.png

#尝试运行
ll-builder run

image.png

哦豁,报错了。提示找不到"libnl-3.so.200"库
现在怎么办?

#由于我们本地安装了htop说明本地已经具备了运行的库文件
#那么我们可以利用dpkg -S 查询这个库

dpkg -S libnl-3.so.200

image.png

然后我们复制到demo的lib目录

cp /lib/x86_64-linux-gnu/libnl-3.so.200 lib

现在结构如下,然后我们用这个方法把缺失的另一个库也补全,最终结果就是开始的那张图
image.png

现在我们尝试构建成玲珑包并运行看看

ll-builder build #开始构建
ll-builder run #尝试运行,确定运行正常我们就可以导出玲珑包了
ll-builder export  #导出玲珑包

最终runtime.layer结尾的就是我们需要的玲珑包

image.png

看看最终运行效果:

image.png
本Demo源码下载:demo.zip
解压后在demo目录打开终端执行下面命令测试构建和运行

ll-builder build && ll-builder export && ll-builder run

小工具cplib,由ChatGPT编写,作用是读取二进制所依赖的库并复制到指定位置。
用法:

#用法:cplib   二进制文件位置    复制到目标位置
    ./cplib   bin/htop        lib

cplib.zip

image.png

Reply Favorite View the author
All Replies
璀璨星空
deepin
2024-05-25 01:24
#1

眼睛👀:原来如此。

脑子🧠:你确定你懂了?

Reply View the author
陈陈菌
deepin
2024-05-25 02:04
#2

不错,帖子来的很及时。

补充下 command 那里似乎可以 以 [echo, -e, hello world] 的这种形式使用多个参数。

Reply View the author
neko
deepin
Ecological co-builder
2024-05-25 02:16
#3
陈陈菌

不错,帖子来的很及时。

补充下 command 那里似乎可以 以 [echo, -e, hello world] 的这种形式使用多个参数。

学到了XD

Reply View the author
berners
deepin
Backbone of ecological co-construction group
2024-05-25 06:13
#4

出现gnome-sudoku: /lib/x86_64-linux-gnu/libm.so.6: version `GLIBC_2.38' not found (required by /opt/apps/gitlab.gnome.gnome-sudoku.linyaps/files/lib/libadwaita-1.so.0)
怎么解决?

Reply View the author
f@deepin
deepin
2024-05-25 06:22
#5

thanks

Reply View the author
neko
deepin
Ecological co-builder
2024-05-25 07:36
#6
berners

出现gnome-sudoku: /lib/x86_64-linux-gnu/libm.so.6: version `GLIBC_2.38' not found (required by /opt/apps/gitlab.gnome.gnome-sudoku.linyaps/files/lib/libadwaita-1.so.0)
怎么解决?

催玲珑更新org.deepin.foundation XD

Reply View the author
W2J
deepin
2024-05-25 10:55
#7

额,

libc.so.6 libm.so.b 这些基础lib支持能随便替换吗?很危险吧

Reply View the author
W2J
deepin
2024-05-25 10:57
#8

ChatGPT若随意替换lib基础,明显不怀好意。

Reply View the author
berners
deepin
Backbone of ecological co-construction group
2024-05-25 11:43
#9
W2J

ChatGPT若随意替换lib基础,明显不怀好意。

容器内有什么问题?

Reply View the author
neko
deepin
Ecological co-builder
2024-05-25 12:22
#10
berners

出现gnome-sudoku: /lib/x86_64-linux-gnu/libm.so.6: version `GLIBC_2.38' not found (required by /opt/apps/gitlab.gnome.gnome-sudoku.linyaps/files/lib/libadwaita-1.so.0)
怎么解决?

https://bbs.deepin.org/post/256555
可以参考这个

Reply View the author
神末shenmo
deepin
Spark-App
2024-05-25 14:08
#11
  find -type f ! -name '*.yaml' ! -name '*.layer' ! -name 'linglong' -exec cp --parents '{}' $PREFIX \;


一定要这样写吗

还是说可以手动放好

Reply View the author
zccrs
deepin
2024-05-25 14:51
#12
berners

出现gnome-sudoku: /lib/x86_64-linux-gnu/libm.so.6: version `GLIBC_2.38' not found (required by /opt/apps/gitlab.gnome.gnome-sudoku.linyaps/files/lib/libadwaita-1.so.0)
怎么解决?

你的这个不是自己编译的吧,直接复制的二进制?

Reply View the author
zccrs
deepin
2024-05-25 14:51
#13

教程写的通俗易懂,非常棒

Reply View the author
neko
deepin
Ecological co-builder
2024-05-25 15:29
#14
神末shenmo
  find -type f ! -name '*.yaml' ! -name '*.layer' ! -name 'linglong' -exec cp --parents '{}' $PREFIX \;


一定要这样写吗

还是说可以手动放好

可以手动放,我这样只是方便点全部复制过去

Reply View the author
W2J
deepin
2024-05-25 15:33
#15
berners

容器内有什么问题?

bwrap容器替换时,用cplib自然没问题,上下文误会了。

Reply View the author
阿顺呀
deepin
2024-05-26 21:04
#16

官方文档要玲珑1.5.0

我的是1.4.0 怎么升级
image.png

Reply View the author
neko
deepin
Ecological co-builder
2024-05-26 22:18
#17
阿顺呀

官方文档要玲珑1.5.0

我的是1.4.0 怎么升级
image.png

deepin23加内测源更新

Reply View the author
阿顺呀
deepin
2024-05-26 22:20
#18
neko

deepin23加内测源更新

我现在是V23RC 加了内测的

玲珑版本还是1.4.0

image.png

image.png

Reply View the author
neko
deepin
Ecological co-builder
2024-05-27 01:31
#19
阿顺呀

我现在是V23RC 加了内测的

玲珑版本还是1.4.0

image.png

image.png

dpkg -l |grep linglong

那个1.5版本是linglong-builder的不是ll-cli
执行这个看看
image.png

Reply View the author
阿顺呀
deepin
2024-05-27 08:22
#20

那应该没问题
image.png

Reply View the author