从源码编译OnlyOffice

环境要求

1
2
系统: Ubuntu 14.04
网络: 必须科学上网

为什么要求科学上网?
OnlyOffice源码存放在github上,且编译时会从google服务器下载v8相关资源,所以必须科学上网

说明

  • 锚定build_toolsgit版本:be06b3c2c8df1559d2198d3c7e186a9d5913799f

  • /build_tools路径指的是OnlyOffice编译工具仓库clone后的本地地址

  • OnlyOffice连接数限制在build_tools同级目录/server/Common/sources/contants.js

    1
    2
    // 改为9999就可以无限连接数
    exports.LICENSE_CONNECTIONS = 20;

Linux下源码编译步骤

  • 1.build_tools工具下载
1
git clone https://github.com/ONLYOFFICE/build_tools.git
  • 2.相关资源预下载

    • node环境准备

      这里不再介绍如何安装node,但有以下几点需要注意:

      • node版本必须大于10.20

      • 如果想使用国内的npm镜像,例如淘宝的npm镜像,我在尝试的时候发现一些包不能正确安装,因此最好是科学上网,不使用镜像

      • 每一次编译的时候,build_tools都会尝试全局安装grunt-clipkg这两个包,因此可以提前安装好,然后修改build_tools源码,避免每次都安装

        • npm安装grunt-clipkg
        1
        2
        npm install -g grunt-cli
        npm install -g pkg
        • 修改\build_tools\tools\linux\deps.py中源码,注释掉以下两行
        1
        2
        # base.cmd("sudo", ["npm", "install", "-g", "grunt-cli"])
        # base.cmd("sudo", ["npm", "install", "-g", "pkg"])
    • java环境准备

      这里不再介绍具体的java安装,但须注意以下几点:

      • java版本仅支持11,1.8

      • 编译的时候每次都会尝试全局安装open-jdk,如果java环境已经配置好,可以修改\build_tools\tools\linux\deps.py中源码,注释掉以下几行

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      # java_error = base.cmd("sudo", ["apt-get", "-y", "install", "openjdk-11-jdk"], True)
      # if (0 != java_error):
      # java_error = base.cmd("sudo", ["apt-get", "-y", "install", "openjdk-8-jdk"], True)
      # if (0 != java_error):
      # base.cmd("sudo", ["apt-get", "-y", "install", "software-properties-common"])
      # base.cmd("sudo", ["add-apt-repository", "-y", "ppa:openjdk-r/ppa"])
      # base.cmd("sudo", ["apt-get", "update"])
      # base.cmd("sudo", ["apt-get", "-y", "install", "openjdk-8-jdk"])
      # base.cmd("sudo", ["update-alternatives", "--config", "java"])
      # base.cmd("sudo", ["update-alternatives", "--config", "javac"])
    • qt环境准备

      qt版本:5.9.9

      具体下载地址:https://mirrors.tuna.tsinghua.edu.cn/qt/archive/qt/5.9/5.9.9/single/qt-everywhere-opensource-src-5.9.9.tar.xz

      • 重命名
        下载后将文件名改为qt_source_5.9.9.tar.xz并放置在/build_tools/tools/linux文件夹下

      • 解压
        解压/build_tools/tools/linux/qt_source_5.9.9.tar.xz/build_tools/tools/linux/qt-everywhere-opensource-src-5.9.9文件加下

    为什么需要资源预下载
    如果不预下载一些资源,会在编译时自动下载.但是编译时下载的资源很慢,碰上网络波动,极易造成编译失败

  • 3.编译

进入/build_tools/tools/linux目录下

1
./automate.py server

编译完成后,可以在/build_tools/out下看到最终编译产物

初始编译通过后,如果不需要更新OnlyOffice的代码,需要修改/build_tools/tools/linux/automate.py

1
2
3
4
5
build_tools_params = ["--branch", branch, 
"--module", modules,
# 这里需要把1改为0,这样后面就不会更新仓库
"--update", "0",
"--qt-dir", os.getcwd() + "/qt_build/Qt-5.9.9"] + params
  • 4.编译字体与主题

第3步,编译产物/build_tools/out下没有字体与主题资源,所以还需要生成字体与主题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/bin/bash
cd /build_tools/out/linux_64/onlyoffice/documentserver

# 如果fonts文件夹不存在
if [ ! -d "fonts" ]; then
mkdir fonts
fi
# 在/build_tools/out/linux_64/onlyoffice/documentserver/fonts下生成字体
LD_LIBRARY_PATH=${PWD}/server/FileConverter/bin server/tools/allfontsgen \
--input="${PWD}/core-fonts" \
--allfonts-web="${PWD}/sdkjs/common/AllFonts.js" \
--allfonts="${PWD}/server/FileConverter/bin/AllFonts.js" \
--images="${PWD}/sdkjs/common/Images" \
--selection="${PWD}/server/FileConverter/bin/font_selection.bin" \
--output-web='fonts' \
--use-system="true"

# 生成主题
cd /build_tools/out/linux_64/onlyoffice/documentserver
LD_LIBRARY_PATH=${PWD}/server/FileConverter/bin server/tools/allthemesgen \
--converter-dir="${PWD}/server/FileConverter/bin"\
--src="${PWD}/sdkjs/slide/themes"\
--output="${PWD}/sdkjs/common/Images"