Vấn đềBạn chạy lệnh go build ./... và mong đợi quá trình biên dịch diễn ra suôn sẻ, nhưng trình biên dịch đột ngột dừng lại. Nó chỉ ra một thư mục cụ thể và thông báo không tìm thấy tệp Go nào, mặc dù bạn có thể thấy chúng ngay trong trình soạn thảo của mình. Lỗi này là cách Go thông báo: "Tôi tìm thấy các tệp, nhưng cài đặt hiện tại của bạn yêu cầu tôi bỏ qua tất cả chúng."
Tại sao Go bỏ qua các tệp của bạnGo sử dụng các ràng buộc biên dịch (build constraints - hoặc build tags) để quyết định tệp nào thuộc về một tệp thực thi cụ thể. Nếu bạn đang build trên macOS nhưng các tệp của bạn chỉ dành cho Windows, Go sẽ lọc bỏ chúng. Khi bộ lọc đó khiến trình biên dịch không còn tệp nào, nó sẽ báo lỗi này. Thông thường, nguyên nhân nằm ở một trong bốn vấn đề sau:
- Hậu tố OS/Arch: Các tên tệp như
disk_windows.gosẽ bị bỏ qua khi build trên Linux hoặc macOS.- Build Tags nghiêm ngặt: Một tệp bắt đầu bằng//go:build integrationsẽ không được biên dịch trong một lần chạy thông thường.- Bẫy 'Chỉ có tệp Test': Thư mục chỉ chứa các tệp*_test.go. Go cần ít nhất một tệp.gothông thường để định nghĩa một package.- Tiền tố dự phòng: Go hoàn toàn bỏ qua bất kỳ thư mục nào bắt đầu bằng dấu chấm (.git) hoặc dấu gạch dưới (_vendor).## Cách khắc phục### 1. Kiểm tra hậu tố nền tảngNếu thư mục/pkgcủa bạn chỉ chứaservice_windows.govà bạn đang chạy trên MacBook (Darwin), quá trình build sẽ thất bại. Bộ công cụ của Go tự động tìm kiếm các hậu tố như_linux,_windows, hoặc_amd64.
# Kiểm tra nội dung thư mục
ls pkg/
# Kết quả: logic_windows.go logic_windows_test.go
Để khắc phục, hãy tạo một tệp không phụ thuộc nền tảng như logic.go cho mã nguồn dùng chung. Hoặc, thêm tệp logic_darwin.go để hỗ trợ môi trường hiện tại của bạn.
2. Xác minh Build TagsGo hiện đại (1.17+) sử dụng cú pháp //go:build ở đầu tệp. Kiểm tra xem các tệp của bạn có đang bị ẩn sau các tag tùy chỉnh hay không:
//go:build pro_version
package pkg
Nếu tag này tồn tại, lệnh go build thông thường sẽ bỏ qua tệp đó. Bạn phải chỉ định rõ tag trong câu lệnh của mình:
go build -tags=pro_version ./...
Ngoài ra, hãy cẩn thận với chỉ thị //go:build ignore. Các nhà phát triển thường sử dụng lệnh này cho các tập lệnh hoặc công cụ mà họ không muốn đưa vào tệp thực thi chính.
3. Lỗi "Package trống"Go yêu cầu mỗi thư mục package phải có ít nhất một tệp không phải tệp test. Nếu thư mục của bạn trông như thế này:
pkg/
└── logic_test.go
Trình biên dịch sẽ báo lỗi vì không có tệp logic.go để cung cấp ngữ cảnh cho các bài kiểm tra. Chỉ cần thêm một tệp với khai báo package pkg là đủ để làm hài lòng trình biên dịch.
Mẹo gỡ lỗi chuyên nghiệpĐừng đoán xem Go đang nhìn thấy những tệp nào. Hãy sử dụng công cụ go list để kiểm tra góc nhìn của hệ thống build. Chạy lệnh này từ thư mục gốc của dự án:
go list -f '{{.GoFiles}}' ./pkg
Nếu kết quả trả về một danh sách trống [], các ràng buộc của bạn vẫn còn quá hạn chế. Nếu nó trả về [logic.go], bạn đã giải quyết được vấn đề. Bạn cũng có thể kiểm tra xem tệp nào đang bị bỏ qua và tại sao bằng cách thêm cờ -json và xem trường IgnoredGoFiles.

