为了账号安全,请及时绑定邮箱和手机立即绑定

预提交无法在嵌套的 go 模块中发现任何 golang 文件

预提交无法在嵌套的 go 模块中发现任何 golang 文件

Go
婷婷同学_ 2022-09-26 15:48:37
我有一个大的回购,喜欢github.com/myusername/myrepo现在,在该存储库中(出于超出此问题范围的原因),我初始化了以下模块:gogithub.com/myusername/myrepo/eck-user-mgmt这是我的github.com/myusername/myrepo/eck-user-mgmt/.pre-commit-config.yaml---files: ^eck-user-mgmt/repos:  - repo: git://github.com/dnephin/pre-commit-golang    rev: v0.4.0    hooks:      - id: go-fmt      - id: go-imports      - id: go-unit-tests      - id: go-mod-tidy      - id: golangci-lint但是,没有发现任何文件/模块/任何内容go▶ g add .pre-commit-config.yaml && pre-commit rungo fmt...............................................(no files to check)Skippedgo imports...........................................(no files to check)Skippedgo-unit-tests........................................(no files to check)Skippedgo-mod-tidy..........................................(no files to check)Skippedgolangci-lint........................................(no files to check)Skipped这是从居住的地方运行的,即pre-commit-config.yaml~/work/myrepo/eck-user-mgmt为什么?p.s. 我知道这不是模块管理方面的最佳实践,我只想知道是否有办法在特定设置的上下文中使用make工作gopre-commitgo
查看完整描述

3 回答

?
侃侃无极

TA贡献2051条经验 获得超10个赞

go 命令通常在主模块及其依赖项的上下文中运行。它通过在当前工作目录及其父目录中查找文件来查找主模块。go.mod


如果您的预提交是在存储库的根目录中运行的,并且那里没有文件,则命令将在任何模块之外运行。因此,例如,不会做任何事情。go.modgo mod tidygo test ./...


您可能需要在每个模块中运行这些命令。您可以在 shell 脚本中找到包含文件的目录:go.mod


modfiles=($(find . -type f -name go.mod))

for f in "${modfiles[@]}"; do

  pushd "$(dirname "$f")"

  ### presubmit commands

  popd

done


查看完整回答
反对 回复 2022-09-26
?
红颜莎娜

TA贡献1842条经验 获得超12个赞

只是加起来就是康罗德@Jay建议的方法。


由于似乎情况与单存储库不太融洽,并且考虑到这变得更加复杂,因此我选择了以下内容pre-commitgo.git/pre-commit


GOMODULESFILENAME="gomodules"


declare -a gomodarray


precommit() {

    go mod tidy

    go fmt

    go test ./... -coverprofile cover.out;

    go tool cover -func cover.out

    rm cover.out

}


while read -r line;

do  

    gomodarray+=("$(echo "$line")")

done<gomodules


for f in "${gomodarray[@]}"; do

        echo "Running golang pre-commit actions for project: $f"

        sleep 1

        pushd "$f"

        precommit

        popd

done

其中 是存储库根部的文件,逐行列出存储库的所有 go 模块。gomodules


查看完整回答
反对 回复 2022-09-26
?
德玛西亚99

TA贡献1770条经验 获得超3个赞

(no files to check)Skipped表示没有任何东西与特定钩子的 / / 集匹配typesfilesexclude

看看你的设置:

它们组合在一起,因此将在存储库中匹配的文件必须同时匹配并以^eck-user-mgmt/.go

如果你运行它应该~粗略地复制预提交所做的事情来处理文件匹配git ls-files | grep '^eck-user-mgmt' | grep '\.go$'

另请注意,您运行了 -- 默认情况下,这只处理暂存的文件。添加新钩子时,您可能希望运行预提交运行 --all-filepre-commit run


免责声明:我是预提交的作者


查看完整回答
反对 回复 2022-09-26
  • 3 回答
  • 0 关注
  • 80 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信