Перейти в 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 для запуска во всем исходном дереве?
Ответы
Ответ 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./...
нет.