运行带有dep的vet时找不到头文件

时间:2018-08-20 10:43:03

标签: go dependency-management cgo

在带有供应商依赖性的项目中运行go vet时出现此错误。

$ go vet ./...
# <project path...>/vendor/github.com/ethereum/go-ethereum/crypto/secp256k1
vendor/github.com/ethereum/go-ethereum/crypto/secp256k1/curve.go:42:10: fatal error: libsecp256k1/include/secp256k1.h: No such file or directory
 #include "libsecp256k1/include/secp256k1.h"

我认为这是开发环境中缺少的依赖项,但是当查看原始项目源时,包含路径是相对于源文件的。

为什么找不到文件?

2 个答案:

答案 0 :(得分:1)

一些用于go的依赖项管理工具未提供项目引用的所有代码。这意味着在某些情况下,可在带有cgo的go文件中使用的C代码未包含在供应商目录中。

在使用两个单独的供应商工具时,我两次遇到此问题,但是有工作可以支持这些use cases

到目前为止,我发现的最简单的方法是使用govendor,然后导入完整的目录以确保所有必需的文件都在其中。这是一个非常简单的解决方案,它忽略了在go项目中包括c依赖项的许多复杂性,但是解决了该问题,而没有针对该问题的永久性解决方案。

go get github.com/kardianos/govendor
govendor init
govendor add +e
# Remove the directory that is missing the c dependencies
rm -rf ./vendor/github.com/ethereum/go-ethereum/crypto/secp256k1/
# Add the file and include all files
# https://github.com/kardianos/govendor/issues/247
govendor add github.com/ethereum/go-ethereum/crypto/secp256k1/^

答案 1 :(得分:0)

Gopkg.toml中,您可以添加

[prune]
  go-tests = true
  unused-packages = true
  non-go = true

  [[prune.project]]
    name = "github.com/ethereum/go-ethereum"
    non-go = false
    unused-packages = false