cmd/gomobile: keep the module version information as much as possible

Before this change, the main module specifies the module version of the
package to bind, the version might not be adopted by gomobile because
gomobile trims some dependencies information. If a dependency is not
a main module nor a replaced module, the dependency information is

For example, if you have this go.mod in a workspace:


    requier ( v0.1.0-123456

and then run `gomobile bind` there, the specified
version might not be used because is not a main nor
a replaced module.

This change keeps the dependency information as much as possible
to avoid this confusion.

Updates golang/go#37048

Change-Id: I875a1b9485438bdee336f3fc2d131775353004f5
Reviewed-by: Hyang-Ah Hana Kim <>
diff --git a/cmd/gomobile/bind.go b/cmd/gomobile/bind.go
index af1ec26..91e9f4a 100644
--- a/cmd/gomobile/bind.go
+++ b/cmd/gomobile/bind.go
@@ -263,17 +263,14 @@
 			return nil, err
 		if mod != nil {
-			switch {
-			case mod.Replace != nil:
+			if mod.Replace != nil {
 				p, v := mod.Replace.Path, mod.Replace.Version
 				if modfile.IsDirectoryPath(p) {
 					// replaced by a local directory
 					p = mod.Replace.Dir
 				f.AddReplace(mod.Path, mod.Version, p, v)
-			case mod.Main, mod.Path == "":
-				// We are binding this module or it has
-				// explicit dependency on
+			} else {
 				// When the version part is empty, the module is local and mod.Dir represents the location.
 				if v := mod.Version; v == "" {
 					f.AddReplace(mod.Path, mod.Version, mod.Dir, "")