Lo he usado GOPATHpero 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.goa trabajar en el binary1.goo el binary2.goy así sucesivamente?
Por ejemplo; Quiero poder import "package1"y luego poder ejecutar go build binary1.goy todo funciona bien sin que se produzca el error de que no se puede encontrar el paquete 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 varios otros paquetes o guardarlos en un archivo grande.

.goarchivos en un solo directorio son parte del mismo paquete, y no necesitaimportarchivos 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/projectruta 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:
vgosi su versión go es:x >= go 1.11depovendorsi tu versión go es:go 1.6 >= x < go 1.11x < go 1.6Edición 3: Go 1.11 tiene una característica
vgoque reemplazarádep.Para usar
vgo, consulte la documentación de Módulos . TLDR a continuación:Este método crea un archivo llamado
go.moden su directorio de proyectos. Luego puede construir su proyecto congo build. SiGO111MODULE=autoestá 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.
vendores en gran parte un proceso manual, por esodepyvgofueron 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 unvendordirectorio; Al compilar, el compilador usará estos paquetes primero.Encontró. Pude importar el paquete local
GOPATHcreando una subcarpetapackage1y luego importando conimport "./package1"inbinary1.goybinary2.goscripts 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".myprojectCuál es el nombre de la carpeta que contiene mi proyecto?Quizás estés intentando modularizar tu paquete. Supongo que
package1ypackage2son, 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 builddesde los directorios project1 y project2 o puedo hacerlogo build -o project1/exe project1/*.godesde 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 demoprojectTengo 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 getcomando 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 mainhaz esto:Dónde
package_nameestá 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
replacefoo / 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