一目了然在目录下构建多个go插件

时间:2019-05-30 09:57:54

标签: shell go find

我在子目录下有一个插件列表。我想用一个命令来构建所有这些。有一个示例目录布局。

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 个答案:

答案 0 :(得分:2)

您可以使用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的优点是您不必担心目录名称之前的立即路径。您将找到找到的目录的最终基本名称。

请参见Understanding the -exec option of find on Unix.SE,以详细了解所使用的每个选项。