Создание нескольких плагинов Go в каталоге за один раз - PullRequest
1 голос
/ 30 мая 2019

У меня есть список плагинов в поддиректории.Я хочу собрать их всех одной командой.Вот пример макета dir.

plugins/cat/cat.go
plugins/dog/dog.go
plugins/cow/cow.go

Я создаю их прямо сейчас, как:

go build -i -buildmode=plugin -o build/cat.so plugins/cat/cat.go
go build -i -buildmode=plugin -o build/dog.so plugins/dog/dog.go
go build -i -buildmode=plugin -o build/cow.so plugins/cow/cow.go

Есть другая команда (потому что она находится в Makefile), которая помогает мне получитьближе:

# Ex.: make bin-so TARGET=cat
bin-so: builddir
    go build -i -buildmode=plugin -o build/$(TARGET).so plugins/$(TARGET)/$(TARGET).go

Я хочу создать одну строку, которая строит эти плагины.Я узнал, как я могу перечислить имена папок, но я должен как-то использовать его в приведенной выше команде.

find ./plugins -mindepth 1 -maxdepth 1 -type d | awk 'sub(/^.*\//, "")'

Так что он будет перечислять названия папок, это хорошо для меня, но яЯ должен перенаправить его на команду построителя плагинов.

Я хочу иметь что-то похожее (просто пример):

find ./plugins -mindepth 1 -maxdepth 1 -type d | awk 'sub(/^.*\//, "")' | go build -i -buildmode=plugin -o build/$1).so plugins/$1/$1.go

1 Ответ

2 голосов
/ 30 мая 2019

Вы можете сделать это одной командой find с опцией -execdir, которая позволяет вам запускать команды непосредственно для базового имени файлов

find ./plugins -mindepth 1 -maxdepth 1 -type d -execdir bash -c '
    for arg; do
        name="${arg##*./}"
        go build -i -buildmode=plugin -o build/"${name}".so plugins/"${name}"/"${name}".go
    done' _ {} +

Это намного лучше, чем использовать несколько конвейеров после find для достижения того же результата. Представьте, что часть внутри sh -c '..' является отдельным сценарием, и вы передаете в сценарий аргументы с возвращенными именами ./cow.go и т. Д.

Преимущество -execdir в том, что вам не нужно беспокоиться о непосредственных путях перед именами каталогов. Вы получите окончательное базовое имя найденных каталогов.

См. Понимание опции -exec find в Unix.SE , чтобы узнать больше о каждой из используемых опций.

...