Acceder a paquetes locales dentro de un módulo go (ir a 1.11)

81

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
David Alsh
fuente
2
Hola David, si crees que mi respuesta responde a tu pregunta, considera marcarla como la respuesta. ¡Gracias!
Halil Kaskavalci
El complemento maven golang desde 2.3.3 también permite trabajar con módulos locales (agrega automáticamente rutas locales durante la compilación), puede echar un vistazo a algunos ejemplos de github.com/raydac/mvn-golang/tree/master/mvn-golang- ejemplos /…
Igor Maznitsa

Respuestas:

52

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/srco module. Dependiendo de dónde se encuentre GOPATH, 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í:

$GOPATH/src/github.com/myuser/myproject

Su ruta de importación debe ser:

import "github.com/myuser/myproject/platform"

VGO

Suponga que su archivo go.mod es:

module example.com/myuser/myproject

Su ruta de importación debe ser:

import "example.com/myuser/myproject/platform"
Halil Kaskavalci
fuente
Esto fue muy bueno, en el caso de los módulos go, tengo que seguir el patrón de vgo, donde comienzo la ruta de la declaración de importación con el nombre del módulo. ¡Gracias!
David Alsh
15
Espera, estoy confundido. Si mi módulo está en algún lugar de mi sistema de archivos, ¿cómo lo encuentra el sistema de módulos?
Narfanator
1
Si está dentro de un módulo, busca paquetes en el mismo módulo utilizando la ruta de importación del paquete y la ubicación del go.modarchivo 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.
típico182
5
¿Por qué todo el mundo sigue usando formatos de URL? La pregunta fue muy clara: localmodule / localmodule.go eso es todo. ¿Por qué hay githubs y example.com aquí?
holms
@holms la respuesta y el comentario sobre el tuyo lo explican, pero para aclarar, el lenguaje no tiene mecanismo para localizar paquetes internos, solo la herramienta go lo hace. la herramienta go depende de GOPATH o de la configuración del módulo (go.mod). En esencia, está utilizando la capacidad de las herramientas go para tratar sus paquetes locales de la misma forma que cualquier otro tipo de paquete . vea también algunas de las otras respuestas a esta pregunta.
user4893106
115

Permítanme definir esto primero modulesson colecciones de packages. 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 packagessin publicar esto de forma remota en github, por ejemplo, puede lograr esto usando la replacedirectiva.

Dado el nombre del módulo github.com/otherModuley platform, como lo ha llamado, es el único paquete que contiene. En su módulo principal go.modagregue 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 como platformdesde otherModule:

import "github.com/userName/otherModule/platform"

Aquí hay una breve introducción a los módulos de Golang

Muhammad Soliman
fuente
3
Dios mío, esta respuesta me ayudó mucho. Gracias :)
Adis Azhar
2
He usado un go.mod que contiene solo la directiva de reemplazo, la directiva require no era necesaria para construir el proyecto.
mh-cbon