全部产品
云市场
云游戏

使用 fun build 构建代码包

更新时间:2019-12-30 20:59:54

在很多场景,源码距离交付物其实是有一定的距离,比如 java,写完 java 代码后,还要考虑如何编译、打包的问题。而对于函数计算来说,由于其只能接受一个 zip 或 jar 包,我们还要想一些方法,将我们的代码编译产物及其依赖一同打包的一个 jar 中,然后交付。Fun Build 的职责就是完成从源码到交付产物的构建过程。

fun build 功能介绍

使用 fun build -h 可以查看 build 的帮助文档:

  1. $ fun build -h
  2. Usage: fun build [options] [[service/]function]
  3. Build the dependencies.
  4. Options:
  5. -u, --use-docker Use docker container to build functions
  6. -t, --template [template] path of fun template file.
  7. -h, --help output usage information

最简单的使用方法是直接使用 fun build,如果想编译某个函数,可以使用 fun build serviceName/functionName 或者 fun build functionName。

默认情况下,fun build 构建时,是直接在宿主机上构建的,如果想避免因为环境差异带来的部署后的不兼容问题,可以在 build 时,指定 -u 或者 —use-docker 参数,表示会在本地使用函数计算模拟环境进行编译。

如果 template.yml 不在当前目录,可以通过 fun build -t templatePath 的方式指定。

Fun Build 的行为是将 template.yml 中列出的函数进行构建(不指定具体函数,则默认编译所有函数)。

使用示例

  1. # 使用 fun build 对所有函数进行构建
  2. fun build
  3. # 使用 fun build 并且以本地模拟环境对所有函数进行构建
  4. fun build --use-docker
  5. # 使用 fun build 进行构建,构建完成后,立刻进行调用
  6. fun build && fun local invoke
  7. # 使用 fun build 进行构建,构建完成后,立刻进行部署
  8. fun build && fun deploy

fun build 构建流程

Fun Build 的构建流程可以理解为,去函数代码目录查找特定的 manifest 文件(清单文件),然后根据这些 manifest 文件进行特定的构造、依赖下载、编译等操作。

目前 Fun 针对不同的语言分别提供了一些其主流的包管理器 manifest 文件的支持

  1. Fun 本身定义的不限语言的 Funfile
  2. java maven 包管理器的 pom.xml
  3. node npm 包管理器的 package.json
  4. python pip 包管理器的 requirements.txt
  5. php composer 包管理器的 composer.json

比如,我这里有一个包含 php7.2、python2.7、python3、nodejs6、nodejs8、java8 的示例 template.yml 。

  1. // 省略部分属性配置 ... ...
  2. Resources:
  3. localdemo:
  4. Type: 'Aliyun::Serverless::Service'
  5. php72:
  6. Type: 'Aliyun::Serverless::Function'
  7. Properties:
  8. Runtime: php7.2
  9. // 省略其它属性配置 ... ...
  10. python27:
  11. Type: 'Aliyun::Serverless::Function'
  12. Properties:
  13. Runtime: python2.7
  14. // 省略其它属性配置 ... ...
  15. python3:
  16. Type: 'Aliyun::Serverless::Function'
  17. Properties:
  18. Runtime: python3
  19. // 省略其它属性配置 ... ...
  20. nodejs6:
  21. Type: 'Aliyun::Serverless::Function'
  22. Properties:
  23. Runtime: nodejs6
  24. // 省略其它属性配置 ... ...
  25. nodejs8:
  26. Type: 'Aliyun::Serverless::Function'
  27. Properties:
  28. Runtime: nodejs8
  29. // 省略其它属性配置 ... ...
  30. java8:
  31. Type: 'Aliyun::Serverless::Function'
  32. Properties:
  33. Runtime: java8
  34. // 省略其它属性配置 ... ...

当执行 fun build 时,会对这些函数依次进行构建,构建的产物,会被存放到项目根目录的 .fun/build/artifacts/ 目录。

Build 示例

Java 示例

下面是一个初始化、构建、运行、修改、构建、运行的 java 示例:

总结

使用 fun build 可以直接实现从源码到交付产物的构建过程,节省用户的配置成本。