2015-06-03 39 views
31

Các lập trình viên Go mới thường không biết hoặc bị nhầm lẫn về lệnh cơ bản của lệnh build.Xây dựng xây dựng là gì?

Chính xác việc xây dựng lệnh go buildgo install là gì và họ đặt kết quả/đầu ra ở đâu?

Trả lời

45

Lệnh go phụ thuộc vào việc chúng tôi chạy nó cho gói "bình thường" hoặc cho gói "main" đặc biệt.

Đối với các gói

  • go build   xây dựng gói của bạn sau đó vứt bỏ kết quả.
  • go install xây dựng rồi cài đặt gói trong thư mục $GOPATH/pkg của bạn.

Đối với các lệnh (gói main)

  • go build   xây dựng các lệnh và rời khỏi kết quả trong thư mục làm việc hiện tại .
  • go install tạo lệnh trong thư mục tạm thời, sau đó di chuyển lệnh đến $GOPATH/bin.

Về cơ bản, bạn có thể sử dụng go build như một tấm séc rằng các gói có thể được xây dựng (cùng với sự phụ thuộc của họ) trong khi go install cũng (vĩnh viễn) cài đặt các kết quả trong các thư mục thích hợp của $GOPATH của bạn.

go build sẽ tự động chấm dứt nếu mọi thứ đều OK và sẽ cung cấp cho bạn thông báo lỗi nếu các gói không thể được xây dựng/biên soạn.

Bất cứ khi nào công cụ go cài đặt gói hoặc nhị phân, nó cũng cài đặt bất kỳ phụ thuộc nào, do đó, chạy go install cũng sẽ cài đặt gói chương trình của bạn phụ thuộc vào (có sẵn công khai, "go gettable" gói).

Để bắt đầu, hãy đọc trang How to Write Go Code chính thức.

biết thêm thông tin về công cụ go: Command go

Bạn cũng có thể nhận được sự giúp đỡ nhiều hơn nữa bằng cách chạy lệnh sau:

go help build 

Nó cũng đáng chú ý là bắt đầu với Go 1.5 go install cũng loại bỏ thực thi tạo bởi go build (source):

Nếu 'đi cài đặt' (không có đối số, có nghĩa là trong thư mục hiện tại) thành công, xóa tệp thi hành được viết bởi 'go build', nếu có. Điều này tránh để lại một nhị phân cũ sau ...

Để hoàn thành danh sách, go run biên soạn ứng dụng của bạn thành thư mục tạm thời và bắt đầu nhị phân thực thi đó. Khi ứng dụng tồn tại, nó sẽ dọn dẹp các tập tin tạm thời.

Câu hỏi lấy cảm hứng từ Dave Cheney của What does go build build?

+1

có vẻ lạ khi cài đặt không cập nhật tệp thực thi nếu nó giống với tệp được cài đặt trước đó ... bất kỳ thông tin chi tiết nào ở đây? –

4

Đối với gói:

go build: xây dựng gói của bạn sau đó vứt bỏ kết quả

Điều đó sẽ không là sự thật sau khi Go 1.10 (Q1 2018), cảm ơn CL 68116CL 75473. Xem this thread, mà tôi tham khảo ở đây.

làm chính xác go buildgo install lệnh xây dựng gì

Bất cứ khi nào các công cụ đi cài đặt một gói hoặc nhị phân, nó cũng cài đặt bất cứ điều gì phụ thuộc nó có, vì vậy chạy đi cài đặt cũng sẽ cài đặt các gói của bạn chương trình phụ thuộc vào (có sẵn công khai, "go gettable" gói), tự động.

Trên thực tế ... go install sẽ thay đổi cũng với Go 1.10, ngoài của bộ nhớ cache mới:

Các "go install" lệnh không còn cài đặt phụ thuộc của gói tên (CL 75850).

Nếu bạn chạy "go install foo", điều duy nhất được cài đặt là foo.

Trước đó, nó đa dạng. Nếu phụ thuộc đã lỗi thời, "go install" cũng đã cài đặt bất kỳ phụ thuộc nào.
Cài đặt ngầm của phụ thuộc trong "go install" gây ra nhiều nhầm lẫn và đau đầu cho người dùng, nhưng trước đây cần phải bật các bản dựng gia tăng.
Không còn nữa.
Chúng tôi nghĩ rằng ngữ nghĩa "install what I said" mới sẽ dễ hiểu hơn nhiều, đặc biệt vì nó rõ ràng từ các báo cáo lỗi mà nhiều người dùng đã mong đợi chúng.
Buộc lắp đặt phụ thuộc trong "go install", sử dụng mới "go install -i", bằng cách tương tự với "go build -i" và "go test -i".

Thực tế là "go install" được sử dụng để cài đặt bất kỳ phụ thuộc được xây dựng lại nào gây nhầm lẫn thường xuyên nhất cùng với -a, có nghĩa là "force rebuild of all dependencies".
Bây giờ, "go install -a myprog" sẽ buộc xây dựng lại hoàn toàn tất cả các phụ thuộc của myprog, cũng như myprog chính nó, nhưng chỉ myprog mới được cài đặt.(Tất cả các phụ thuộc được xây dựng lại sẽ vẫn được lưu trong bộ nhớ đệm xây dựng, tất nhiên.)
Làm cho trường hợp này hoạt động dễ hiểu hơn đặc biệt quan trọng kết hợp với phân tích độ chính xác dựa trên nội dung mới, vì nó thấy lý do tốt để xây dựng lại các phụ thuộc thường xuyên hơn so với trước đây, điều này sẽ làm tăng số lượng "tại sao các phụ thuộc của tôi bị cài đặt" nhầm lẫn. Ví dụ, nếu bạn chạy "go install -gcflags=-N myprog", cài đặt myprog được xây dựng không có tối ưu hóa trình biên dịch, nhưng nó cũng không còn cài đặt lại gói myprog sử dụng từ thư viện chuẩn mà không tối ưu hóa trình biên dịch.

Các vấn đề liên quan