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 build
và go install
là gì và họ đặt kết quả/đầu ra ở đâu?
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 build
và go install
là gì và họ đặt kết quả/đầu ra ở đâu?
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?
Đố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 68116 và CL 75473. Xem this thread, mà tôi tham khảo ở đây.
làm chính xác
go build
vàgo 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ủamyprog
, 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 đặtmyprog
đượ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óimyprog
sử dụng từ thư viện chuẩn mà không tối ưu hóa trình biên dịch.
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? –