Nota: esta pregunta está relacionada con esta , pero dos años es mucho tiempo en la historia de Go.
¿Cuál es la forma estándar de organizar un proyecto Go durante el desarrollo?
Mi proyecto es un paquete único mypack
, así que supongo que pongo todos los archivos .go en un mypack
directorio.
Pero luego, me gustaría probarlo durante el desarrollo, por lo que necesito al menos un archivo que declare el main
paquete, para que pueda hacergo run trypack.go
¿Cómo debo organizar esto? ¿Debo hacerlo go install mypack
cada vez que quiera probarlo?
Respuestas:
Recomendaría revisar esta página sobre Cómo escribir el código Go
Documenta cómo estructurar su proyecto de
go build
manera amigable y también cómo escribir pruebas. Las pruebas no necesitan ser un cmd usando elmain
paquete. Simplemente pueden ser funciones con nombre TestX como parte de cada paquete, y luego lasgo test
descubrirán.La estructura sugerida en ese enlace en su pregunta está un poco desactualizada, ahora con el lanzamiento de Go 1. Ya no necesitaría colocar un
pkg
directorio debajosrc
. Los únicos 3 directorios relacionados con las especificaciones son los 3 en la raíz de su GOPATH: bin, pkg, src. Debajo de src, simplemente puede colocar su proyectomypack
, y debajo de eso están todos sus archivos .go, incluido mypack_test.gogo build
luego se integrará en el nivel raíz pkg y bin.Entonces su GOPATH podría verse así:
export GOPATH=$HOME/projects
Actualización: a partir de> = Go 1.11, el sistema Módulo ahora es una parte estándar de las herramientas y el concepto GOPATH está a punto de quedar obsoleto.
fuente
~
al establecer variables ambientales , y también lo hace el shell de bourne busybox, por ejemplo. Pruébelo usted mismo:export BOB=~ && env | grep ^BOB
cederáBOB=/your/homedir
$HOME
trabaja en más conchas entonces~
, por ejemplo, enfish
jdi tiene la información correcta sobre el uso de
GOPATH
. Agregaría que si también tiene la intención de tener un binario, es posible que desee agregar un nivel adicional a los directorios.running
go build myproj/mypack
construirá elmypack
paquete junto con sus dependencias running ejecutarágo build myproj/myapp
elmyapp
binario junto con sus dependencias, lo que probablemente incluye lamypack
biblioteca.fuente
He estudiado varios proyectos de Go y hay bastante variación. Puede saber quién viene de C y quién viene de Java, ya que el primero voltea casi todo en el directorio raíz de proyectos en un
main
paquete, y el segundo tiende a colocar todo en unsrc
directorio. Sin embargo, ninguno es óptimo. Cada uno tiene consecuencias porque afectan las rutas de importación y cómo otros pueden reutilizarlas.Para obtener los mejores resultados, elaboré el siguiente enfoque.
Dónde
mypack.go
estápackage mypack
ymain/mypack.go
está (obviamente)package main
.Si necesita archivos de soporte adicionales, tiene dos opciones. Manténgalos todos en el directorio raíz o coloque archivos de soporte privados en un
lib
subdirectorio. P.ejO
Solo coloque los archivos en un
lib
directorio si no están destinados a ser importados por otro proyecto. En otras palabras, si son archivos de soporte privados . Esa es la idea detrás de tenerlib
--para separar las interfaces públicas de las privadas.Hacer las cosas de esta manera le dará una buena ruta de importación,
myproj.org/mypack
para reutilizar el código en otros proyectos. Si lo usalib
, los archivos de soporte interno tendrán una ruta de importación que es indicativa de esomyproj.org/lib/mysupport
,.Al construir el proyecto, use
main/mypack
, por ejemplogo build main/mypack
. Si tiene más de un ejecutable, también puede separarlosmain
sin tener que crear proyectos separados. por ejemplomain/myfoo/myfoo.go
ymain/mybar/mybar.go
.fuente
cmd/nameOfMyExecutable
subdirectorio para el paquete principal (solo es necesariocmd/…
si tiene varios comandos; veagolang.org/x/tools/cmd
; de lo contrario, es común intercambiarlo y tenerlomain.go
en el nivel superior). La forma en que logo install
tenga creará un ejecutable "main" (o "main.exe"). Además, lo idiomático es usar uninternal
subdirectorio para un subpaquete interno del paquete / programa que no debe usarse en otro lugar (se espera que las futuras versiones de Go no obliguen a nadie más a importarinternal
paquetes hechos de esta manera).Me resulta muy útil entender cómo organizar el código en Golang en este capítulo http://www.golang-book.com/11 del libro escrito por Caleb Doxsey
fuente
No parece haber una forma estándar de organizar proyectos de Go, pero https://golang.org/doc/code.html especifica una mejor práctica para la mayoría de los proyectos. La respuesta de jdi es buena, pero si usa github o bitbucket y también tiene bibliotecas adicionales, debe crear la siguiente estructura:
Al hacerlo de esta manera, puede tener un repositorio separado para mylib que puede usarse para otros proyectos y puede recuperarse mediante "ir a buscar". Su proyecto mypack puede importar su biblioteca usando "github.com/username/mylib". Para más información:
http://www.alexvictorchan.com/2014/11/06/go-project-structure/
fuente
Mantenga los archivos en el mismo directorio y úselos
package main
en todos los archivos.Entonces corre:
fuente
Exploremos cómo el
go get repository_remote_url
comando gestiona la estructura del proyecto bajo$GOPATH
. Si hacemos ungo get github.com/gohugoio/hugo
clonará el repositorio bajoEsta es una buena manera de crear su ruta de proyecto inicial . Ahora exploremos cuáles son los tipos de proyectos y cómo se organizan sus estructuras internas. Todos los proyectos de golang en la comunidad se pueden clasificar en
Libraries
(sin binarios ejecutables)Single Project
(contiene solo 1 binario ejecutable)Tooling Projects
(contiene múltiples archivos binarios ejecutables)En general, los archivos de proyecto golang se pueden empaquetar bajo cualquier principio de diseño , como DDD , POD
La mayoría de los proyectos disponibles siguen este diseño orientado a paquetes
El diseño orientado a paquetes alienta al desarrollador a mantener la implementación solo dentro de sus propios paquetes, aparte del
/internal
paquete que esos paquetes no pueden comunicarse entre síBibliotecas
/internal
El paquete se utiliza principalmente para ocultar la implementación de otros proyectos.Proyecto individual
Proyectos de herramientas
cmd/
El paquete gestiona la cantidad de binarios (herramientas) que queremos construirfuente