[Libguestfs] Publishing the libnbd go module

Nir Soffer nsoffer at redhat.com
Mon Oct 25 13:45:03 UTC 2021


I'm playing with libnbd go module, planning to use it in a new command[1]

The biggest obstacle for me is that the module is not published in a way that
Go developers expect.

The module is listed in:
https://pkg.go.dev/github.com/libguestfs/libnbd/golang

But the module actually lives in:
https://github.com/libguestfs/libnbd/tree/master/golang/src/libguestfs.org/libnbd

So the pkg.go.dev page is broken, .e.g no there is no documation or license, and
the suggested import is wrong.

The module name is "libguestfs.org/libnbd". But if you try to use it,
for example
in the (improved) example from libnbd-golang.pod:

$ cat test.go
package main

import "fmt"
import "libguestfs.org/libnbd"

func main() {
    h, err := libnbd.Create()
    if err != nil {
        panic(err)
    }
    defer h.Close()
    uri := "nbd://localhost"
    err = h.ConnectUri(uri)
    if err != nil {
        panic(err)
    }
    size, err := h.GetSize()
    if err != nil {
        panic(err)
    }
    fmt.Printf("size of %s = %d\n", uri, size)
}

$ go mod init example/test
go: creating new go.mod: module example/test
go: to add module requirements and sums:
        go mod tidy

$ go mod tidy
go: finding module for package libguestfs.org/libnbd
example/test imports
        libguestfs.org/libnbd: cannot find module providing package
libguestfs.org/libnbd: unrecognized import path
"libguestfs.org/libnbd": reading
https://libguestfs.org/libnbd?go-get=1: 404 Not Found

If we use libguestfs.org, https://libguestfs.org/libnbd?go-get=1
should return the expected
metadata instead of 404.

But even if "libguestfs.org/libnbd" would work, we cannot use the
module from the source
since the source is missing the generated files (wrappers.go, binding.go, ...).

It looks like the only ways to use the module are:

- Vendor the go code from the tarball.

I did not try this since I don't want to copy libnbd into source into
my project.

- Clone and build libnbd locally, and replace libguestfs.org with the
path to your local source

$ go mod edit -replace
libguestfs.org/libnbd=../../src/libnbd/golang/src/libguestfs.org/libnbd
$ go mod tidy
go: found libguestfs.org/libnbd in libguestfs.org/libnbd
v0.0.0-00010101000000-000000000000

$ cat go.mod
module example/test

go 1.16

replace libguestfs.org/libnbd =>
../../src/libnbd/golang/src/libguestfs.org/libnbd

require libguestfs.org/libnbd v0.0.0-00010101000000-000000000000


But the version is wrong - it should be v1.10.0.
I think the issue is missing tag:
https://golang.org/ref/mod#vcs-version

    If a module is defined in a subdirectory within the repository,
that is, the module subdirectory
    portion of the module path is not empty, then each tag name must
be prefixed with the module
    subdirectory, followed by a slash. For example, the module
golang.org/x/tools/gopls is defined
    in the gopls subdirectory of the repository with root path
golang.org/x/tools. The version v0.4.0
    of that module must have the tag named gopls/v0.4.0 in that repository.

So the linbd project needs a tag like:
golang/src/libguestfs.org/libnbd/v1.10.0

Removing the "src/libguestfs.org" directories will clean things up:
golang/libnbd/v1.10.0

I hope we can solve this issue. Making the go binding easy to use for
developers is
important for making libnbd more popular in the Go community.

[1] https://gerrit.ovirt.org/c/ovirt-imageio/+/117277

Nir




More information about the Libguestfs mailing list