是否可以使用 "go mod tidy" 清除除间接依赖之外未使用的依赖项?
Is it possible to use "go mod tidy" to clear unused dependencies except indirect ones?
我知道这是 go mod tidy
到 p运行e 依赖关系树的预期行为,删除了不必要的依赖关系树,但我的 CI 部分使用 go-swagger
生成 swagger JSON
文件。所以,最后。 go mod tidy
将从 go.mod
文件中删除 go-swagger
包,因为它们被列为 //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 tidy
之后在全局 go-swagger
上显式调用 go get
。你们对如何解决这个问题有什么建议吗?
我怀疑一种解决方法是:
- 在您的项目源之一中显式导入 .go 文件包
github.com/go-swagger/go-swagger/scan
- 定义一个虚拟变量
var _ = scan.Parse
这样,您的来源将直接“使用”github.com/go-swagger/go-swagger
,它将不再被 go mod tidy 修剪。
我会在名为 externalTools.go
的 go 文件中执行此操作,只是为了记住 为什么 需要此假导入。
使用go install
安装swagger不影响go.mod.
在您的 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)
我知道这是 go mod tidy
到 p运行e 依赖关系树的预期行为,删除了不必要的依赖关系树,但我的 CI 部分使用 go-swagger
生成 swagger JSON
文件。所以,最后。 go mod tidy
将从 go.mod
文件中删除 go-swagger
包,因为它们被列为 //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 tidy
之后在全局 go-swagger
上显式调用 go get
。你们对如何解决这个问题有什么建议吗?
我怀疑一种解决方法是:
- 在您的项目源之一中显式导入 .go 文件包
github.com/go-swagger/go-swagger/scan
- 定义一个虚拟变量
var _ = scan.Parse
这样,您的来源将直接“使用”github.com/go-swagger/go-swagger
,它将不再被 go mod tidy 修剪。
我会在名为 externalTools.go
的 go 文件中执行此操作,只是为了记住 为什么 需要此假导入。
使用go install
安装swagger不影响go.mod.
在您的 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)