1

我知道go mod tidy通过删除不必要的依赖关系树来修剪依赖关系树是预期的行为,但我的部分 CI 用于go-swagger生成 swaggerJSON文件。所以,最后。go mod tidy将从文件中删除go-swagger包,go.mod因为它们被列为//indirect(它们不直接从源代码中使用)。有解决方法吗?

这是我的go.mod文件:

...
require (
    github.com/go-openapi/errors v0.20.0 // indirect
    github.com/go-openapi/validate v0.20.2 // indirect
    github.com/go-swagger/go-swagger v0.26.1 // indirect
    github.com/gorilla/mux v1.8.0
    github.com/mailru/easyjson v0.7.7 // indirect
    github.com/spf13/afero v1.5.1 // indirect
    golang.org/x/mod v0.4.1 // indirect
    golang.org/x/net v0.0.0-20210220033124-5f55cee0dc0d // indirect
    golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43 // indirect
    golang.org/x/tools v0.1.0 // indirect
)

在我运行之后go mod tidy,只剩下这个:

    github.com/gorilla/mux v1.8.0

但是,我在生产环境中运行的 Makefile 上有以下目标:

$ swagger generate spec -o ./internal/ui/swagger.json

我有点想避免go getgo-swagger运行后全局调用go tidy。你们对如何解决这个问题有什么建议吗?

4

2 回答 2

3

我怀疑一种解决方法是:

  • 在您的项目源之一中显式导入 .go 文件包github.com/go-swagger/go-swagger/scan
  • 定义一个虚拟变量
    var _ = scan.Parse
    

这样,您的来源将直接“使用” github.com/go-swagger/go-swagger,而 go mod tidy 将不再对其进行修剪。

我会在一个名为 的 go 文件中这样做externalTools.go,只是为了记住为什么需要这个假导入。

于 2021-02-21T08:55:30.437 回答
0

用于go install在不影响 go.mod 的情况下安装 swagger。

在你Makefile有一个单独的目标,安装 swagger deps 然后运行它。我们的安排是这样的:

ROOT := $(PWD)
DIST := ${ROOT}/dist

# Could be /go or ${HOME}/go depending on build environment
export GOPATH := ${ROOT}/go

.PHONY: swagger

all: $(DIST)/app swagger

swagger: $(GOPATH)
    go install -v github.com/go-swagger/go-swagger/cmd/swagger@latest
    $(GOPATH)/bin/swagger version
    $(GOPATH)/bin/swagger generate spec -o ./swagger-ui/swagger.json -m

$(DIST)/app: $(DIST) $(GOPATH)
    go build -v -o $(DIST)/app ./cmd/...

$(DIST):
    mkdir -p $(DIST)

$(GOPATH):
    mkdir -p $(GOPATH)
于 2022-02-17T08:53:08.343 回答