Estoy probando el nuevo sistema de módulos de Go y tengo problemas para acceder a los paquetes locales. El siguiente proyecto está en una carpeta en mi escritorio fuera de mi gopath.
La estructura de mi proyecto se ve así:
/
- /platform
- platform.go
- main.go
- go.mod
// platform.go
package platform
import "fmt"
func Print() {
fmt.Println("Hi")
}
// main.go
package main
import "platform"
func main() {
platform.Print()
}
go build main.go
me dice
cannot find module for path platform
Respuestas:
Le sugiero encarecidamente que utilice go toolchain, que se encarga de estos problemas de forma inmediata. Visual Studio Code con el complemento vscode-go es realmente útil.
El problema aquí es que Go requiere rutas relativas con respecto a su declaración de importación
$GOPATH/src
omodule
. Dependiendo de dónde se encuentreGOPATH
, la ruta de importación también debe incluir eso. En este caso, la declaración de importación debe incluir la ruta del módulo go engo.mod
GOPATH
Suponga que su proyecto reside aquí:
Su ruta de importación debe ser:
import "github.com/myuser/myproject/platform"
VGO
Suponga que su archivo go.mod es:
Su ruta de importación debe ser:
import "example.com/myuser/myproject/platform"
fuente
go.mod
archivo en el disco, siempre que las rutas de importación sean rutas de importación completas que comiencen con el nombre del módulo (por ejemplo,import "github.com/my/module/pkg
"`) . Si desea encontrar paquetes en otros módulos que se encuentran en otra parte de su disco, entonces es allí donde entra una directiva de reemplazo . Esta respuesta cubre más sobre la estructura del módulo y las rutas de importación.Permítanme definir esto primero
modules
son colecciones depackages
. En Go 11, uso módulos go como los siguientes:Si ambos paquetes están en el mismo proyecto, puede hacer lo siguiente: En
go.mod
:module github.com/userName/moduleName
y dentro de tu
main.go
import "github.com/userName/moduleName/platform"
Sin embargo, si son módulos separados, es decir, diferentes rutas físicas y aún desea importar local
packages
sin publicar esto de forma remota en github, por ejemplo, puede lograr esto usando lareplace
directiva.Dado el nombre del módulo
github.com/otherModule
yplatform
, como lo ha llamado, es el único paquete que contiene. En su módulo principalgo.mod
agregue las siguientes líneas:module github.com/userName/mainModule require "github.com/userName/otherModule" v0.0.0 replace "github.com/userName/otherModule" v0.0.0 => "local physical path to the otherModule"
Nota: La ruta debe apuntar al directorio raíz del módulo y puede ser absoluta o relativa.
En el interior
main.go
, para importar un paquete específico comoplatform
desdeotherModule
:import "github.com/userName/otherModule/platform"
Aquí hay una breve introducción a los módulos de Golang
fuente