Nota: esta pergunta está relacionada a esta , mas dois anos são muito longos na história do Go.
Qual é a maneira padrão de organizar um projeto Go durante o desenvolvimento?
Meu projeto é um pacote único mypack
, então acho que coloquei todos os arquivos .go em um mypack
diretório.
Mas então, eu gostaria de testá-lo durante o desenvolvimento, para que eu precise de pelo menos um arquivo que declare o main
pacote, para que eu possa fazergo run trypack.go
Como devo organizar isso? Preciso fazer isso go install mypack
toda vez que quiser experimentar?
Respostas:
Eu recomendaria revisar esta página em Como escrever código Go
Ele documenta como estruturar seu projeto de
go build
maneira amigável e também como escrever testes. Os testes não precisam ser um cmd usando omain
pacote. Eles podem simplesmente ser funções nomeadas do TestX como parte de cada pacote e depois asgo test
descobrirão.A estrutura sugerida nesse link na sua pergunta está um pouco desatualizada, agora com o lançamento do Go 1. Você não precisa mais colocar um
pkg
diretóriosrc
. Os únicos 3 diretórios relacionados a especificações são os 3 na raiz do seu GOPATH: bin, pkg, src. Abaixo do src, você pode simplesmente colocar o seu projetomypack
e, por baixo, todos os seus arquivos .go, incluindo o mypack_test.gogo build
irá então construir no nível raiz pkg e bin.Portanto, seu GOPATH pode ficar assim:
export GOPATH=$HOME/projects
Atualização: a partir de> = Ir 1.11, o sistema Module é agora uma parte padrão do ferramental e o conceito GOPATH está quase se tornando obsoleto.
fonte
~
ao definir variáveis ambientais , assim como o busybox bourne shell, por exemplo. Tente você mesmo:export BOB=~ && env | grep ^BOB
vai renderBOB=/your/homedir
$HOME
trabalha em mais conchas~
, por exemplo, emfish
jdi tem as informações corretas sobre o uso de
GOPATH
. Eu acrescentaria que, se você pretende ter um binário, também poderá adicionar um nível adicional aos diretórios.running
go build myproj/mypack
irá construir omypack
pacote junto com suas dependências runninggo build myproj/myapp
irá construir omyapp
binário junto com suas dependências que provavelmente incluem amypack
biblioteca.fonte
Estudei vários projetos Go e há uma boa variação. Você pode dizer quem vem de C e quem vem de Java, pois o primeiro despeja quase tudo no diretório raiz do projeto em um
main
pacote e o último tende a colocar tudo em umsrc
diretório. Nem é ideal, no entanto. Cada um tem consequências porque afeta os caminhos de importação e como os outros podem reutilizá-los.Para obter os melhores resultados, elaborei a seguinte abordagem.
Onde
mypack.go
estápackage mypack
emain/mypack.go
está (obviamente)package main
.Se você precisar de arquivos de suporte adicionais, terá duas opções. Mantenha todos eles no diretório raiz ou coloque os arquivos de suporte privado em um
lib
subdiretório. Por exemploOu
Coloque os arquivos em um
lib
diretório apenas se eles não forem importados por outro projeto. Em outras palavras, se eles são arquivos de suporte particulares . Essa é a idéia por trás de terlib
- para separar interfaces públicas de privadas.Fazer as coisas dessa maneira fornecerá um bom caminho de importação
myproj.org/mypack
para reutilizar o código em outros projetos. Se você usarlib
, os arquivos de suporte interno terão um caminho de importação indicativo dissomyproj.org/lib/mysupport
,.Ao construir o projeto, use
main/mypack
, por exemplogo build main/mypack
. Se você tiver mais de um executável, também poderá separá-losmain
sem precisar criar projetos separados. por exemplo,main/myfoo/myfoo.go
emain/mybar/mybar.go
.fonte
cmd/nameOfMyExecutable
subdiretório para o pacote principal (só é necessáriocmd/…
se você tiver vários comandos; vejagolang.org/x/tools/cmd
; caso contrário, é comum trocá-lo e utilizá - lomain.go
no nível superior). A maneira como você ogo install
criará um executável "main" (ou "main.exe"). Além disso, o idiomático é usar uminternal
subdiretório para um subconjunto interno ao pacote / programa que não deve ser usado em outros lugares (espera-se que as versões futuras do Go impeçam ninguém mais importarinternal
pacotes feitos dessa maneira).Acho muito útil entender como organizar o código em Golang neste capítulo http://www.golang-book.com/11 do livro escrito por Caleb Doxsey
fonte
Não parece haver uma maneira padrão de organizar projetos Go, mas https://golang.org/doc/code.html especifica uma prática recomendada para a maioria dos projetos. A resposta do jdi é boa, mas se você usa o github ou o bitbucket e também possui bibliotecas adicionais, deve criar a seguinte estrutura:
Fazendo dessa maneira, você pode ter um repositório separado para mylib que pode ser usado para outros projetos e pode ser recuperado por "vá buscar". Seu projeto mypack pode importar sua biblioteca usando "github.com/username/mylib". Para maiores informações:
http://www.alexvictorchan.com/2014/11/06/go-project-structure/
fonte
Mantenha os arquivos no mesmo diretório e use
package main
em todos os arquivos.Então corra:
fonte
Vamos explorar como o
go get repository_remote_url
comando gerencia a estrutura do projeto$GOPATH
. Se fizermos um,go get github.com/gohugoio/hugo
ele clonará o repositório emEssa é uma boa maneira de criar o caminho do projeto inicial . Agora vamos explorar quais são os tipos de projeto e como suas estruturas internas são organizadas. Todos os projetos golang na comunidade podem ser classificados em
Libraries
(sem binários executáveis)Single Project
(contém apenas 1 binário executável)Tooling Projects
(contém vários binários executáveis)Geralmente, os arquivos do projeto golang podem ser empacotados sob quaisquer princípios de design , como DDD , POD
A maioria dos projetos disponíveis segue este Design Orientado a Pacotes
O Design Orientado a Pacotes incentiva o desenvolvedor a manter a implementação apenas dentro de seus próprios pacotes, além do
/internal
pacote que esses pacotes não podem se comunicar.Bibliotecas
/internal
O pacote é usado principalmente para ocultar a implementação de outros projetos.Projeto único
Projetos de Ferramentas
cmd/
O pacote gerencia o número de binários (ferramentas) que queremos construirfonte