由于函数计算的各个语言环境内无法包含所有的依赖库,因此您使用FC组件成功部署项目后可能会调用失败。例如您编写的Python函数需要访问MySQL库,在调用函数时由于Python的运行环境内没有该库导致函数执行失败,因此在部署前需安装MySQL依赖库。本文介绍如何在各个语言下使用FC组件安装依赖。

前提条件

您已完成以下操作:

操作步骤

除了.NET Core外,Java、Node.js、Python、PHP和容器镜像都可以支持资源的快速构建。FC组件针对不同的语言分别支持以下包管理器manifest
  • Python pip包管理器的requirements.txt文件。
  • Node.js npm包管理器的package.json文件。
  • Java maven包管理器的pom.xml文件。
  • PHP包管理器的composer.json文件。
  • 容器镜像的dockerfile文件。

下文以Python 3为例,介绍如何安装依赖:

  1. 开发编辑源代码。
  2. 在项目目录中执行以下命令安装依赖:
    s build --use-docker

    执行该命令后,Serverless Devs会根据requirements.txt文件的内容下载对应的依赖至本地,并且将下载的依赖和源代码打包成交付产物ZIP包。

  3. 执行以下命令部署项目:
    s deploy

    执行部署命令后,Serverless Devs会根据交付产物ZIP包内的内容创建函数,同时设置依赖库的环境变量,便于函数直接引入对应的代码依赖库。在执行输出的过程中您可以看到添加的环境变量如下图所示:

下文以Node.js 10为例,介绍如何为Node.js类语言安装依赖:

  1. 开发编辑源代码。
  2. 在项目目录中执行以下命令安装依赖:
    s build --use-docker

    执行该命令后,Serverless Devs会根据package.json文件的内容下载对应的依赖至本地,并且将下载的依赖和源代码打包成交付产物ZIP包。

  3. 执行以下命令部署项目:
    s deploy

    执行部署命令后,Serverless Devs会根据交付产物ZIP包内的内容创建函数,同时设置依赖库的环境变量,便于函数直接引入对应的代码依赖库。在执行输出的过程中您可以看到

下文以Java 8为例,介绍如何为Java类语言安装依赖:

  1. 开发编辑源代码(图示中①)。
  2. 在项目目录中执行以下命令,编译Java工程安装依赖:
    s build --use-docker

    执行该命令后,Serverless Devs会根据pom.xml文件的内容下载对应的依赖至本地,并且将下载的依赖和源代码打包成交付产物ZIP包(图示中②)。

  3. 执行以下命令部署项目:
    s deploy

    执行部署命令后,Serverless Devs会根据交付产物ZIP包内的内容创建函数,同时设置依赖库的环境变量,便于函数直接引入对应的代码依赖库。在执行输出的过程中您可以看到添加的环境变量如下图所示:

下文以PHP 7.2为例,介绍如何为PHP类语言安装依赖:

  1. 开发编辑源代码(图示中①)。
  2. 在项目目录中执行以下命令安装依赖:
    s build --use-docker

    执行该命令后,Serverless Devs会根据composer.json文件的内容下载对应的依赖至本地,并且将下载的依赖和源代码打包成交付产物ZIP包(图示中②)。

  3. 执行以下命令部署项目:
    s deploy

    执行部署命令后,Serverless Devs会根据交付产物ZIP包内的内容创建函数,同时设置依赖库的环境变量,便于函数直接引入对应的代码依赖库。在执行输出的过程中您可以看到添加的环境变量如下图所示:

下文以Custom Container为例,介绍如何为容器镜像类语言安装依赖:

  1. 开发编辑源代码,修改s.yml文件,将文件内的image修改成您的ACR镜像。
  2. 在项目目录中执行以下命令安装依赖:
    s build --use-docker --dockerfile ./Dockerfile

    执行该命令后,Serverless Devs会根据dockerfile文件的内容下载对应的依赖至本地,并且将下载的依赖和源代码打包成交付产物ZIP包。

  3. 执行以下命令部署项目:
    s deploy -y

更多信息

在代码包的场景中,除了各个语言的库以外,还有一种更复杂的情况。例如在函数计算中部署Puppeteer应用,如果该应用的运行环境为Node.js,Puppeteer库还需要安装底层的So库,例如apt-get.list

  1. 创建Puppeteer项目,然后开发编辑源代码(图示中①)。
    在目标目录中执行以下命令,初始化项目。
    s init devsapp/start-puppeteer -d start-puppeteer
    说明 -d用于指定项目名称,本示例以start-puppeteer为例。
  2. 进入项目目录。
    初始化项目的模板内包含Node.js+NAS部署和Container部署两种部署模式,本文介绍如何通过Node.js+NAS部署项目。
    1. 在项目目录中执行以下命令,进入项目目录:
      cd start-puppeteer
    2. start-puppeteer项目内执行以下命令,进入nodejs12项目。
      cd nodejs12
  3. 安装依赖。执行该命令后,Serverless Devs会根据package.jsonapt-get.list文件的内容将对应的依赖下载至本地,并且将下载的依赖和源代码打包成交付产物ZIP包(图示中②)。
    说明 通过该步骤下载的依赖与源代码打包成的交付产物ZIP包内不包含.fcignore文件。因为下载的依赖会被直接上传到NAS内,同时,打包成的交付产物ZIP包也会比较小。
    1. 执行以下命令安装依赖:
      s build --use-docker
    2. 可选:执行以下命令,初始化NAS。
      当您的s.yml文件内的nasConfig参数设置为Auto时,您可以执行该命令创建NAS;当您已经指定了nasConfig参数,则无需执行该命令。
      s nas init
    3. 执行以下命令将下载的apt-get依赖库上传至NAS。同时,apt-get库会被自动添加至LD_LIBRARY_PATH内(图示中③)。
      s nas upload -r -n ./.s/build/artifacts/puppeteer-nodejs12/html2png/.s/root /mnt/auto/root
    4. 执行以下命令将下载的npm依赖库上传至NAS(图示中④)。
      s nas upload -r -n ./.s/build/artifacts/puppeteer-nodejs12/html2png/node_modules  /mnt/auto/node_modules
  4. 执行以下命令,运行本地函数:
    s local start
    执行输出:
    [2021-08-11T11:03:46.053] [INFO ] [FC-LOCAL-INVOKE] - HttpTrigger httpTrigger of puppeteer-nodejs12/html2png was registered
        url: http://localhost:7928/2016-08-15/proxy/puppeteer-nodejs12/html2png/
        methods: GET,POST,PUT
        authType: anonymous
    
    Tips for next step
    ======================
    * Deploy Resources: s deploy
    fc-puppeteer-nodejs12-html2png:
      status: succeed
    
    function compute app listening on port 7928!
  5. 执行以下命令,部署函数:
    s deploy
    执行部署命令后,Serverless Devs会根据交付产物ZIP包内的内容创建函数,同时设置依赖库的环境变量,便于函数直接引入对应的代码依赖库。在执行输出的过程中您可以看到添加的环境变量如下图所示:serverlessdevs5gaojishezhi