我希望能够跨多个 Digital Ocean Functions(他们的无服务器工具)重复使用代码。如果可以避免的话,我不想发布一个库。
我尝试了几种方法,但我愿意做任何事情来让它发挥作用。
我的第一次尝试是使用具有多个函数入口点的单个文件。
在
packages/tom/
下我有文件tomsfns.py
:
def t1():
return { "body", make_msg("T1") }
def t2():
return { "body", make_msg("T2") }
def make_msg(caller):
return "Hello " + caller
像吐司一样愚蠢,但应该可以正常工作。在 project.yml 中的包下,我有以下内容:
- name: tom
functions:
- name: tomsfns
main: t1
binary: false
runtime: python:3.11
web: false
- name: tomsfns
main: t2
binary: false
runtime: python:3.11
web: false
部署时实际发生的情况是,您将获得一个函数、
tom/tomsfns
以及该单个文件中的全部代码。我希望的是同一代码库中的两个函数,即使它们重复了代码。
我的第二次尝试是将所需的实用程序分解为它自己的 python 文件,然后让单独的文件调用它。这是对我来说最有意义但也不起作用的“风格”。
其结构和全部内容都是:
packages
rick
r1.py
import make_msg
def main():
return { "body": make_msg("R1") }
r2.py
import make_msg
def main():
return { "body": make_msg("R2") }
rickutils.py
def make_msg(caller):
return "Hello " + caller
(开始:在原帖后添加)
相关的project.yml为:
- name: rick
functions:
- name: r1
runtime: python:3.11
web: false
- name: r2
runtime: python:3.11
web: false
(完:在原帖后添加)
这会在已发布的函数中产生看似正确的结构和代码:
Deployed functions ('doctl sls fn get <funcName> --url' for URL):
- rick/r1
- rick/r2
- rick/rickutils
- tom/tomsfns
但是
stderr: Invalid function: No module named 'make_msg'
我已经尝试了我能想到的导入语句和文件位置的所有组合,以将该方法放入函数代码中,但没有任何效果。
有人对这种事情有任何想法或例子吗?
谢谢。
文档页面 https://docs.digitalocean.com/products/functions/reference/build-process/ 讨论了可能的
lib/
目录和可能的 build.sh
构建脚本。
我(ab?)使用构建脚本将库代码包含在函数目录中。我真的不确定这是否是正确的方法,但否则我无法在运行时环境中的任何地方找到库代码。
它的外观如下:
$ find lib/ packages/
lib/
lib/ricklib.py
packages/
packages/rick
packages/rick/r1
packages/rick/r1/ricklib.py
packages/rick/r1/build.sh
packages/rick/r1/__deployer__.zip
packages/rick/r1/__main__.py
packages/rick/r2
packages/rick/r2/__main__.py
$ cat packages/rick/r1/build.sh
cp ../../../lib/ricklib.py .
$ unzip -l packages/rick/r1/__deployer__.zip
Archive: packages/rick/r1/__deployer__.zip
Length Date Time Name
--------- ---------- ----- ----
1295 04-12-2024 22:10 __main__.py
19 04-12-2024 22:10 ricklib.py
--------- -------
1314 2 files
请注意,函数目录中的
__deployer__.zip
和 ricklib.py
是因为构建过程而存在的。它们不应该存在于干净的存储库中。