Cómo importar paquetes locales sin gopath

Resuelto asked hace 11 años • 10 respuestas

Lo he usado GOPATH, pero para este problema actual al que me enfrento, no ayuda. Quiero poder crear paquetes que sean específicos de un proyecto:

myproject/
├── binary1.go
├── binary2.go
├── package1.go
└── package2.go

Lo intenté de varias maneras, pero ¿cómo puedo package1.gotrabajar en el binary1.goo en el binary2.goy así sucesivamente?

Por ejemplo; Quiero poder ejecutarlo import "package1"y luego poder ejecutarlo go build binary1.goy que todo funcione bien sin que se produzca el error de que no se puede encontrar el paquete en GOROOTo GOPATH. La razón por la que necesito este tipo de funcionalidad es para proyectos a gran escala; No quiero tener que hacer referencia a otros paquetes ni mantenerlos en un archivo grande.

 avatar Jul 09 '13 10:07
Aceptado

Ir al resumen de gestión de dependencias:

  • vgosi tu versión go es:x >= go 1.11
  • depo vendorsi tu versión go es:go 1.6 >= x < go 1.11
  • Manualmente si su versión go es:x < go 1.6

Edición 3: Go 1.11 tiene una función vgoque reemplazará a dep .

Para utilizar vgo, consulte la documentación de Módulos . TLDR a continuación:

export GO111MODULE=on
go mod init
go mod vendor # if you have vendor/ folder, will automatically integrate
go build

Este método crea un archivo llamado go.moden su directorio de proyectos. Luego puedes construir tu proyecto con go build. Si GO111MODULE=autoestá configurado, entonces su proyecto no puede estar en formato $GOPATH.


Edición 2: el método de venta sigue siendo válido y funciona sin problemas. vendorEs en gran medida un proceso manual, debido a esto depy vgofueron creados.


Edición 1: si bien mi antigua forma funciona, ya no es la forma "correcta" de hacerlo. Debería utilizar las capacidades del proveedorvgo , o dep(por ahora) que están habilitadas de forma predeterminada en Go 1.6; ver . Básicamente agregas tus paquetes "externos" o "dependientes" dentro de un vendordirectorio; tras la compilación, el compilador utilizará estos paquetes primero.


Encontró. Pude importar un paquete local GOPATHcreando una subcarpeta package1y luego importándolo con import "./package1"scripts binary1.gocomo binary2.goeste:

binario1.go

...
import (
        "./package1"
      )
...

Entonces mi estructura de directorio actual se ve así:

myproject/
├── binary1.go
├── binary2.go
├── package1/
│   └── package1.go
└── package2.go

También debo señalar que las rutas relativas (al menos en go 1.5) también funcionan; Por ejemplo:

import "../packageX"
 avatar Jul 09 '2013 03:07

No existe el "paquete local". La organización de paquetes en un disco es ortogonal a cualquier relación padre/hijo de paquetes. La única jerarquía real formada por paquetes es el árbol de dependencias, que en el caso general no refleja el árbol de directorios.

Solo usa

import "myproject/packageN"

y no luches contra el sistema de compilación sin una buena razón. Guardar una docena de caracteres por importación en cualquier programa no trivial no es una buena razón, porque, por ejemplo, los proyectos con rutas de importación relativas no son accesibles.

El concepto de rutas de importación tiene algunas propiedades importantes:

  • Las rutas de importación pueden ser únicas a nivel mundial.
  • Junto con GOPATH, la ruta de importación se puede traducir sin ambigüedades a una ruta de directorio.
  • Cualquier ruta de directorio en GOPATH se puede traducir sin ambigüedades a una ruta de importación.

Todo lo anterior se arruina al utilizar rutas de importación relativas. No lo hagas.

PD: Hay pocos lugares en el código heredado en las pruebas del compilador Go que utilizan importaciones relativas. ATM, ésta es la única razón por la que se apoyan las importaciones relativas.

zzzz avatar Jul 09 '2013 06:07 zzzz

Quizás esté intentando modularizar su paquete. Supongo que eso es así package1y package2, en cierto modo, son parte del mismo paquete, pero para facilitar la lectura, los estás dividiendo en varios archivos.

Si el caso anterior fue el suyo, podría usar el mismo nombre de paquete en esos archivos múltiples y será como si hubiera el mismo archivo.

Esto es un ejemplo:

agregar.go

package math

func add(n1, n2 int) int {
   return n1 + n2
}

restar.go

package math

func subtract(n1, n2 int) int {
    return n1 - n2
}

donothing.go

package math

func donothing(n1, n2 int) int {
    s := add(n1, n2)
    s = subtract(n1, n2)
    return s
}

No soy un experto en Go y esta es mi primera publicación en StackOveflow, así que si tienes algún consejo será bien recibido.

Juan Jose Tugores avatar Feb 08 '2015 04:02 Juan Jose Tugores