本文介绍如何通过fun build将源码构建成交付产物。

注意 本文介绍的内容后期将不再维护。如果您的函数计算资源是使用Funcraft管理的,建议您将资源迁移至Serverless Devs管理。

关于如何将函数计算的相关资源从Funcraft迁移到Serverless Devs进行管理的详细操作,请参见从Funcraft迁移到Serverless Devs

关于Serverless Devs的详细信息,请参见什么是Serverless Devs

关于如何使用Serverless Devs安装依赖,请参见使用s build的相关命令安装依赖

由此带来的不便,敬请谅解!

背景信息

源码并不等于交付产物,例如Java型编译语言,您写好Java型代码后,不能直接上传代码,您还需要进行编译及打包,编译及打包的结果属于交付产物。由于函数计算只能接受一个ZIP包或JAR包,所以您需要将代码交付产物及其依赖一同打包到一个JAR包中,然后交付。

使用fun build的构建过程可以理解为,Funcraft在函数代码目录中查找特定的manifest文件(清单文件)并根据manifest文件进行构造、下载依赖及编译。

目前Funcraft针对不同的语言分别支持一些主流的包管理器manifest文件。
  • Funcraft定义的不限语言的Funfile文件。更多信息,请参见使用fun install安装第三方依赖
  • Java maven包管理器的pom.xml文件。
  • Node.js npm包管理器的package.json文件。
  • Python pip包管理器的requirements.txt文件。
  • PHP composer包管理器的composer.json文件。

fun build功能介绍

执行以下命令获取fun build的相关功能介绍。
fun build -h
预期输出:
Usage: fun build [options] [[service/]function]

Build the dependencies.

Options:
  -d, --use-docker           Use docker container to build functions
  -t, --template [template]  The path of fun template file.
  -h, --help                 display help for command

操作步骤

本文以Java8为例,介绍如何构建交付产物。

  1. 在函数根目录下新建一个template.yml文件,例如/tmp/code/template.yml。具体信息,请参见template.yml,文件内容修改如下。
    ROSTemplateFormatVersion: '2015-09-01'
    Resources:
      Services:
        Type: 'Aliyun::Serverless::Service'
        Properties:
          Policies:
            - AliyunOSSFullAccess
        Function:
          Type: 'Aliyun::Serverless::Function'
          Properties:
            Handler: main.main_handler
            Runtime: java8
            CodeUri: './'

    template.yml的含义如下:声明一个名为Services的服务,在这个服务下,声明一个名为Function的函数,配置函数入口为main.main_handler,函数的Runtime为java8,并指定CodeUri为当前目录。在部署时,Funcraft会将CodeUri指定的目录打包上传。

  2. 您可以通过以下方式构建源代码:
    • 直接执行以下命令构建。
      fun build
    • 指定函数名称进行构建,<your functionName>需替换为您的函数的名称,例如Function
      fun build <your functionName>
    • 指定函数及服务名称进行构建,<your serviceName>/<your functionName>需替换为您的服务及函数的名称,例如Services/Function
      fun build <your serviceName>/<your functionName>
    以上三种构建方式的预期输出一致,如下所示。
    using template: template.yml
    start building function dependencies without docker
    
    building Services/Function
    
    Build Success
    
    Built artifacts: .fun\build\artifacts
    Built template: .fun\build\artifacts\template.yml
    
    Tips for next step
    ======================
    * Invoke Event Function: fun local invoke
    * Invoke Http Function: fun local start
    * Deploy Resources: fun deploy
    说明
    • 默认情况下,fun build可以直接在宿主机上构建,如果想避免因为环境差异带来部署后的不兼容问题,您可以在构建时指定-d--use-docker参数,表示会在本地使用函数计算模拟环境进行编译。
    • 如果template.yml不在当前目录下,您可以通过fun build -t templatePath的方式指定。
    • fun build是将template.yml中列出的函数进行构建,如果不指定具体函数,则默认编译所有函数。

更多信息

您可以通过以下方式进行构建或其他操作:
  • 通过以下命令对template.yml文件中的所有函数进行构建。
    fun build 
  • 通过以下命令以本地模拟环境对所有函数进行构建。
    fun build --use-docker 
  • 通过以下命令进行构建及调用。
    fun build && fun local invoke
  • 通过以下命令进行构建及部署。
    fun build && fun deploy  

构建示例

以下是一个初始化、构建、运行及修改Java的示例。

build_java