Câu trả lời:
Những gì các go
lệnh không phụ thuộc vào việc chúng ta chạy nó cho một gói "bình thường" hoặc cho đặc biệt "main"
gói.
Đối với các gói
go build
xây dựng gói của bạn sau đó loại bỏ kết quả .go install
xây dựng sau đó cài đặt gói trong $GOPATH/pkg
thư mục của bạn .Đối với các lệnh (gói main
)
go build
xây dựng lệnh và để lại kết quả trong thư mục làm việc hiện tại .go install
xây dựng lệnh trong một thư mục tạm thời sau đó di chuyển nó đến $GOPATH/bin
.go build
?Bạn có thể chuyển các gói đến go build
, các gói bạn muốn xây dựng. Bạn cũng có thể chuyển một danh sách các .go
tệp từ một thư mục, sau đó được coi là danh sách các tệp nguồn chỉ định một gói duy nhất.
Nếu không có gói nào (đường dẫn nhập) được cung cấp, bản dựng sẽ được áp dụng trên thư mục hiện tại.
Đường dẫn nhập có thể chứa một hoặc nhiều "..."
ký tự đại diện (trong trường hợp đó là một mẫu ). ...
có thể khớp với bất kỳ chuỗi nào, ví dụ net/...
khớp với net
gói và các gói nằm trong bất kỳ thư mục con nào của nó. Lệnh
go build ./...
thường được sử dụng để xây dựng gói trong thư mục hiện tại và tất cả các gói đệ quy xuống. Lệnh này được phát hành trong một dự án gốc sẽ xây dựng dự án hoàn chỉnh.
Để biết thêm về chỉ định gói, hãy chạy go help packages
.
Hỗ trợ sơ bộ cho các mô-đun Go đã được giới thiệu trong Go 1.11 và các mô-đun trở thành mặc định bắt đầu với Go 1.13. Khi go
công cụ được chạy từ một thư mục chứa go.mod
tệp (hoặc một trong những thư mục cha của thư mục hiện tại), go
công cụ sẽ chạy ở chế độ nhận biết mô-đun (chế độ kế thừa được gọi là chế độ GOPATH ).
Trong chế độ nhận biết mô-đun, GOPATH không còn xác định ý nghĩa của các lần nhập trong quá trình xây dựng, nhưng nó vẫn lưu trữ các phần phụ thuộc đã tải xuống (trong GOPATH / pkg / mod) và các lệnh đã cài đặt (trong GOPATH / bin, trừ khi GOBIN được đặt).
Khi xây dựng mô-đun, những gì được xây dựng được chỉ định bởi danh sách xây dựng . Danh sách xây dựng ban đầu chỉ chứa mô-đun chính (mô-đun chứa thư mục nơi go
lệnh được chạy), và các phần phụ thuộc của mô-đun chính được thêm vào danh sách xây dựng, một cách đệ quy (các thành phần phụ thuộc cũng được thêm vào).
Để biết thêm thông tin, hãy chạy go help modules
.
Về cơ bản, bạn có thể sử dụng go build
để kiểm tra rằng các gói có thể được xây dựng (cùng với các phụ thuộc của chúng) 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 bạn $GOPATH
.
go build
sẽ âm thầm chấm dứt nếu mọi thứ đều ổn, và sẽ cung cấp cho bạn thông báo lỗi nếu không thể xây dựng / biên dịch các gói.
Bất cứ khi nào go
công cụ cài đặt một gói hoặc tệp nhị phân, nó cũng cài đặt bất kỳ phụ thuộc nào mà nó có, vì vậy việc chạy go install
cũng sẽ tự động cài đặt các gói mà chương trình của bạn phụ thuộc vào (gói "go gettable").
Để bắt đầu, hãy đọc trang Cách viết mã Go chính thức .
Thông tin thêm về go
công cụ: Command go
Bạn cũng có thể nhận thêm trợ giúp bằng cách chạy lệnh sau:
go help build
Cũng cần lưu ý rằng bắt đầu với Go 1.5 go install
cũng loại bỏ các tệp thực thi được tạo bởi go build
( nguồn ):
Nếu 'go install' (không có đối số, nghĩa là thư mục hiện tại) thành công, hãy xóa tệp thực thi được viết bởi 'go build', nếu có. Điều này tránh để lại một tệp nhị phân cũ ...
Để hoàn thành danh sách, hãy go run
biên dịch ứng dụng của bạn vào một thư mục tạm thời và khởi động tệp nhị phân thực thi đó. Khi ứng dụng thoát, nó sẽ dọn dẹp các tệp tạm thời đúng cách.
Câu hỏi được truyền cảm hứng bởi Dave Cheney's What does go build build?
Đối với gói:
go build
: xây dựng gói của bạn sau đó loại bỏ kết quả
Điều đó sẽ không còn đúng sau Go 1.10 (Q1 2018), cảm ơn CL 68116 và CL 75473 . Xem chủ đề này , mà tôi tham khảo ở đây.
Những gì chính xác
go build
vàgo install
các lệnh xây dựngBất cứ khi nào công cụ go cài đặt một gói hoặc tệp nhị phân, nó cũng sẽ cài đặt bất kỳ phụ thuộc nào mà nó có, vì vậy việc chạy go install cũng sẽ tự động cài đặt các gói mà chương trình của bạn phụ thuộc vào (gói "go gettable").
Trên thực tế ... go install
cũng sẽ thay đổi với Go 1.10, ngoài bộ đệm mới:
Lệnh "
go install
" không còn cài đặt các gói phụ thuộc của các gói có tên ( CL 75850 ).Nếu bạn chạy "
go install foo
", thứ duy nhất được cài đặt làfoo
.Trước đây, nó rất đa dạng. Nếu phần phụ thuộc đã lỗi thời, "
go install
" cũng được cài đặt bất kỳ phần phụ thuộc nào.
Việc cài đặt ngầm các phụ thuộc trong thời gian "go install
" gây ra nhiều nhầm lẫn và đau đầu cho người dùng, mà trước đây việc kích hoạt các bản dựng tăng dần là điều cần thiết.
Không còn nữa.
Chúng tôi nghĩ rằnginstall what I said
ngữ nghĩa " " mới sẽ dễ hiểu hơn nhiều, đặc biệt là vì rõ ràng từ các báo cáo lỗi mà nhiều người dùng đã mong đợi chúng.
Để cài đặt lực lượng phụ thuộc trong "go install
", sử dụng mới "go install -i
" , tương tự như "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 ra nhầm lẫn thường xuyên nhất khi kết hợp 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ư củamyprog
chính nó, nhưng chỉmyprog
sẽ được cài đặt. (Tất nhiên, tất cả các phần phụ thuộc được xây dựng lại sẽ vẫn được lưu trong bộ đệm ẩn bản dựng.)
Làm cho trường hợp này hoạt động dễ hiểu hơn là đặc biệt quan trọng khi kết hợp với phân tích mức độ ổn định dựa trên nội dung mới, vì nó cho thấy những lý do chính đáng để xây dựng lại các phần phụ thuộc thường xuyên hơn trước đây , điều này sẽ làm tăng số lượng nhầm lẫn "tại sao các phần phụ thuộc của tôi được cài đặt".
Ví dụ: nếu bạn chạy "go install -gcflags=-N myprog
", cài đặtmyprog
được xây dựng mà 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 các góimyprog
sử dụng từ thư viện tiêu chuẩn mà không có tối ưu hóa trình biên dịch.
go build
, làm get
s? Tôi có một lỗi xây dựng cannot find package "github.com/spf13/cobra" in any of:…
. Tôi không biết phải nói như thế nào để có được nó. Tôi có cần phải nhận rõ ràng không?
go.mod
tệp trong đó không?
go version go1.11.4 linux/amd64
. Tôi không biết về go.mod. Tôi đang xây dựng lại https://github.com/cbroglie/mustache/blob/master/cmd/mustache/main.go
, thật kỳ lạ vì tôi vừa xây dựng toàn bộ gói và đang sử dụng ví dụ này làm cơ sở và tôi đã tạo một phiên bản cơ bản hơn hoạt động (nhưng không sử dụng thư viện này). Tôi không thể thấy nó không được cài đặt với gói ria mép như thế nào.