在 Linux Web App 上安装 Weasyprint 和 Cairo 时遇到问题
Posted
技术标签:
【中文标题】在 Linux Web App 上安装 Weasyprint 和 Cairo 时遇到问题【英文标题】:Trouble installing Weasyprint & Cairo on Linux Web App 【发布时间】:2021-03-01 00:31:41 【问题描述】:我有一个使用 Weasyprint 生成 PDF 输出的 Django 应用程序。这在我的本地开发机器上运行良好。
我能够成功部署到 Azure Web Apps,但收到以下错误消息:
2020-11-17T07:34:14.287002623Z OSError: no library called "cairo" was found
2020-11-17T07:34:14.287006223Z no library called "libcairo-2" was found
2020-11-17T07:34:14.287009823Z cannot load library 'libcairo.so.2': libcairo.so.2: cannot open shared
object file: No such file or directory
2020-11-17T07:34:14.287016323Z cannot load library 'libcairo.2.dylib': libcairo.2.dylib: cannot open
shared object file: No such file or directory
2020-11-17T07:34:14.287020123Z cannot load library 'libcairo-2.dll': libcairo-2.dll: cannot open
shared object file: No such file or directory
根据 Weasyprint 的文档 (https://weasyprint.readthedocs.io/en/stable/install.html#debian-ubuntu),我尝试通过如下所示的自定义部署脚本进行推荐安装:
jobs:
build:
name: Build and Deploy
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Python $ env.PYTHON_VERSION
uses: actions/setup-python@v2
with:
python-version: $ env.PYTHON_VERSION
- name: Install dependencies
run: |
sudo apt-get install build-essential python3-dev python3-pip python3-setuptools python3-wheel python3-cffi libcairo2 libpango-1.0-0 libpangocairo-1.0-0 libgdk-pixbuf2.0-0 libffi-dev shared-mime-info
python -m pip install --upgrade pip
pip install -r requirements.txt
- name: Deploy Web App using GH Action azure/webapps-deploy
uses: azure/webapps-deploy@v2
with:
app-name: $ env.AZURE_WEBAPP_NAME
publish-profile: $ secrets.AZURE_WEBAPP_PUBLISH_PROFILE
package: $ env.AZURE_WEBAPP_PACKAGE_PATH
但是,我的问题仍然存在,我仍然收到相同的消息。
有人有在基于 Linux 的 Web 应用程序上安装 Weasyprint 和 Cairo 的经验吗?
感谢您提前提供的任何帮助。
更新
目前,我可以使用 Azure 创建的默认部署脚本进行部署(如下所示)。然后我可以通过 SSH 连接到部署机器并手动激活虚拟环境并安装必要的软件包。此过程有效,我的应用程序现在按预期工作。
我想以某种方式将此命令滚动到部署过程中(作为默认脚本的一部分或通过部署后操作)。
GITHUB 操作部署脚本
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
- name: Set up Python version
uses: actions/setup-python@v1
with:
python-version: '3.6'
- name: Build using AppService-Build
uses: azure/appservice-build@v2
with:
platform: python
platform-version: '3.6'
- name: 'Deploy to Azure Web App'
uses: azure/webapps-deploy@v2
with:
app-name: appname
slot-name: slotname
publish-profile: profilename
手动虚拟环境激活和安装
source /home/site/wwwroot/pythonenv3.6/bin/activate
sudo apt-get install additional packages
【问题讨论】:
很难说,我会冒险猜测你的本地机器有一个GUI,而你的Azure服务器很可能没有;因此它将缺少cairo
以及可能的其他一些库及其开发对应物......您正在运行哪个版本的 Linux,无论是在您的开发盒还是在您的 azure 实例中?
所以我实际上只是能够通过 SSH 手动解决这个问题到部署机器并手动激活虚拟环境并安装 Weasyprint 文档中推荐的软件包。但是,每次部署新版本时,我都必须重新执行此操作。有没有办法在部署脚本中包含这些依赖项的安装?
您能否在没有任何机密信息和业务的情况下分享您的演示代码。所以我们可以尝试解决它并帮助您。
谢谢杰森。我添加了当前有效的代码并生成了一个有效的应用程序。但是,我想简化这是一个两步流程。
我已经回复了你所有的三个帖子。我已经尝试了所有需要为您使用的方法。你可以尝试自己执行,应该对你有用,如果不行,请提出支持票寻求官方帮助。
【参考方案1】:
需要的依赖和你要安装的东西都可以成功添加到.yml文件中,但是对你的webapp是否生效还需要测试,具体问题需要详细分析。
如果不行,建议手动安装 ssh。
我将 .yml 文件中的 linux 命令添加到 apt-get install xxx
。
更多详情,
下面是我的.yml
文件。它工作正常。
# Docs for the Azure Web Apps Deploy action: https://github.com/Azure/webapps-deploy
# More GitHub Actions for Azure: https://github.com/Azure/actions
name: Build and deploy Python app to Azure Web App - pyodbcInstallENV
on:
push:
branches:
- master
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
- name: Set up Python version
uses: actions/setup-python@v1
with:
python-version: '3.8'
- name: Install custom env
run: |
cd /home
sudo apt-get update
sudo apt-get install g++
sudo apt-get install unixodbc-dev
pip install pyodbc
- name: Build using AppService-Build
uses: azure/appservice-build@v2
with:
platform: python
platform-version: '3.8'
- name: 'Deploy to Azure Web App'
uses: azure/webapps-deploy@v2
with:
app-name: 'pyodbcInstallENV'
slot-name: 'production'
publish-profile: $ secrets.AzureAppService_PublishProfile_d712769***2017c9521
【讨论】:
以上是关于在 Linux Web App 上安装 Weasyprint 和 Cairo 时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章