Làm cách nào để nhập một phiên bản cụ thể của một gói bằng go get?


109

đến từ Nodemôi trường tôi đã sử dụng để cài đặt phiên bản cụ thể của lib của nhà cung cấp vào thư mục dự án ( node_modules) bằng cách yêu npmcầu cài đặt phiên bản lib đó từ package.jsonhoặc thậm chí trực tiếp từ bảng điều khiển, như sau:

$ npm install express@4.0.0

Sau đó, tôi đã sử dụng để nhập phiên bản của gói đó vào dự án của mình chỉ với:

var express = require('express');

Bây giờ, tôi muốn làm điều tương tự với go. Làm thế nào tôi có thể làm điều đó? Có thể cài đặt một phiên bản cụ thể của một gói không? Nếu vậy, bằng cách sử dụng một $GOPATHphiên bản tập trung , làm cách nào để tôi có thể nhập một phiên bản thay vì một phiên bản khác?

Tôi sẽ làm một cái gì đó như thế này:

$ go get github.com/wilk/uuid@0.0.1
$ go get github.com/wilk/uuid@0.0.2

Nhưng sau đó, làm thế nào tôi có thể tạo ra sự khác biệt trong quá trình nhập?


4
Bạn không, go getkhông phải là công cụ chính xác nếu bạn muốn hành vi này. Bạn có thể google xung quanh để tìm giải pháp cho vấn đề cụ thể của bạn.
Wessie

1
Đọc này
kostix

stackoverflow.com/questions/30188499/… Điều này cũng có vẻ hữu ích
earlonrails

Đối với cờ vây 1.11 trở lên, hãy xem Mô-đun cờ vây: stackoverflow.com/questions/53682247/…
Everton

Câu trả lời:


46

Go 1.11 sẽ có một tính năng được gọi là mô-đun go và bạn có thể chỉ cần thêm phần phụ thuộc với một phiên bản. Làm theo các bước sau:

go mod init .
go mod edit -require github.com/wilk/uuid@0.0.1` 
go get -v -t ./...   
go build
go install 

Đây là thông tin khác về chủ đề đó - https://github.com/golang/go/wiki/Modules


4
làm thế nào để làm điều đó với go get only? tôi cần cài đặt bản nhị phân toàn cầu cho phiên bản cụ thể
James Tan

7
@JamesTan go get github.com/wilk/uuid@0.0.1(với GO111MODULE=on)
Neil Conway

5
Câu hỏi đã được sử dụng go get, không phải go mod.
Bernardo Loureiro

40

Thực sự ngạc nhiên khi không ai đề cập đến gopkg.in .

gopkg.inlà một dịch vụ cung cấp trình bao bọc (chuyển hướng) cho phép bạn thể hiện các phiên bản dưới dạng url repo mà không thực sự tạo repo. Ví dụ: gopkg.in/yaml.v1vs gopkg.in/yaml.v2, mặc dù cả hai đều sống ởhttps://github.com/go-yaml/yaml

Điều này không hoàn hảo nếu tác giả không tuân theo các phương pháp lập phiên bản thích hợp (bằng cách tăng số phiên bản khi phá vỡ khả năng tương thích ngược), nhưng nó hoạt động với các nhánh và thẻ.


5
Tôi thích (và sử dụng) gopkg, nhưng việc lập phiên bản không hoạt động chính xác với các gói con. Chỉ là một cái gì đó để nhận thức về.
Alec Thomas

gopkg.in không được kiểm tra đầy đủ trong các phiên bản cũ git, vì vậy nó không hoạt động bình thường với git <v1.9
BMW

Ngoài ra, nó chỉ hoạt động cho các phiên bản chính. Nó không thể sử dụng để đảm bảo các bản dựng có thể tái tạo.
CAFxX

26

Bạn có thể sử dụng git checkoutđể tải một phiên bản cụ thể và xây dựng chương trình của mình bằng phiên bản này.

Thí dụ:

export GOPATH=~/
go get github.com/whateveruser/whateverrepo
cd ~/src/github.com/whateveruser/whateverrepo
git tag -l
# supose tag v0.0.2 is correct version
git checkout tags/v0.0.2
go run whateverpackage/main.go

Giải pháp sau đó sẽ là thanh toán git và đi cài đặt
ptman

@ aliaksei-maniuk cho chúng tôi một giải pháp tốt hơn. Sử dụng https://github.com/golang/dep
João Paraná

15

Lướt là một quản lý gói thực sự thanh lịch cho Go, đặc biệt nếu bạn đến từ hàng hóa npm của Node hoặc Rust.

Nó hoạt động gần với tính năng nhà cung cấp mới của Godep trong phiên bản 1.6 nhưng dễ dàng hơn. Các phiên bản và phụ thuộc của bạn bị "khóa" bên trong thư mục projectdir / nhà cung cấp của bạn mà không cần dựa vào GOPATH.

Cài đặt bằng brew (OS X)

$ brew install glide

Init tệp glide.yaml (tương tự như package.json). Thao tác này cũng lấy các gói đã nhập hiện có trong dự án của bạn từ GOPATH và sao chép sau đó vào thư mục / nhà cung cấp của dự án.

$ glide init

Nhận các gói mới

$ glide get vcs/namespace/package

Cập nhật và khóa các phiên bản của gói. Thao tác này tạo tệp glide.lock trong thư mục dự án của bạn để khóa các phiên bản.

$ glide up

Tôi đã thử lướt và rất vui khi sử dụng nó cho dự án hiện tại của mình.


1
Để hoàn thiện, đây là trang web cho glide: glide.sh Và đây là repo: github.com/Masterminds/glide
Michael Franzl

Rất tiếc, Glide không còn "hoạt động" nữa, trên trang github, họ đề xuất chuyển sang quản lý gói chính thức (bây giờ chuyển sang mô-đun)
damoiser

13

Cập nhật 18-11-23 : Từ bản mod Go 1.11 là bản thử nghiệm chính thức. Vui lòng xem câu trả lời của @krish.
Cập nhật 19-01-01 : Bản mod từ Go 1.12 vẫn đang là bản thử nghiệm chính thức. Bắt đầu trong Go 1.13, chế độ mô-đun sẽ là chế độ mặc định cho tất cả sự phát triển.
Cập nhật 19-10-17 : Từ bản mod Go 1.13 là trình quản lý gói chính thức.

https://blog.golang.org/using-go-modules

Câu trả lời cũ:

Bạn có thể đặt phiên bản của người đẹp chính thức

dep ensure --add github.com/gorilla/websocket@1.2.0

3
Câu hỏi đã được sử dụng go get, không phải dep.
Bernardo Loureiro


9

deplà thử nghiệm chính thức để quản lý sự phụ thuộc cho ngôn ngữ Go. Nó yêu cầu Go 1.8 hoặc mới hơn để biên dịch.

Để bắt đầu quản lý các phần phụ thuộc bằng cách sử dụng dep, hãy chạy lệnh sau từ thư mục gốc của dự án của bạn:

dep init

Sau khi thực hiện, hai tệp sẽ được tạo: Gopkg.toml("tệp kê khai") Gopkg.lockvà các gói cần thiết sẽ được tải xuốngvendor thư mục.

Giả sử rằng bạn có dự án sử dụng github.com/gorilla/websocketgói. depsẽ tạo các tệp sau:

Gopkg.toml

# Gopkg.toml example
#
# Refer to https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md
# for detailed Gopkg.toml documentation.
#
# required = ["github.com/user/thing/cmd/thing"]
# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"]
#
# [[constraint]]
#   name = "github.com/user/project"
#   version = "1.0.0"
#
# [[constraint]]
#   name = "github.com/user/project2"
#   branch = "dev"
#   source = "github.com/myfork/project2"
#
# [[override]]
#  name = "github.com/x/y"
#  version = "2.4.0"


[[constraint]]
  name = "github.com/gorilla/websocket"
  version = "1.2.0"

Gopkg.lock

# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'.


[[projects]]
  name = "github.com/gorilla/websocket"
  packages = ["."]
  revision = "ea4d1f681babbce9545c9c5f3d5194a789c89f5b"
  version = "v1.2.0"

[solve-meta]
  analyzer-name = "dep"
  analyzer-version = 1
  inputs-digest = "941e8dbe52e16e8a7dff4068b7ba53ae69a5748b29fbf2bcb5df3a063ac52261"
  solver-name = "gps-cdcl"
  solver-version = 1

Có các lệnh giúp bạn cập nhật / xóa / gói vv, vui lòng tìm thêm thông tin trên github repo chính thức của dep(công cụ quản lý phụ thuộc cho Go).


7

Ngày nay bạn chỉ có thể sử dụng go getnó. Bạn có thể tìm nạp phụ thuộc của mình bằng thẻ phiên bản, nhánh hoặc thậm chí là cam kết.

go get github.com/someone/some_module@master
go get github.com/someone/some_module@v1.1.0
go get github.com/someone/some_module@commit_hash

chi tiết hơn tại đây - Làm thế nào để trỏ sự phụ thuộc của mô-đun Go trong go.mod đến một cam kết mới nhất trong một repo?

Go getcũng sẽ cài đặt nhị phân, giống như nó nói trong tài liệu -

Get downloads the packages named by the import paths, along with their dependencies. It then installs the named packages, like 'go install'.

(từ https://golang.org/cmd/go/ )


4

go get là trình quản lý gói Go. Nó hoạt động theo cách hoàn toàn phi tập trung và vẫn có thể khám phá gói mà không cần kho lưu trữ gói trung tâm.

Bên cạnh việc định vị và tải xuống các gói, vai trò lớn khác của trình quản lý gói là xử lý nhiều phiên bản của cùng một gói. Go sử dụng cách tiếp cận tối thiểu và thực dụng nhất của bất kỳ trình quản lý gói nào. Không có cái gọi là nhiều phiên bản của một gói Go.

go get luôn kéo từ HEAD của nhánh mặc định trong kho lưu trữ. Luôn luôn. Điều này có hai ý nghĩa quan trọng:

  1. Là một tác giả gói, bạn phải tuân thủ triết lý HEAD ổn định. Nhánh mặc định của bạn phải luôn là phiên bản đã phát hành, ổn định của gói của bạn. Bạn phải làm việc trong các nhánh tính năng và chỉ hợp nhất khi sẵn sàng phát hành.

  2. Các phiên bản chính mới của gói của bạn phải có kho lưu trữ riêng của chúng. Nói một cách đơn giản, mỗi phiên bản chính của gói của bạn (sau cách lập phiên bản ngữ nghĩa) sẽ có kho lưu trữ riêng và do đó đường dẫn nhập riêng của nó.

    ví dụ: github.com/jpoehls/gophermail-v1 và github.com/jpoehls/gophermail-v2.

Là một người đang xây dựng một ứng dụng trong cờ vây, triết lý trên thực sự không có nhược điểm. Mọi đường dẫn nhập đều là một API ổn định. Không có số phiên bản để lo lắng. Tuyệt vời!

Để biết thêm chi tiết: http://zduck.com/2014/go-and-package-versions/


45
Tuyên bố của bạn về chức năng của các công cụ go là đúng, nhưng gần như không ai kết hợp các phiên bản vào tên kho lưu trữ git của họ và nhiều người không coi master / HEAD là một API ổn định. Tôi hiện có một dịch vụ nhỏ với khoảng tám phụ thuộc; chỉ có một có một số phiên bản. Amazon đã đẩy một thay đổi đột phá lên github.com/aws/aws-sdk-go. go getBộ nhớ đệm của có nghĩa là bạn không nhận thấy trong một thời gian trừ khi bạn có một máy chủ xây dựng cập nhật hữu ích cho bạn phiên bản mới nhất mỗi lần. Có các trình quản lý gói của bên thứ ba, nhưng chúng chủ yếu là thô sơ.
dhasenan

19
@faisal_kk chắc hẳn bạn đang sống trong một thế giới trong mơ. Trong thế giới THỰC của cộng đồng mã nguồn mở tuyệt vời, mọi người đều tuân thủ triết lý của riêng họ. Không có chuyện phát hành phân nhánh như vậy, tôi rất vui vì chúng tôi có thẻ.

28
Tạo kho lưu trữ cho mọi phiên bản? Nó là điên
deFreitas

8
Đây là hành vi sai về cơ bản. Mã nguồn KHÔNG giống với một gói đã phát hành và bạn không thể đặt các tác giả gói để đảm bảo khả năng tương thích ngược / chuyển tiếp. Không phải vì các nhà phát triển không đủ năng lực, mà vì điều này về mặt lý thuyết là không thể khi số lượng gói phụ thuộc tăng lên vượt quá một. Do đó, Go get được định sẵn là đi theo con đường giống như bower, người có lỗ hổng chính là lỗi này. Phiên bản ngữ nghĩa cũng không đủ mạnh, tổng kiểm tra nhị phân thực sự là cách duy nhất để thực hiện.
Gudlaugur Egilsson

5
"Không có số phiên bản nào để lo lắng. Thật tuyệt vời!" Đó phải là câu nói ngớ ngẩn nhất trong một câu trả lời SO từ trước đến nay. Lập phiên bản là có lý do. Việc Go thiếu một trình quản lý gói có cấu hình sẵn có hoặc cơ chế định hướng lệnh để phiên bản các phụ thuộc theo ý mình không ngụ ý rằng việc phiên bản là một điều phiền toái. Không ủng hộ!
Harindaka

2

Cách tiếp cận mà tôi thấy khả thi là hệ thống mô-đun con của git . Bằng cách sử dụng nó, bạn có thể mô-đun con trong một phiên bản nhất định của mã và việc nâng cấp / hạ cấp là rõ ràng và được ghi lại - không bao giờ lộn xộn.

Cấu trúc thư mục tôi đã chụp với cái này là:

+ myproject
++ src
+++ myproject
+++ github.com
++++ submoduled_project of some kind.

Tôi cũng sử dụng cách tiếp cận này. Về cơ bản, nó tuân theo cấu trúc thư mục giống như go get, nhưng cho phép bạn kiểm soát tốt hơn phiên bản bạn đang tải.
Brad Peabody

câu trả lời không trả lời câu hỏi với các tiêu chí được hỏi (sử dụng go get)
Baptiste Mille-Mathias

2

Điều đó đã làm việc cho tôi

GO111MODULE=on go get -u github.com/segmentio/aws-okta@v0.22.1


2

Có một lệnh go edit -replace để thêm một cam kết cụ thể (thậm chí từ một kho lưu trữ đã phân nhánh khác) lên trên phiên bản hiện tại của một gói. Điều thú vị về tùy chọn này là bạn không cần biết trước phiên bản giả chính xác , chỉ cần id băm cam kết .

Ví dụ: tôi đang sử dụng phiên bản ổn định của gói "github.com/onsi/ginkgo v1.8.0".

Bây giờ tôi muốn - mà không cần sửa đổi dòng gói bắt buộc này trong go.mod - để thêm một bản vá từ fork của tôi, trên phiên bản ginkgo:

$ GO111MODULE="on"  go mod edit -replace=github.com/onsi/ginkgo=github.com/manosnoam/ginkgo@d6423c2

Sau lần đầu tiên bạn xây dựng hoặc thử nghiệm mô-đun của mình, GO sẽ cố gắng lấy phiên bản mới và sau đó tạo dòng "thay thế" bằng phiên bản giả chính xác. Ví dụ trong trường hợp của tôi, nó sẽ thêm vào cuối go.mod:

thay thế github.com/onsi/ginkgo => github.com/manosnoam/ginkgo v0.0.0-20190902135631-1995eead7451


2

Một bảng gian lận nhỏ về các truy vấn mô-đun.

Để kiểm tra tất cả các phiên bản hiện có: ví dụ: go list -m -versions github.com/gorilla/mux

  1. Phiên bản cụ thể @ v1.2.8
  2. Cam kết cụ thể @ c783230
  3. Cam kết cụ thể @master
  4. Tiền tố phiên bản @ v2
  5. So sánh @> = 2.1.5
  6. @Latest mới nhất

Ví dụ go get github.com/gorilla/mux@v1.7.4

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.