Eu usei, GOPATH
mas para este problema atual que estou enfrentando, não ajuda. Quero poder criar pacotes específicos para um projeto:
myproject/
├── binary1.go
├── binary2.go
├── package1.go
└── package2.go
Eu tentei várias maneiras, mas como faço para obter package1.go
a trabalhar no binary1.go
ou binary2.go
e assim por diante?
Por exemplo; Desejo import "package1"
poder executar e, em seguida, executar go build binary1.go
e tudo funciona bem sem o erro de que o pacote não pode ser encontrado em GOROOT
ou GOPATH
. A razão pela qual eu preciso desse tipo de funcionalidade é para projetos de grande escala; Eu não quero ter que fazer referência a vários outros pacotes ou mantê-los em um arquivo grande.
.go
arquivos em um único diretório fazem parte do mesmo pacote e você não precisa deimport
arquivos no mesmo pacote (ou seja, o mesmo diretório). Você mencionou trabalhar fora do GOPATH, que é um dos recursos do novo sistema de módulos Go. Esta resposta tampas módulo estrutura, a importação de pacotes locais, organizando pacotes dentro de um módulo, se deve ou não ter vários módulos no repositório único, etc.git/repo/to/my/project
caminho inteiro ? Só não vejo a razão pela qual alguém iria querer esse comportamento. E se você mover seu projeto para outro local (por exemplo, imagem do Docker), precisará alterar todos os caminhos novamente? Estou procurando respostas por que isso é tão complicado.Respostas:
Resumo do gerenciamento de dependências:
vgo
se a sua versão for:x >= go 1.11
dep
ouvendor
se a sua versão for:go 1.6 >= x < go 1.11
x < go 1.6
Editar 3: O Go 1.11 possui um recurso
vgo
que será substituídodep
.Para usar
vgo
, consulte a documentação dos módulos . TLDR abaixo:Este método cria um arquivo chamado
go.mod
no diretório de projetos. Você pode criar seu projeto comgo build
. SeGO111MODULE=auto
estiver definido, seu projeto não poderá estar$GOPATH
.Edição 2: o método de venda ainda é válido e funciona sem problemas.
vendor
é em grande parte um processo manual, por causa dissodep
evgo
foi criado.Edit 1: Enquanto minha maneira antiga funciona, não é mais a maneira "correta" de fazê-lo. Você deve usar os recursos do fornecedor
vgo
, oudep
(por enquanto) habilitados por padrão no Go 1.6; veja . Você basicamente adiciona seus pacotes "externos" ou "dependentes" em umvendor
diretório; após a compilação, o compilador usará esses pacotes primeiro.Encontrado. Consegui importar o pacote local
GOPATH
criando uma subpastapackage1
e depois importando comimport "./package1"
inbinary1.go
ebinary2.go
scripts como este:binary1.go
Portanto, minha estrutura de diretórios atual se parece com isso:
Devo também notar que caminhos relativos (pelo menos em go 1.5) também funcionam; por exemplo:
fonte
import "../package1"
Não existe "pacote local". A organização de pacotes em um disco é ortogonal a qualquer relação pai / filho de pacotes. A única hierarquia real formada por pacotes é a árvore de dependências, que geralmente não reflete a árvore de diretórios.
Apenas use
e não lute contra o sistema de construção sem um bom motivo. Salvar uma dúzia de caracteres por importação em qualquer programa não trivial não é um bom motivo, porque, por exemplo, projetos com caminhos de importação relativos não são aceitáveis.
O conceito de caminhos de importação tem algumas propriedades importantes:
Todas as opções acima são arruinadas usando caminhos de importação relativos. Não faça isso.
PS: Existem poucos lugares no código legado nos testes do compilador Go que usam importações relativas. ATM, esse é o único motivo pelo qual as importações relativas são suportadas.
fonte
import "myproject/packageN"
.myproject
é o nome da pasta que contém meu projeto?Talvez você esteja tentando modularizar seu pacote. Estou assumindo que
package1
epackage2
são, de certa forma, parte do mesmo pacote, mas para facilitar a leitura que você está dividindo aqueles em vários arquivos.Se o caso anterior fosse seu, você poderia usar o mesmo nome de pacote nesses múltiplos arquivos e será como se houvesse o mesmo arquivo.
Isto é um exemplo:
add.go
subtract.go
donothing.go
Não sou especialista em Go e esta é a minha primeira postagem no StackOveflow; portanto, se você tiver alguns conselhos, será bem recebido.
fonte
Eu tenho um problema semelhante e a solução que estou usando atualmente usa os módulos Go 1.11. Eu tenho a seguinte estrutura
E eu sou capaz de importar package1 e package2 do projeto1 e projeto2 usando
Depois de correr
go mod init projects
. Posso usargo build
nos diretórios project1 e project2 ougo build -o project1/exe project1/*.go
no diretório de projetos.A desvantagem desse método é que todos os seus projetos acabam compartilhando a mesma lista de dependências no go.mod. Ainda estou procurando uma solução para esse problema, mas parece que isso pode ser fundamental.
fonte
Desde a introdução do go.mod , acho que o gerenciamento de pacotes local e externo se torna mais fácil. Usando go.mod , é possível ter um projeto go fora do GOPATH também.
Importar pacote local:
Crie uma pasta descriptografar e execute o seguinte comando para gerar o arquivo go.mod
go mod init demoproject
Eu tenho uma estrutura de projeto como abaixo, dentro do diretório de descriptografia .
Para fins de demonstração, insira o seguinte código no arquivo model.go .
No main.go , importei o modelo Employee referenciando "demoproject / src / model"
Importar dependência externa:
Basta executar o
go get
comando dentro do diretório do projeto.Por exemplo:
Deve incluir a dependência do módulo no arquivo go.mod
https://blog.golang.org/using-go-modules
fonte
can't load package: package .: no Go files in...
(ir compilar na pasta go.mod)Para adicionar um pacote "local" ao seu projeto, adicione uma pasta (por exemplo "package_name"). E coloque seus arquivos de implementação nessa pasta.
No seu
package main
faça isso:Onde
package_name
está o nome da pasta e deve corresponder ao nome do pacote usado nos arquivos Whatever_name1.go e Whatever_name2.go. Em outras palavras, todos os arquivos com um subdiretório devem ter o mesmo pacote.Você pode aninhar ainda mais subdiretórios, desde que especifique o caminho inteiro para a pasta pai na importação.
fonte
package myproject/package_name is not in GOROOT (/usr/lib/go-1.14/src/myproject/package_name)
Você pode usar
replace
foo / go.mod
foo / main.go
bar / go.mod
bar / fn.go
Importar um pacote local é como importar um pacote externo
exceto no arquivo go.mod, você substitui o nome desse pacote externo por uma pasta local.
O caminho para a pasta pode ser completo ou relativo "/ path / to / bar" ou "../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 -para-seu-módulo-local /
fonte