Como usar pacotes personalizados

178

Estou tentando criar e usar um pacote personalizado no Go. Provavelmente é algo muito óbvio, mas não consigo encontrar muita informação sobre isso. Basicamente, eu tenho esses dois arquivos na mesma pasta:

mylib.go

package mylib

type SomeType struct {

}

main.go

package main

import (
    "mylib"
)

func main() {

}

Quando tento go run main.go, recebo este erro:

main.go:4:2: import "mylib": cannot find package

Eu tentei executar go build mylib.goprimeiro, mas parece não estar fazendo nada (nenhum arquivo gerado, nenhuma mensagem de erro). Alguma idéia de como eu poderia fazer isso?

Laurent
fonte
Eu não defini uma variável GOPATH, apenas GOROOT.
Laurent
1
execute go installno diretório mylibfirst e tente novamente.
24413 Joe
1
Veja também este tópico .
Kostix
@ Joe, ainda não pode funcionar executando "go install" dentro
hunter_tech 14/02

Respostas:

175

Primeiro, certifique-se de ler e entender o documento "Como escrever o código Go" .

A resposta real depende da natureza do seu "pacote personalizado".

Se for para uso geral, considere empregar o chamado "layout de código do Github" . Basicamente, você transforma sua biblioteca em um go getprojeto de tabela separado .

Se sua biblioteca é para uso interno, você pode ir assim:

  1. Coloque o diretório com os arquivos da biblioteca no diretório do seu projeto.
  2. No restante do seu projeto, consulte a biblioteca usando seu caminho em relação à raiz do seu espaço de trabalho que contém o projeto.

Para demonstrar:

src/
  myproject/
    mylib/
      mylib.go
      ...
    main.go

Agora, no nível superior main.go, você poderia import "myproject/mylib"e funcionaria bem.

kostix
fonte
1
Se eu criar um novo projeto (myproject2) em src /, como eu poderia importar o mylib?
Kiril
2
@ Kiril, você quer dizer, como você importa mylibno código myproject2? Então a resposta é "usando import "myproject/mylib"- a idéia é que o Go GOPATHprocure caminhos importados em cada diretório extraído da variável de ambiente (eles são chamados de" espaços de trabalho "), mas essa pesquisa (felizmente) não é recursiva, portanto , esses caminhos são efetivamente "ancorado" em suas respectivas áreas de trabalho.
kostix
4
Outra leitura obrigatória: "Nomes dos pacotes" .
Kostix
1
@MatthiasSommer, normalmente - extraindo esse mylib em um pacote comum que cada microsserviço usa. Exatamente como "usos" é definido, depende do seu fluxo de trabalho preferido. No desenvolvimento de nível corporativo, o fornecedor é normalmente usado, mas com os go moddesenvolvimentos recentes , um módulo pode ser a resposta (e também go modsuporta o fornecimento de módulos).
Kostix 15/05/19
1
@LeiYang ", o pacote a ser importado" é um diretório com um ou mais arquivos de origem Go. Quanto a "como criar um pacote para um arquivo .lib" e depois importar o arquivo lib "- a resposta depende do que você realmente deseja solicitar. Se você está preocupado com a velocidade de compilação, não tenha medo: a cadeia de ferramentas Go armazena em cache . todos os resultados da construção sobre uma base por pacote Se, em vez disso, você queria perguntar se é possível compilar e distribuir um pacote somente binário compilado, então a resposta é não .
kostix
68

Para este tipo de estrutura de pastas:

main.go
mylib/
  mylib.go

A maneira mais simples é usar isso:

import (
    "./mylib"
)
Laurent
fonte
1
Isso não funciona mais nas versões recentes do go, pois o pacote não será encontrado. A importação correta seria foo/mylib(assumindo que a pasta que contém main.go seja foo).
nemo
6
@nemo, com a versão mais recente do go, eu sempre uso "./mylib" e funciona.
precisa
3
Usando Go 1.2 e concordo com @ this.lau_
canadadry
8
Esteja ciente de que isso faz uma go installpausa. Se você estiver construindo um projeto independente no qual deseja que as pessoas go buildbaixem e executem , tudo bem - no entanto, eu empregaria o "layout de código do Github" mencionado acima (mesmo se estiver fora do bitbucket ou similar), se você quiser go installsuporte completo .
Photoionized
SugestãoNão use dessa maneira. É vontade de quebrar godef. godef ele não entende sobre "." importações
King Jk
6

Para um projeto hospedado no GitHub, veja o que as pessoas costumam fazer:

github.com/
  laike9m/
    myproject/
      mylib/
        mylib.go
        ...
      main.go

mylib.go

package mylib

...

main.go

import "github.com/laike9m/myproject/mylib"

...
laike9m
fonte
6

Sou um programador experiente, mas bastante novo no mundo Go! E confesso que enfrentei algumas dificuldades para entender o Go ... Eu enfrentei esse mesmo problema ao tentar organizar meus arquivos go em subpastas. Do jeito que eu fiz:

GO_Directory (aquele atribuído a $ GOPATH)

GO_Directory //the one assigned to $GOPATH
__MyProject
_____ main.go
_____ Entites
_____ Fiboo // in my case, fiboo is a database name
_________ Client.go // in my case, Client is a table name

No arquivo MyProject \ Entities \ Fiboo \ Client.go

package Fiboo

type Client struct{
    ID int
    name string
}

no arquivo MyProject \ main.go

package main

import(
    Fiboo "./Entity/Fiboo" 
)

var TableClient  Fiboo.Client

func main(){
    TableClient.ID = 1
    TableClient.name = 'Hugo'

    // do your things here
}

(Estou executando o Go 1.9 no Ubuntu 16.04)

E lembre-se pessoal, eu sou novato em Go. Se o que estou fazendo for uma má prática, me avise!

Diego Favero
fonte
3

outra solução:
adicione src/myprojecta $ GOPATH.

Então import "mylib"irá compilar.

Helin Wang
fonte
isso não funcionará em caminhos que podem ser obtidos, como pacotes hospedados no github.
28416 Gustav