Подтвердить что ты не робот

Перейти в fmt для всего дерева источников

У меня есть проект, в настоящее время организованный что-то вроде этого:

~/code/go
         /bin
         /pkg
         /src
             /proj/main.go
                  /some_package/package.go
                  /some_other_package/some_other_package.go

Теперь, если я хочу использовать инструмент go fmt для всего моего проекта, кажется, что единственный способ сделать это отдельно для каждой директории в дереве исходных текстов проектов:

go fmt proj
go fmt proj/package
go fmt proj/some_other_package

Есть ли способ сказать команде fmt для запуска во всем исходном дереве?

4b9b3361

Ответ 1

Вы можете использовать три точки (...) в качестве подстановочного знака. Так, например, следующая команда будет форматировать все пакеты github.com:

go fmt github.com/...

Этот шаблон также работает с другими командами go, такими как go list, go get и так далее. Нет необходимости помнить такую ​​уродливую команду find.

Ответ 2

Если вы используете gofmt вместо go fmt, он рекурсивный. Например, следуя команде

gofmt -s -w .

(обратите внимание на маленькую точку в конце) рекурсивно форматирует, упрощает и сохраняет результат в каждом файле в текущем каталоге. У меня есть псевдоним оболочки gf, определенный как gofmt -s -w ., и найти его довольно удобным.

Попробуйте gofmt -l . (файлы списка, форматирование которых отличается от gofmt), если вы хотите: -)

Ответ 3

find proj -type f -iregex '.*\.go' -exec go fmt '{}' +

Объяснение

  • find proj: найти все в этом каталоге...
    • -type f:... это файл
    • -iregex '.*\.go':... и нечувствительно к регистру соответствует регулярному выражению .*\.go
  • ... и выполните go fmt, за которым следует столько совпадающих файлов, что операционная система может обрабатывать переход к исполняемому файлу за один раз.

Ответ 4

Также вы можете попробовать запустить команду:

go fmt ./...

из каталога вашего проекта.

Ответ 5

Упомянутая некоторыми команда gofmt./... не работает на Windows (по крайней мере, на моей Win7).

Вместо этого я использовал gofmt -d.\ работает рекурсивно. Я использую флаг -d потому что хочу перечислить изменения, которые мне нужно сделать, чтобы пройти проверку.

NB: golint./... работает на Windows, просто gofmt./... нет.