modules golang go packages

modules - Golang cómo importar paquetes locales sin gopath?



install go (4)

Editar 2: el método de venta sigue siendo válido y funciona sin problemas. vendor es la forma defacto para administrar proyectos. Sin embargo, es en gran medida un proceso manual, debido a esto, ha surgido una nueva herramienta para administrar sus paquetes de proveedores para usted: dep

dep formará parte de la cadena de herramientas en el futuro ; esta no es una herramienta de terceros que estoy recomendando. Es el futuro :). Es una herramienta muy simple de usar; ver la documentation .

Edit 1: Mientras mi antigua forma funciona, ya no es la forma "correcta" de hacerlo. Debería utilizar las capacidades del proveedor que están habilitadas por defecto en Go 1.6; see . Básicamente, agrega sus paquetes "externos" o "dependientes" dentro de un directorio de vendor ; luego de la compilación, el compilador usará estos paquetes primero.

Encontró. Pude importar el paquete local con GOPATH creando una subcarpeta del package1 y luego importando con la import "./package1" en las binary2.go comandos binary1.go y binary2.go como esta:

binary1.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"

He usado GOPATH pero para este tema actual que estoy enfrentando no ayuda. Quiero poder crear paquetes que sean específicos de un proyecto:

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

Intenté varias maneras, pero ¿cómo hago para que package1.go funcione en binary1.go o binary2.go y así sucesivamente?

Por ejemplo; Quiero poder import "package1" y luego poder ejecutar go build binary1.go y todo funciona bien sin que se go build binary1.go el error de que el paquete no se puede encontrar 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 muchos otros paquetes o mantenerlos en un archivo grande.


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 fáciles de obtener.

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

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

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

PD: hay pocos lugares en el código heredado en las pruebas del compilador Go que usan importaciones relativas. ATM, esta es la única razón por la cual las importaciones relativas son compatibles en absoluto.


Para agregar un paquete "local" a su proyecto, agregue una carpeta (por ejemplo, "package_name"). Y ponga sus archivos de implementación en esa carpeta.

src/github.com/GithubUser/myproject/ ├── main.go └───package_name └── whatever_name1.go └── whatever_name2.go

En tu package main haz esto:

import "github.com/GithubUser/myproject/package_name"

Donde package_name es el nombre de la carpeta y debe coincidir con el nombre del paquete utilizado en los archivos whatever_name1.go y whatever_name2.go. En otras palabras, todos los archivos con un subdirectorio deben ser del mismo paquete.

Además, puede anidar más subdirectorios siempre que especifique la ruta completa a la carpeta principal en la importación.


Tal vez estás tratando de modularizar tu paquete. package1 que el package1 y el package1 son, de alguna manera, parte del mismo paquete, pero para poder leerlos los está dividiendo en varios archivos.

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

Esto es un ejemplo:

add.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, por lo que si tienes algún consejo será bien recibido.