Sự khác biệt giữa go get và go install là gì?


81

Sau khi chơi với gocông cụ một lúc, nó trông giống như go get:

  1. (tùy chọn) tải xuống,
  2. biên dịch,
  3. và cài đặt

một phần mềm, trong khi go installđơn giản

  1. biên dịch
  2. và cài đặt

nó. Trong trường hợp này, tại sao go installlệnh tồn tại, vì go getnó thay thế nó?

Câu trả lời:


75

go installlà một phần của quy trình làm việc khi làm việc cục bộ. Giả sử bạn muốn sử dụng thư viện, nhưng vì lý do nào đó, cần phải thay đổi. Bạn sẽ làm:

  • go get -d library, mà chỉ tải xuống nó;
  • thực hiện thay đổi trên gói đã tải xuống;
  • go install library để cài đặt phiên bản cục bộ.

Theo như tôi biết go getkhông có cờ nào cho biết nó không nên tải xuống, vì vậy nó không thể thay thế go installở đây.

Quy trình làm việc tương tự được sử dụng khi bạn phát triển một gói mới từ đầu.


1
Thật tuyệt, tôi nghĩ bây giờ tôi đã hiểu nhờ ví dụ đầu tiên của bạn. Tuy nhiên, trong cái thứ hai của bạn (phát triển một gói mới từ đầu) tôi cũng có thể sử dụng go get ./path/to/local_package, và nó sẽ hoạt động giống như khi tôi sử dụng go install ./path/to/local_package, phải không? Vì không có quá trình tải xuống trong trường hợp này.
thiagowfx

go installlàm cho mục tiêu của bạn rõ ràng hơn, nhưng tôi cho rằng cả hai sẽ đạt được điều tương tự. Tôi đã thử nghiệm với một vài gói, bao gồm cả những gói được khai báo là mainvà chúng có vẻ tương đương. Các tài liệu rất thiếu lệnh này.
BoppreH

Ở đây nó nói rằng, bạn cần gcc cho go getnhưng không cho go install. Điều đó liên quan đến mô tả này như thế nào?
AndreKR

3
Tôi không đồng ý với câu trả lời này. Bạn cũng có thể sử dụng go getthay vì go installtrong dấu đầu dòng thứ ba, vì go getsẽ không tải lại thư viện (trừ khi bạn thêm -u). Bạn cũng có thể sử dụng go getkhi viết thư viện từ đầu. go installdường như hoàn toàn dư thừa.
Simon

34

go get thực hiện hai điều chính theo thứ tự này:

  • tải xuống và lưu trong $GOPATH/src/<import-path>các gói (mã nguồn) có tên trong các đường dẫn nhập, cùng với các phụ thuộc của chúng, sau đó

  • thực hiện một go install

Các -dlá cờ ( go get -d) chỉ thị go getdừng lại sau khi tải về gói; nghĩa là, nó hướng dẫn go getkhông làmgo install


Sự khác biệt:

go get // xác minh xem các gói có cần tải xuống không, tải xuống nếu cần rồi biên dịch

go install // bỏ qua phần tải xuống các gói, chỉ cần biên dịch (điều này sẽ gây ra lỗi nếu thiếu bất kỳ gói nào)


về GOPATHbiến môi trường

Các GOPATH môi trường được sử dụng bởi các công cụ Go. Nó phải được thiết lập để có thể get, buildinstall các gói, và nó xác định vị trí của không gian làm việc của bạn. Đây có thể là biến môi trường duy nhất bạn cần đặt khi phát triển mã Go.

Một lần nữa, GOPATH không nên trỏ đến cài đặt Go, mà là đến không gian làm việc của bạn.

Ví dụ: trên Windows, nếu bạn quyết định rằng không gian làm việc của mình đang ở c:\gowork\, bạn sẽ cần đặt GOPATHgiá trị làc:\gowork

nhập mô tả hình ảnh ở đây

Mã nguồn của bạn phải ở c:\gowork\src\<some project folder>\và sau khi bạn chạy go getở dấu nhắc lệnh từ bên trong, c:\gowork\src\<some project folder>\bạn sẽ thấy c:\gowork\bin\c:\gowork\pkg\đang được tạo.


go installtải xuống gói trong cài đặt nhận biết mô-đun.
Berkant Ipek

0

Lưu ý rằng từ ngày 1.16 (Quý 1 năm 2021) sẽ làm cho sự khác biệt đó rõ ràng hơn, được triển khai với CL 266360 như một phần của vấn đề 40276 :

go installbây giờ chấp nhận các đối số có hậu tố phiên bản (ví dụ go install example.com/cmd@v1.0.0:).
Điều này gây ra go installđể xây dựng và cài đặt các gói trong chế độ nhận biết mô-đun , bỏ qua go.modtệp trong thư mục hiện tại hoặc bất kỳ thư mục mẹ nào, nếu có.
Điều này rất hữu ích để cài đặt các tệp thực thi mà không ảnh hưởng đến các phụ thuộc của mô-đun chính .

go install, có hoặc không có hậu tố phiên bản (như được mô tả ở trên), hiện là cách được khuyến nghị để xây dựng và cài đặt các gói ở chế độ mô-đun.

go getnên được sử dụng với -dcờ để điều chỉnh sự phụ thuộc của mô-đun hiện tại mà không cần xây dựng gói và việc sử dụng go getđể xây dựng và cài đặt gói không được dùng nữa .
Trong bản phát hành trong tương lai, -dcờ sẽ luôn được bật .

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.