0

我正在使用 Go 编写一些 AWS Lambda 函数。常用功能分为模块,例如我有一个模块 (M1),它提供了一个接口的实现,它具有 DynamoDB 的后备存储(因此依赖于 AWS Go SDK)。

在一个 Lambda 函数 (F1) 中,我导入了 M1,因此代码路径的依赖关系图如下所示:

F1 -> M1 -> SDK -> dynamodb.DynamoDB.PutItem

作为 AWS,我需要编写相应的 IAM 策略以允许 F1 执行PutItem

目前,我手动识别 AWS 开发工具包调用并修复记录在 CloudWatch 中的任何错误。

我的目标是确定是否有办法让 Go 工具链识别从给定模块/导入调用的函数。

到目前为止,我可以尝试以下几种变体:

# this doesn't return much as most of my code lives within directories
# under main
go mod why "github.com/aws/aws-sdk-go"
# github.com/aws/aws-sdk-go
(main module does not need package github.com/aws/aws-sdk-go)

# this only identifies a single F1 {-> ...} -> SDK invocation
# but not all of them
grep -r github.com/aws/aws-sdk-go --include="*.go" \
  | cut -f2 -d'"' \
  | sort -u \
  | xargs go mod why

我还没有深入研究 and 的来源go buildgo mod why但到目前为止,我还没有找到一种方法来说服“go mod why”来理解简单的 glob 扩展/正则表达式和相应的调用点。我也没有在二阶部门(即 M1->SDK)上取得任何进展。

4

1 回答 1

2

go mod graph会给你你的依赖图,但这不会告诉你正在调用哪些函数;这不在依赖管理的范围内,它在模块级别运行。要查看调用了哪些函数,您需要通过AST解析源代码,或者使用例如pprof检测二进制文件。

于 2019-05-10T14:10:32.270 回答