Lo he usado GOPATH
pero para este problema actual que enfrento no ayuda. Quiero poder crear paquetes que sean específicos para un proyecto:
myproject/
├── binary1.go
├── binary2.go
├── package1.go
└── package2.go
Lo intenté de varias maneras, pero ¿cómo me pongo package1.go
a trabajar en el binary1.go
o el 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 produzca el error de que no se puede encontrar el paquete 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 varios otros paquetes o guardarlos en un archivo grande.
.go
archivos en un solo directorio son parte del mismo paquete, y no necesitaimport
archivos en el mismo paquete (es decir, el mismo directorio). Usted mencionó trabajar fuera de GOPATH, que es una de las capacidades del nuevo sistema de módulos Go. Este respuesta cubiertas módulo de estructura, la importación de paquetes locales, la organización de los paquetes dentro de un módulo, si desea o no tener múltiples módulos en un solo repositorio, etc.git/repo/to/my/project
ruta completa ? Simplemente no veo la razón por la que alguien querría este comportamiento. ¿Qué sucede si mueve su proyecto a otra ubicación (es decir, imagen de Docker), necesita alterar todas las rutas nuevamente? Estoy buscando respuestas por qué esto es tan complicado.Respuestas:
Ir resumen de gestión de dependencias:
vgo
si su versión go es:x >= go 1.11
dep
ovendor
si tu versión go es:go 1.6 >= x < go 1.11
x < go 1.6
Edición 3: Go 1.11 tiene una característica
vgo
que reemplazarádep
.Para usar
vgo
, consulte la documentación de Módulos . TLDR a continuación:Este método crea un archivo llamado
go.mod
en su directorio de proyectos. Luego puede construir su proyecto congo build
. SiGO111MODULE=auto
está configurado, entonces su proyecto no puede estar en$GOPATH
.Edición 2: el método de venta sigue siendo válido y funciona sin problemas.
vendor
es en gran parte un proceso manual, por esodep
yvgo
fueron creados.Edición 1: Si bien mi antiguo método funciona, ya no es la forma "correcta" de hacerlo. Debería utilizar las capacidades del proveedor
vgo
, odep
(por ahora) que están habilitadas por defecto en Go 1.6; ver . Básicamente agrega sus paquetes "externos" o "dependientes" dentro de unvendor
directorio; Al compilar, el compilador usará estos paquetes primero.Encontró. Pude importar el paquete local
GOPATH
creando una subcarpetapackage1
y luego importando conimport "./package1"
inbinary1.go
ybinary2.go
scripts como este:binary1.go
Entonces mi estructura de directorio actual se ve así:
También debo tener en cuenta que las rutas relativas (al menos en go 1.5) también funcionan; por ejemplo:
fuente
import "../package1"
No existe el "paquete local". La organización de paquetes en un disco es ortogonal a cualquier relación de paquetes padre / hijo. 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
y no luches contra el sistema de construcció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 se pueden obtener.
El concepto de rutas de importación tiene algunas propiedades importantes:
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.
fuente
import "myproject/packageN"
.myproject
Cuál es el nombre de la carpeta que contiene mi proyecto?Quizás estés intentando modularizar tu paquete. Supongo que
package1
ypackage2
son, en cierto modo, parte del mismo paquete, pero para facilitar la lectura, los está dividiendo en varios archivos.Si el caso anterior era suyo, podría usar el mismo nombre de paquete en esos archivos múltiples y sería como si hubiera el mismo archivo.
Esto es un ejemplo:
add.go
restar.go
donothing.go
No soy un experto en Go y esta es mi primera publicación en StackOveflow, por lo que si tiene algún consejo, será bien recibido.
fuente
Tengo un problema similar y la solución que estoy usando actualmente usa los módulos Go 1.11. Tengo la siguiente estructura
Y puedo importar package1 y package2 desde project1 y project2 usando
Después de ejecutar
go mod init projects
. Puedo usargo build
desde los directorios project1 y project2 o puedo hacerlogo build -o project1/exe project1/*.go
desde el directorio de proyectos.La desventaja de este método es que todos sus proyectos terminan compartiendo la misma lista de dependencias en go.mod. Todavía estoy buscando una solución a este problema, pero parece que podría ser fundamental.
fuente
Desde la introducción de go.mod , creo que la administración de paquetes tanto locales como externos se vuelve más fácil. Usando go.mod , también es posible tener un proyecto fuera de GOPATH.
Importar paquete local:
Cree una carpeta demoproject y ejecute el siguiente comando para generar el archivo go.mod
go mod init demoproject
Tengo una estructura de proyecto como la siguiente dentro del directorio demoproject .
Para fines de demostración, inserte el siguiente código en el archivo model.go .
En main.go , importé el modelo de empleado haciendo referencia a "demoproject / src / model"
Importar dependencia externa:
Simplemente ejecute el
go get
comando dentro del directorio del proyecto.Por ejemplo:
Debe incluir la dependencia del módulo en el archivo go.mod
https://blog.golang.org/using-go-modules
fuente
can't load package: package .: no Go files in...
(vaya a compilar en la carpeta de go.mod)Para agregar un paquete "local" a su proyecto, agregue una carpeta (por ejemplo, "nombre_paquete"). Y ponga sus archivos de implementación en esa carpeta.
En tus
package main
haz esto:Dónde
package_name
está 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.Puede anidar más subdirectorios siempre que especifique la ruta completa a la carpeta principal en la importación.
fuente
package myproject/package_name is not in GOROOT (/usr/lib/go-1.14/src/myproject/package_name)
Puedes usar
replace
foo / go.mod
foo / main.go
bar / go.mod
bar / fn.go
Importar un paquete local es como importar un paquete externo
excepto que dentro del archivo go.mod reemplaza el nombre del paquete externo con una carpeta local.
La ruta a la carpeta puede ser completa o relativa "/ ruta / a / bar" o "../bar"
https://github.com/golang/go/wiki/Modules#when-should-i-use-the-replace-directive https://thewebivore.com/using-replace-in-go-mod-to-point -a-su-módulo-local /
fuente