Cómo importar paquetes locales sin gopath
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.go
trabajar en el binary1.go
o en el binary2.go
y así sucesivamente?
Por ejemplo; Quiero poder ejecutarlo import "package1"
y luego poder ejecutarlo go build binary1.go
y que todo funcione bien sin que se produzca el error de que no se puede encontrar el paquete en GOROOT
o 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.
Ir al resumen de gestión de dependencias:
vgo
si tu versión go es:x >= go 1.11
dep
ovendor
si 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 vgo
que 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.mod
en su directorio de proyectos. Luego puedes construir tu proyecto con go build
. Si GO111MODULE=auto
está 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. vendor
Es en gran medida un proceso manual, debido a esto dep
y vgo
fueron 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 vendor
directorio; tras la compilación, el compilador utilizará estos paquetes primero.
Encontró. Pude importar un paquete local GOPATH
creando una subcarpeta package1
y luego importándolo con import "./package1"
scripts binary1.go
como binary2.go
este:
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"
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.
Quizás esté intentando modularizar su paquete. Supongo que eso es así package1
y 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.