Cómo usar paquetes personalizados

178

Estoy tratando de crear y usar un paquete personalizado en Go. Probablemente sea algo muy obvio, pero no puedo encontrar mucha información sobre esto. Básicamente, tengo estos dos archivos en la misma carpeta:

mylib.go

package mylib

type SomeType struct {

}

main.go

package main

import (
    "mylib"
)

func main() {

}

Cuando lo intento go run main.go, aparece este error:

main.go:4:2: import "mylib": cannot find package

He intentado ejecutar go build mylib.goprimero pero no parece estar haciendo nada (no se genera ningún archivo, no hay mensaje de error). ¿Alguna idea de cómo podría hacer esto?

Laurent
fuente
No configuré una variable GOPATH, solo GOROOT.
Laurent
1
ejecutar go installbajo el directorio de mylibprimero e intente nuevamente.
Joe
1
Ver también este hilo .
kostix
@ Joe, todavía no puede funcionar ejecutando "ir a instalar" en el interior
hunter_tech

Respuestas:

175

Primero, asegúrese de leer y comprender el documento "Cómo escribir el código Go" .

La respuesta real depende de la naturaleza de su "paquete personalizado".

Si está destinado a ser de uso general, considere emplear el llamado "diseño de código Github" . Básicamente, usted hace que su biblioteca sea un go getproyecto de tabla separada .

Si su biblioteca es para uso interno, podría ir así:

  1. Coloque el directorio con los archivos de la biblioteca en el directorio de su proyecto.
  2. En el resto de su proyecto, consulte la biblioteca utilizando su ruta relativa a la raíz de su espacio de trabajo que contiene el proyecto.

Demostrar:

src/
  myproject/
    mylib/
      mylib.go
      ...
    main.go

Ahora, en el nivel superior main.go, podría import "myproject/mylib"y funcionaría bien.

kostix
fuente
1
Si creo un nuevo proyecto (myproject2) en src /, ¿cómo puedo importar mylib?
Kiril
2
@Kiril, quieres decir, ¿cómo importas myliben el código de myproject2? Entonces la respuesta es "mediante el uso import "myproject/mylib": la idea es que Go busca rutas importadas en cada directorio que extrae de la GOPATHvariable de entorno (se llaman" espacios de trabajo "), pero esta búsqueda no es (por suerte) recursiva, por lo que tales rutas son efectivamente "anclado" en sus respectivos espacios de trabajo.
kostix
44
Otra lectura obligatoria: "Nombres de paquetes" .
kostix
1
@MatthiasSommer, típicamente, extrayendo esa mylib en un paquete común que utiliza cada microservicio. Exactamente cómo se define "usos", depende de su flujo de trabajo preferido. En el desarrollo de nivel empresarial, la venta se usa típicamente, pero con los go moddesarrollos recientes , un módulo podría ser la respuesta (y también go modadmite la venta de módulos).
kostix
1
@LeiYang, "el paquete a importar" es un directorio con uno o más archivos fuente Go. En cuanto a "cómo compilar el paquete en un archivo .lib" y luego importar el archivo lib ", la respuesta depende de lo que realmente pretendía pedir. Si le preocupa la velocidad de compilación, no tema: la caché de herramientas Go todos los resultados. construir sobre una base por paquete Si, en cambio, quería preguntar si es posible compilar y distribuir un paquete sólo binario compilado, entonces la respuesta es no .
kostix
68

Para este tipo de estructura de carpetas:

main.go
mylib/
  mylib.go

La forma más simple es usar esto:

import (
    "./mylib"
)
Laurent
fuente
1
Esto ya no funciona en las versiones recientes de go ya que no se encontrará el paquete. La importación correcta sería foo/mylib(suponiendo que la carpeta que contiene main.go es foo).
nemo
66
@nemo, con la última versión de go, siempre uso "./mylib" y funciona.
Laurent
3
Usando go 1.2 y estoy de acuerdo con @ this.lau_
Canada Dry
8
Tenga en cuenta que esto hace un go installdescanso. Si está creando un proyecto independiente que desea que la gente descargue y ejecute go build, está bien; sin embargo, emplearía el "diseño de código de Github" mencionado anteriormente (incluso si está fuera de Bitbucket o similar) si desea go installsoporte completo .
fotoionizada el
Sugerencia No lo use de esta manera. Se romperá el godef. godef no entiende sobre "." importaciones
King Jk
6

Para un proyecto alojado en GitHub, esto es lo que la gente suele hacer:

github.com/
  laike9m/
    myproject/
      mylib/
        mylib.go
        ...
      main.go

mylib.go

package mylib

...

main.go

import "github.com/laike9m/myproject/mylib"

...
laike9m
fuente
6

Soy un programador experimentado, pero bastante nuevo en Go World. Y confieso que me he enfrentado a pocas dificultades para entender Go ... Me enfrenté a este mismo problema al tratar de organizar mis archivos go en subcarpetas. La forma en que lo hice:

GO_Directory (el asignado a $ GOPATH)

GO_Directory //the one assigned to $GOPATH
__MyProject
_____ main.go
_____ Entites
_____ Fiboo // in my case, fiboo is a database name
_________ Client.go // in my case, Client is a table name

En el archivo MyProject \ Entities \ Fiboo \ Client.go

package Fiboo

type Client struct{
    ID int
    name string
}

en el archivo MyProject \ main.go

package main

import(
    Fiboo "./Entity/Fiboo" 
)

var TableClient  Fiboo.Client

func main(){
    TableClient.ID = 1
    TableClient.name = 'Hugo'

    // do your things here
}

(Estoy ejecutando Go 1.9 en Ubuntu 16.04)

Y recuerden chicos, soy novato en Go. Si lo que estoy haciendo es una mala práctica, ¡hágamelo saber!

Diego Favero
fuente
3

Otra solución:
agregar src/myprojecta $ GOPATH.

Luego import "mylib"compilará.

Helin Wang
fuente
esto no funcionará para las rutas que se pueden obtener, como paquetes alojados en github.
Gustav