公司有个项目要实现一个word文档预览的功能,经过一番调用后最终确定了两个组件Libreoffice和OpenOffice,经过对比后感觉libreOffice更成熟一点。当时估计这个小功能,一上午就搞定了,但最终花了3天才搞定,特意记录下踩坑过程,以供后人参考。
当时为啥这么乐观?
看看LibreOffice的官网,有现成的deb安装包(麒麟系统和Ubuntu类似),只要下载下来拷贝到服务器上只要简单的执行下 sudo dpkg -i *.deb 命令就搞定了。
悲催的一天
第二天上午一边喝着咖啡,一边准备安装了,安装的过程闭着眼都能完成 ,先用tar解压,然后dpkg 安装,但当按下回车键的时候才意识到忽略了一个重要的点,忘记看服务器是什么架构了,果然屏幕上提示:
软件包体系架构(amd64)与本机系统体系结构(arm64)不符dpkg: 处理归档 libreoffice6.3-en-us_6.3.4.2-2_amd64.deb (--install)时出错:软件包体系架构(amd64)与本机系统体系结构(arm64)不符dpkg: 处理归档 libreoffice6.3-impress_6.3.4.2-2_amd64.deb (--install)时出错:软件包体系架构(amd64)与本机系统体系结构(arm64)不符
从服务器上下载的是amd架构的,而麒麟服务器是arm架构的,而官网没有提供安装包,因为服务不能上网,所以没法用apt install这样的命令,看来只能通过源码编译了。编译的过程是痛苦的,依赖这个软件依赖的包太多了
一直搞到下班也没把依赖包找全,感觉此路不通,源码编译的方案不可行
又是忙碌的一天
既然源码编译不可行,那么通过去deb镜像上把所有这些安装的依赖包及LibreOffice包全部下载下来再安装,感觉这个方案可行,说干就干,依赖包有几百个,估计的下载到明年啦,程序员吗怎么可能那么傻,写个下载包的工具下载吧,经过一上午的折腾终于包300个相关版本的包都下载下来了,又是一边喝着咖啡,一边敲入dpkg命令,然后令人沮丧的事又出现了,满屏幕都是找不到依赖错误。完了此路又不通。
https://packages.debian.org/sid/libreoffice
终于安装成功了
仔细想想感觉还是对这个Ubuntu系统不熟悉,以前都是用Centos的,这么搞的话完全是蛮力,太费劲了。仔细考虑了,感觉太太傻了,完全可以搞一台能上网的机器,只要这个机器的架构和系统都和服务器一样不就行了,然后简单的用apt命令就能把依赖包都下载到本地缓存中
-d参数只下载依赖包但不安装,会下载到/var/cache/apt/archives下面
/apt/archivesapt install libreoffice -d
但是新的问题又出现了,默认镜像地址都是国外的,索引速度奇慢,而且有的地址还被和谐了,所以只能编辑了镜像源文件,修改成阿里或163的镜像
vi /etc/apt/sources.list
在文件中加入
# https://opsx.alibaba.com/mirrordeb https://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse deb https://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse deb https://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse deb https://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse deb https://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
然后执行更新索引
apt update
但还是提示无法更新arm包索引,这就不对了,大家都可以,为啥我这就不行了,肯定哪里出问题了,仔细查看了错误信息,有一部分索引更新成功了,但就是arm索引更新不了,那只有一种可能了,就是上面的镜像地址里没有arm的镜像地址经过一番百度后,终于在某篇文章里找到了答案,arm架构下镜像要将ubuntu改成ubuntu-ports即可,然后再次更新索引成功了
ubuntu 16.04 配置如下deb http://mirrors.aliyun.com/ubuntu-ports/ xenial maindeb-src http://mirrors.aliyun.com/ubuntu-ports/ xenial main deb http://mirrors.aliyun.com/ubuntu-ports/ xenial-updates maindeb-src http://mirrors.aliyun.com/ubuntu-ports/ xenial-updates main deb http://mirrors.aliyun.com/ubuntu-ports/ xenial universedeb-src http://mirrors.aliyun.com/ubuntu-ports/ xenial universedeb http://mirrors.aliyun.com/ubuntu-ports/ xenial-updates universedeb-src http://mirrors.aliyun.com/ubuntu-ports/ xenial-updates universe deb http://mirrors.aliyun.com/ubuntu-ports/ xenial-security maindeb-src http://mirrors.aliyun.com/ubuntu-ports/ xenial-security maindeb http://mirrors.aliyun.com/ubuntu-ports/ xenial-security universedeb-src http://mirrors.aliyun.com/ubuntu-ports/ xenial-security universe
剩下就不用说了,顺利的将deb包下载到了apt缓存目录下,然后用u盘拷贝到服务器上再次执行dpkg命令成功安装上了libreoffice,这个过程也可能会提示依赖问题,需要执行以下 sudo apt install -f -y 命令解决下依赖
如果安装成功,会安装到 /usr/lib/libreoffice目录下,转换一个文档试试
#windows
soffice.exe --headless --invisible --convert-to pdf e:\tmp\123.docx --outdir e:\tmp
linux
/usr/bin/libreoffice6.3 --headless --invisible --convert-to pdf /tmp/123.docx --outdir /tmp
终极解决方案
另一种更简单的解决方案,我想聪明的小伙伴,一定想到了,那就是docker
先在能上网的机器上制造镜像文件:
首先先编写一个Dockerfile文件,例如:
FROM ubuntu16.04
...
RUN apt-get install -y libreoffice
....
编译
docker build -t libreoffice:6.3
查看镜像
docker images
导出镜像
docker save 38463a656de8> /root/libreoffice.tar
在无网服务器上导入镜像
docker load < /root/libreoffice.tar
启动docker
docker run --name libreoffice -v /opt/libreoffice/data:/opt/data -p 8089:8089 -d libreoffice:6.3
一些思考
在项目开发过程中不能忽略任何细节,否则会造成盲目的乐观,造成项目延时;还有就是不能埋头把所有方案都试一遍,虽然最终找到了一个解决方案,但中间过程肯定耗费不少时间,所以遇到问题一开始就要把所有解决方案都列举出来,综合比较后选择一个性价比最高的方案。