vindo de um Node
ambiente que usei para instalar uma versão específica de uma lib do fornecedor na pasta do projeto ( node_modules
), dizendo npm
para instalar essa versão dessa lib a partir do package.json
ou diretamente do console, assim:
$ npm install express@4.0.0
Então eu costumava importar essa versão desse pacote no meu projeto apenas com:
var express = require('express');
Agora, eu quero fazer a mesma coisa com go
. Como eu posso fazer isso? É possível instalar uma versão específica de um pacote? Se sim, usando um centralizado $GOPATH
, como posso importar uma versão em vez de outra?
Eu faria algo assim:
$ go get github.com/wilk/uuid@0.0.1
$ go get github.com/wilk/uuid@0.0.2
Mas aí, como faço a diferença na importação?
go
package
package-managers
Wilk
fonte
fonte
go get
é a ferramenta correta se você deseja esse comportamento. Você pode pesquisar soluções para o seu problema específico no Google.Respostas:
O Go 1.11 terá um recurso chamado módulos go e você pode simplesmente adicionar uma dependência com uma versão. Siga esses passos:
Aqui está mais informações sobre esse tópico - https://github.com/golang/go/wiki/Modules
fonte
go get github.com/wilk/[email protected]
(comGO111MODULE=on
)go get
, nãogo mod
.Realmente surpreso que ninguém tenha mencionado gopkg.in .
gopkg.in
é um serviço que fornece um wrapper (redirecionamento) que permite expressar versões como repo urls, sem realmente criar repos. Por exemplo ,gopkg.in/yaml.v1
vsgopkg.in/yaml.v2
, embora ambos vivam emhttps://github.com/go-yaml/yaml
Isso não é perfeito se o autor não está seguindo as práticas adequadas de controle de versão (incrementando o número da versão ao quebrar a compatibilidade com versões anteriores), mas funciona com branches e tags.
fonte
Você pode usar
git checkout
para obter uma versão específica e construir seu programa usando esta versão.Exemplo:
fonte
Glide é um gerenciamento de pacotes realmente elegante para Go, especialmente se você vem de Node's NPM ou Rust's cargo.
Ele se comporta de perto ao novo recurso de fornecedor de Godep no 1.6, mas é muito mais fácil. Suas dependências e versões são "bloqueadas" dentro do diretório projectdir / vendor sem depender do GOPATH.
Instale com cerveja (OS X)
Inicie o arquivo glide.yaml (semelhante ao package.json). Isso também pega os pacotes importados existentes em seu projeto do GOPATH e os copia para o diretório / fornecedor do projeto.
Obtenha novos pacotes
Atualize e bloqueie as versões dos pacotes. Isso cria o arquivo glide.lock no diretório do projeto para bloquear as versões.
Tentei deslizar e estou feliz usando-o no meu projeto atual.
fonte
Atualização 18-11-23 : Do Go 1.11 mod é um experimento oficial. Por favor, veja a resposta @krish.
Atualização 19-01-01 : Do Go 1.12 mod ainda é um experimento oficial. A partir do Go 1.13, o modo de módulo será o padrão para todo o desenvolvimento.
Atualização 19-10-17 : From Go 1.13 mod é o gerenciador de pacotes oficial.
https://blog.golang.org/using-go-modules
Resposta antiga:
Você pode definir a versão oficial pelo dep
fonte
go get
, nãodep
.No Go 1.5 existe o "experimento do fornecedor" que ajuda a gerenciar dependências. A partir do Go 1.6, isso não é mais um experimento. Existem também algumas outras opções no Go wiki. .
Edit: conforme mencionado nesta resposta, gopkg.in é uma boa opção para fixar github-depdencies pré-1.5.
fonte
dep
é o experimento oficial para gerenciamento de dependências para a linguagem Go. Requer Go 1.8 ou mais recente para compilar.Para começar a gerenciar dependências usando
dep
, execute o seguinte comando no diretório raiz do seu projeto:Após a execução, dois arquivos serão gerados:
Gopkg.toml
("manifesto"),Gopkg.lock
e os pacotes necessários serão baixados novendor
diretório.Vamos supor que você tenha o projeto que usa o
github.com/gorilla/websocket
pacote.dep
irá gerar os seguintes arquivos:Gopkg.toml
Gopkg.lock
Existem comandos que ajuda você a update / delete / etc pacotes, por favor encontrar mais informações sobre repo github oficial de
dep
(ferramenta de gerenciamento de dependência para Go).fonte
Hoje você pode usar apenas
go get
para isso. Você pode buscar sua dependência pela tag de versão, branch ou mesmo pelo commit.mais detalhes aqui - Como apontar a dependência do módulo Go em go.mod para um commit mais recente em um repo?
Go get
também instalará o binário, como diz na documentação -Get downloads the packages named by the import paths, along with their dependencies. It then installs the named packages, like 'go install'.
(de https://golang.org/cmd/go/ )
fonte
go get é o gerenciador de pacotes Go. Funciona de forma completamente descentralizada e como a descoberta de pacotes ainda é possível sem um repositório central de hospedagem de pacotes.
Além de localizar e baixar pacotes, a outra grande função de um gerenciador de pacotes é lidar com várias versões do mesmo pacote. Go tem a abordagem mais minimalista e pragmática de qualquer gerenciador de pacotes. Não existem versões múltiplas de um pacote Go.
go get sempre puxa do HEAD do branch padrão no repositório. Sempre. Isso tem duas implicações importantes:
Como autor do pacote, você deve aderir à filosofia HEAD estável. Seu branch padrão deve ser sempre a versão estável e lançada de seu pacote. Você deve trabalhar em branches de recursos e somente fundir quando estiver pronto para lançar.
Novas versões principais de seu pacote devem ter seu próprio repositório. Simplificando, cada versão principal de seu pacote (seguindo a versão semântica) teria seu próprio repositório e, portanto, seu próprio caminho de importação.
por exemplo, github.com/jpoehls/gophermail-v1 e github.com/jpoehls/gophermail-v2.
Como alguém que está criando um aplicativo em Go, a filosofia acima realmente não tem uma desvantagem. Cada caminho de importação é uma API estável. Não há números de versão com que se preocupar. Impressionante!
Para mais detalhes: http://zduck.com/2014/go-and-package-versioning/
fonte
go get
O cache do significa que você não percebe por um tempo, a menos que tenha um servidor de compilação que o atualize com a versão mais recente todas as vezes. Existem gerenciadores de pacotes de terceiros, mas eles são quase sempre toscos.A abordagem que achei viável é o sistema de submódulos do git . Usando isso, você pode submódulo em uma determinada versão do código e a atualização / desatualização é explícita e registrada - nunca ao acaso.
A estrutura de pastas que usei com isso é:
fonte
go get
)Isso funcionou para mim
GO111MODULE=on go get -u github.com/segmentio/[email protected]
fonte
Existe um comando go edit -replace para anexar um commit específico (mesmo de outro repositório bifurcado) no topo da versão atual de um pacote. O que é legal sobre essa opção, é que você não precisa saber a pseudo versão exata de antemão, apenas o id de hash do commit .
Por exemplo, estou usando a versão estável do pacote "github.com/onsi/ginkgo v1.8.0".
Agora eu quero - sem modificar esta linha do pacote obrigatório em go.mod - adicionar um patch do meu fork, em cima da versão ginkgo:
Depois da primeira vez que você construir ou testar seu módulo, o GO tentará obter a nova versão e, em seguida, gerar a linha "substituir" com a pseudo versão correta. Por exemplo, no meu caso, ele adicionará na parte inferior de go.mod:
fonte
Uma pequena folha de dicas sobre as consultas do módulo.
Para verificar todas as versões existentes: por exemplo
go list -m -versions github.com/gorilla/mux
Por exemplo
go get github.com/gorilla/[email protected]
fonte