
# 函数工程打包规范
#### 打包规范说明
函数除了支持在线编辑代码，还支持上传ZIP、JAR、引入OBS文件等方式上传代码，上传操作过程请参见[配置函数代码](https://support.huaweicloud.com/usermanual-functiongraph/functiongraph_01_0152.html)，函数工程的打包规范说明如[表1]所示。
 表1函数工程打包规范 
| 编程语言    | JAR包                           | ZIP包                                                                                                                                                                                                                                                                                                                                                                                       | OBS文件                  |
|:---|:---|:---|:---|
| Node.js | 不支持该方式                         | - 假如函数工程文件保存在"\~/Code/"文件夹下，在打包的时候务必进入Code文件夹下选中所有工程文件进行打包，确保入口函数是程序执行的入口，确保解压后，入口函数所在的文件位于根目录。  - 如果函数工程引入了第三方依赖，可以将第三方依赖打成ZIP包，在函数代码界面设置外部依赖包；也可以将第三方依赖和函数工程文件一起打包。   | 将工程打成ZIP包，上传到OBS存储桶。   |
| PHP     | 不支持该方式                         | - 假如函数工程文件保存在"\~/Code/"文件夹下，在打包的时候务必进入Code文件夹下选中所有工程文件进行打包，确保入口函数是程序执行的入口，确保解压后，入口函数所在的文件位于根目录。  - 如果函数工程引入了第三方依赖，可以将第三方依赖打成ZIP包，在函数代码界面设置外部依赖包；也可以将第三方依赖和函数工程文件一起打包。                | 将工程打成ZIP包，上传到OBS存储桶。   |
| Python  | 不支持该方式                         | - 假如函数工程文件保存在"\~/Code/"文件夹下，在打包的时候务必进入Code文件夹下选中所有工程文件进行打包，确保入口函数是程序执行的入口，确保解压后，入口函数所在的文件位于根目录。  - 如果函数工程引入了第三方依赖，可以将第三方依赖打成ZIP包，在函数代码界面设置外部依赖包；也可以将第三方依赖和函数工程文件一起打包。            | 将工程打成ZIP包，上传到OBS存储桶。   |
| Java    | 如果函数没有引用第三方件，可以直接将函数工程编译成Jar包。 | 如果函数引用第三方件，将函数工程编译成Jar包后，将所有依赖三方件和函数JAR包打成ZIP包。                                                                                                                                                                                                                                                                                                                                            | 将工程打成ZIP包，上传到OBS存储桶。   |
| Go 1.x  | 不支持该方式                         | 必须在编译之后打ZIP包，编译后的二进制文件必须与执行函数入口保持一致，例如二进制名称为Handler，则执行入口为Handler。                                                                                                                                                                                                                                                                                                                         | 将工程打成ZIP包，上传到OBS存储桶。   |
| C#      | 不支持该方式                         | 必须在编译之后打ZIP包，必须包含"工程名.deps.json"，"工程名.dll"，"工程名.runtimeconfig.json"，"工程名.pdb"和"HC.Serverless.Function.Common.dll"文件。                                                                                                                                                                                                                                                                       | 将工程打成ZIP包，直接上传到OBS存储桶。 |
| Cangjie | 不支持该方式                         | 必须在编译之后打ZIP包，编译后的二进制文件必须与执行函数入口保持一致，例如二进制名称为libuser_func_test_success.so，则执行入口为libuser_func_test_success.so。                                                                                                                                                                                                                                                                               | 将工程打成ZIP包，上传到OBS存储桶。   |
| 定制运行时   | 不支持该方式                         | 打ZIP包，必须包含"bootstrap"可执行引导文件。                                                                                                                                                                                                                                                                                                                                                              | 将工程打成ZIP包，直接上传到OBS存储桶。 |
   
#### ZIP工程包示例
- Nods.js工程ZIP包目录示例
  ```
  Example.zip                            示例工程包
  |--- lib                               业务文件目录
  |--- node_modules                      npm三方件目录
  |--- index.js                          入口js文件（必选）
  |--- package.json                      npm项目管理文件
  ```
  
- PHP工程ZIP包目录示例
  ```
  Example.zip                            示例工程包
  |--- ext                               扩展库目录
  |--- pear                              PHP扩展与应用仓库
  |--- index.php                         入口PHP文件
  ```
  
- Python工程ZIP包目录示例
  ```
  Example.zip                            示例工程包
  |--- com                               业务文件目录
  |--- PLI                               第三方依赖PLI目录
  |--- index.py                          入口py文件（必选）
  |--- watermark.py                      实现打水印功能的py文件
  |--- watermark.png                     水印图片
  ```
  
- Java工程ZIP包目录示例
  ```
  Example.zip                            示例工程包
  |--- obstest.jar                       业务功能JAR包
  |--- esdk-obs-java-3.20.2.jar          第三方依赖JAR包
  |--- jackson-core-2.10.0.jar           第三方依赖JAR包
  |--- jackson-databind-2.10.0.jar       第三方依赖JAR包
  |--- log4j-api-2.12.0.jar              第三方依赖JAR包
  |--- log4j-core-2.12.0.jar             第三方依赖JAR包
  |--- okhttp-3.14.2.jar                 第三方依赖JAR包
  |--- okio-1.17.2.jar                   第三方依赖JAR包
  ```
  
- Go工程ZIP包目录示例
  ```
  Example.zip                            示例工程包
  |--- testplugin.so                     业务功能包
  ```
  
- C#工程ZIP包目录示例
  ```
  Example.zip                                   示例工程包
  |--- fssExampleCsharp2.0.deps.json            工程编译产生文件
  |--- fssExampleCsharp2.0.dll                  工程编译产生文件
  |--- fssExampleCsharp2.0.pdb                  工程编译产生文件
  |--- fssExampleCsharp2.0.runtimeconfig.json   工程编译产生文件
  |--- Handler                                  帮助文件，可直接使用
  |--- HC.Serverless.Function.Common.dll        函数工作流提供的dll
  ```
  
- Cangjie工程ZIP包目录示例
  ```
  fss_example_cangjie.zip                  示例工程包
  |--- libuser_func_test_success.so        业务功能包
  ```
  
- 定制运行时
  ```
  Example.zip                                   示例工程包
  |--- bootstrap                                可执行引导文件
  ```
  
 
