[Adding Matthew]
On Mon, Oct 25, 2021 at 04:45:03PM +0300, Nir Soffer wrote:
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.or...
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
That website is entirely static so if it involves fetching stuff from
there it's probably not going to work.
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, ...).
I believe that Matthew hit this problem too ...
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
I'm not sure I understand what this all means. Is that the literal
name of the git tag (ie.
git tag
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
Rich.
--
Richard Jones, Virtualization Group, Red Hat
http://people.redhat.com/~rjones
Read my programming and virtualization blog:
http://rwmj.wordpress.com
libguestfs lets you edit virtual machines. Supports shell scripting,
bindings from many languages.
http://libguestfs.org