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 mypackdirectorio.
Pero luego, me gustaría probarlo durante el desarrollo, por lo que necesito al menos un archivo que declare el mainpaquete, para que pueda hacergo run trypack.go
¿Cómo debo organizar esto? ¿Debo hacerlo go install mypackcada 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 buildmanera amigable y también cómo escribir pruebas. Las pruebas no necesitan ser un cmd usando elmainpaquete. Simplemente pueden ser funciones con nombre TestX como parte de cada paquete, y luego lasgo testdescubrirá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
pkgdirectorio 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 buildluego se integrará en el nivel raíz pkg y bin.Entonces su GOPATH podría verse así:
export GOPATH=$HOME/projectsActualizació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 ^BOBcederáBOB=/your/homedir$HOMEtrabaja en más conchas entonces~, por ejemplo, enfishjdi 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/mypackconstruirá elmypackpaquete junto con sus dependencias running ejecutarágo build myproj/myappelmyappbinario junto con sus dependencias, lo que probablemente incluye lamypackbiblioteca.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
mainpaquete, y el segundo tiende a colocar todo en unsrcdirectorio. 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.goestápackage mypackymain/mypack.goestá (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
libsubdirectorio. P.ejO
Solo coloque los archivos en un
libdirectorio 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/mypackpara 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 separarlosmainsin tener que crear proyectos separados. por ejemplomain/myfoo/myfoo.goymain/mybar/mybar.go.fuente
cmd/nameOfMyExecutablesubdirectorio 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.goen el nivel superior). La forma en que logo installtenga creará un ejecutable "main" (o "main.exe"). Además, lo idiomático es usar uninternalsubdirectorio 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 importarinternalpaquetes 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 mainen todos los archivos.Entonces corre:
fuente
Exploremos cómo el
go get repository_remote_urlcomando gestiona la estructura del proyecto bajo$GOPATH. Si hacemos ungo get github.com/gohugoio/hugoclonará 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
/internalpaquete que esos paquetes no pueden comunicarse entre síBibliotecas
/internalEl 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