shell - 一次性在一个目录下构建多个 go 插件

标签 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

最佳答案

您可以使用 -execdir 选项在一个 find 命令中执行此操作,该选项允许您直接在文件的基本名称上运行命令

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详细了解所使用的每个选项。

关于shell - 一次性在一个目录下构建多个 go 插件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56375880/

相关文章:

string - 如何从Golang中的response.Cookies()中按名称获取单个cookie?

javascript - 使用 JavaScript 仅查找可见元素

swift - 从 Mac 应用程序运行 Swift 命令

linux - 如何在 bash shell 中分节打印 passwd 的最后一行

带条件检查的 git 别名

linux - 如果换行符是文件中的最后一个字符,如何删除它?

go - 记录 Golang 程序的惯用方式,由一个 main.go 文件组成

go - Go堆接口(interface)实现的优先级队列大小限制

shell - Unix命令获取远程主机上的目录列表

string - 如何使用 string.find 查找最后一次出现的模式?