Làm thế nào để biên dịch chương trình Go gồm nhiều tệp?


88

Tôi có một chương trình nhỏ bao gồm ba tệp, tất cả đều thuộc cùng một gói (chính), nhưng khi tôi thực hiện "go build main.go", việc xây dựng không thành công. Khi nó chỉ là một tệp (main.go) mọi thứ đều hoạt động tốt. Bây giờ tôi đã cố gắng tách mã, có vẻ như trình biên dịch không thể tìm thấy những thứ đã được lấy ra khỏi main.go và đưa vào hai tệp khác này (nằm ở cùng thư mục với main.go) . Dẫn đến lỗi "loại '" không xác định.

Làm thế nào để biên dịch chương trình bao gồm nhiều tệp này?

Câu trả lời:


86

Cách mới ( Khuyến nghị ):

Xin hãy xem câu trả lời này .

Cách cũ:

Giả sử bạn đang viết một chương trình có tên myprog:

Đặt tất cả các tệp của bạn trong một thư mục như thế này

myproject/go/src/myprog/xxx.go

Sau đó thêm myproject/govào GOPATH

Và chạy

go install myprog

Bằng cách này, bạn sẽ có thể thêm các gói và chương trình khác trong myproject / go / src nếu bạn muốn.

Tham khảo: http://golang.org/doc/code.html

(Tài liệu này luôn bị người mới bỏ qua và ban đầu thường không hiểu. Tài liệu này sẽ nhận được sự quan tâm lớn nhất của đội cờ vây IMO)


5
Tại sao không loại bỏ / go / và chỉ làm myproject / src?
Alexander Mills

Ngoài ra, tôi giả sử "go install myprog" ghi nguồn dự án vào vị trí $ GOPATH bằng cách nào đó? Có đúng không? nếu như vậy, sẽ rất tuyệt nếu có mà giải thích như là một phần của câu trả lời cũng
Alexander Mills

1
@AlexanderMills Chỉ các dự án nhỏ đang sử dụng chỉ một công nghệ.
Denys Séguret

2
@ DenysSéguret không chắc tôi đồng ý với điều đó, nhưng dù sao điều này cũng dành cho các dự án đơn giản, bạn có thể bỏ phần đi - mọi người có thể cho rằng việc đi là cần thiết và không phải vậy. Bạn cho tôi biết, cái nào đơn giản hơn, đi hay không? :)
Alexander Mills

1
Tôi vẫn không hiểu tại sao lại có cấu trúc thư mục này?
Madeo

67

main.goVí dụ more.go, khi bạn tách mã từ thành , bạn chỉ cần chuyển tệp đó vào go build/ go run/ go install.

Vì vậy, nếu trước đây bạn đã chạy

go build main.go

bạn bây giờ đơn giản

go build main.go more.go

Như thông tin thêm:

go build --help

Những trạng thái:

Nếu các đối số là danh sách các tệp .go, xây dựng coi chúng như một danh sách các tệp nguồn chỉ định một gói duy nhất.


Lưu ý rằng go buildgo installkhác go runở chỗ hai trạng thái đầu tiên mong đợi tên gói làm đối số, trong khi trạng thái sau mong đợi các tệp go . Tuy nhiên, hai phần đầu tiên cũng sẽ chấp nhận các tập tin go như go install.

Nếu bạn đang tự hỏi: xây dựng sẽ chỉ là buildcác gói / tệp, installsẽ tạo ra các tệp đối tượng và tệp nhị phân trong GOPATH của bạn, đồng thời runsẽ biên dịch và chạy chương trình của bạn.


6
Nếu bạn không muốn tiếp tục thêm ngày càng nhiều tệp, hãy sử dụng regex, với: go run *
.go

Ok, cảm ơn, có phải Go luôn chỉ ghi một tệp thực thi ra ngoài không? Nó không giữ các tệp thi hành được tách biệt (như trong Java)?
Alexander Mills

@AlexanderMills vì cửa sổ, tôi nghĩ, sử dụng nix. hoặc ít nhất là hòa nhập.
Sergey Gorlanov

yeah Tôi đã sử dụng hệ điều hành MacOS, nhưng có lẽ đó là Bash phiên bản 3 đó là fuckin' lên, tôi nên nâng cấp lên Bash 4.
Alexander Mills

30

Bạn cũng có thể chạy

go build

trong thư mục dự án của bạn myproject / go / src / myprog

Sau đó, bạn có thể chỉ cần gõ

./myprog

để chạy ứng dụng của bạn


3
đầu ra là một đối tượng go, không phải là một thực thi.
user2284570 17/02/17

@ user2284570 chỉ cần thêm chmod +xgiấy phép cho tập tin đó để chạy nó
dalmate

19

Vì Go 1.11+, GOPATH không còn được khuyến nghị nữa, cách mới là sử dụng Go Modules.

Giả sử bạn đang viết một chương trình có tên simple:

  1. Tạo một thư mục:

    mkdir simple
    cd simple
    
  2. Tạo một mô-đun mới:

    go mod init github.com/username/simple
    # Here, the module name is: github.com/username/simple.
    # You're free to choose any module name.
    # It doesn't matter as long as it's unique.
    # It's better to be a URL: so it can be go-gettable.
    
  3. Đặt tất cả các tệp của bạn trong thư mục đó.

  4. Cuối cùng, hãy chạy:

    go run .
    
  5. Ngoài ra, bạn có thể tạo một chương trình thực thi bằng cách xây dựng nó:

    go build .
    
    # then:
    ./simple     # if you're on xnix
    
    # or, just:
    simple       # if you're on Windows
    

Để biết thêm thông tin, bạn có thể đọc phần này .

Go đã bao gồm hỗ trợ cho các mô-đun được tạo phiên bản như được đề xuất ở đây kể từ 1.11. Phiên bản vgo nguyên mẫu ban đầu đã được công bố vào tháng 2 năm 2018. Vào tháng 7 năm 2018, các mô-đun được tạo phiên bản đã hạ cánh trong kho lưu trữ chính của Go. Trong Go 1.14, hỗ trợ mô-đun được coi là đã sẵn sàng để sử dụng trong sản xuất và tất cả người dùng được khuyến khích chuyển sang mô-đun từ các hệ thống quản lý phụ thuộc khác.


7

Bạn có thể dùng

go build *.go 
go run *.go

cả hai đều sẽ hoạt động, bạn có thể sử dụng

go build .
go run .

5

Nó phụ thuộc vào cấu trúc dự án của bạn. Nhưng đơn giản nhất là:

go build ./... -o ./myproject

sau đó chạy ./myproject.

Giả sử cấu trúc dự án của bạn trông như thế này

- hello
|- main.go

sau đó bạn chỉ cần chuyển đến thư mục dự án và chạy

go build -o ./myproject

sau đó chạy ./myprojecttrên shell.

hoặc là

# most easiest; builds and run simultaneously
go run main.go

giả sử tệp chính của bạn được lồng vào một thư mục con như cmd

- hello
|- cmd
 |- main.go

sau đó bạn sẽ chạy

go run cmd/main.go

3

Đúng! Điều đó rất dễ hiểu và đó là lúc chiến lược gói phát huy tác dụng. có ba cách để tôi biết. cấu trúc thư mục:

GOPATH / src / github.com/ abc / myproject / adapter / main.go pkg1 pkg2 cảnh báo: bộ điều hợp chỉ có thể chứa gói chính và thư mục sun

  1. điều hướng đến thư mục "adapter". Chạy:
    go build main.go
  1. điều hướng đến thư mục "adapter". Chạy:
    go build main.go
  1. điều hướng đến GOPATH / src nhận ra đường dẫn tương đối đến gói chính, tại đây "myproject / adapter". Chạy:
    go build myproject/adapter

tập tin exe sẽ được tạo tại thư mục bạn đang ở.

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.