Giới thiệu về Quản lý phụ thuộc trong Go
Quản lý phụ thuộc là một khía cạnh quan trọng của bất kỳ dự án phần mềm nào, vì nó giúp quản lý các phiên bản của thư viện và gói mà dự án của bạn dựa vào. Trong Go (Golang) , quản lý phụ thuộc đảm bảo rằng các dự án Go của bạn có thể tái tạo và bảo trì bằng cách giúp giải quyết các vấn đề về phiên bản dễ dàng hơn, duy trì khả năng tương thích với các gói khác và hợp lý hóa quy trình phát triển tổng thể.
Trước Go Modules, việc quản lý phụ thuộc trong Go ít được sắp xếp hợp lý hơn. Các nhà phát triển thường sử dụng các công cụ như dep
, glide
hoặc govendor
để quản lý các phần phụ thuộc của họ. Mặc dù những công cụ này hữu ích nhưng chúng không phải là một phần của dự án Go chính thức và do đó, đã tạo ra trở ngại trong việc chấp nhận Go làm ngôn ngữ cho một số nhà phát triển.
Kỷ nguyên của các mô-đun cờ vây
Vào năm 2018, nhóm Go đã giới thiệu khái niệm "mô-đun", một tiêu chuẩn mới để quản lý sự phụ thuộc trong các dự án Go. Các mô-đun là tập hợp các gói có liên quan được tạo phiên bản cùng nhau, cung cấp tất cả các phụ thuộc cần thiết cho cơ sở mã của bạn. Với việc giới thiệu các Mô-đun Go trong Go 1.11, việc quản lý phụ thuộc trở nên đơn giản hơn, linh hoạt hơn và được hỗ trợ chính thức bởi dự án Go. Go Modules đã giới thiệu các tính năng như:
- Lập phiên bản phụ thuộc bằng Phiên bản ngữ nghĩa (SemVer)
- Các lệnh quản lý phụ thuộc được đơn giản hóa (ví dụ
go get
,go mod tidy
) - Tự động tạo tệp kê khai (
go.mod
) chứa thông tin phụ thuộc chi tiết - Tự động tải xuống và lưu vào bộ đệm của các phụ thuộc cần thiết
Với Mô-đun Go, bạn không còn bắt buộc phải đặt mã của mình trong thư mục $GOPATH
, vốn trước đây là một hạn chế trong quá trình phát triển Go. Hệ thống mới này cho phép cấu trúc dự án linh hoạt hơn, giúp làm việc trên các dự án Go dễ dàng hơn khi chuyển đổi giữa các kho lưu trữ khác nhau.
Thiết lập dự án mô-đun Go của bạn
Bắt đầu với Go Modules rất đơn giản. Thực hiện theo các bước bên dưới để thiết lập dự án Mô-đun Go mới.
- Trước tiên, hãy đảm bảo rằng bạn đã cài đặt Go phiên bản 1.11 trở lên trên hệ thống của mình. Bạn có thể kiểm tra phiên bản Go của mình bằng cách chạy
go version
trong thiết bị đầu cuối. - Chuyển đến vị trí mong muốn của bạn và tạo thư mục dự án mới với tên mô tả, ví dụ:
my-go-project
. - Điều hướng đến thư mục mới tạo trong dòng lệnh.
- Khởi tạo mô-đun Go mới bằng cách chạy lệnh
go mod init
, theo sau là đường dẫn mô-đun. Chẳng hạn, bạn có thể chạygo mod init github.com/your-username/my-go-project
nếu bạn định lưu trữ dự án trên GitHub. Lệnh này tạo một tệp mới có têngo.mod
trong thư mục dự án của bạn.
Tệp go.mod
là trung tâm của dự án Mô-đun Go của bạn. Nó chứa siêu dữ liệu về mô-đun, chẳng hạn như tên của mô-đun và liệt kê tất cả các phụ thuộc mà mô-đun yêu cầu. Bạn sẽ tương tác với tệp go.mod
trong suốt vòng đời của dự án Go để quản lý các thành phần phụ thuộc của mình. Giờ đây, dự án Mô-đun Go của bạn đã được thiết lập, bạn đã sẵn sàng bắt đầu thêm và quản lý các thành phần phụ thuộc bằng cách sử dụng hệ thống Mô-đun Go.
Quản lý phụ thuộc trong mô-đun Go
Go Modules cung cấp một cách tiếp cận đơn giản và hiệu quả để quản lý các thành phần phụ thuộc trong dự án của bạn. Nó cho phép bạn thêm, cập nhật hoặc xóa các phiên bản phụ thuộc cụ thể, giúp bạn duy trì quyền kiểm soát đối với dự án của mình và các tương tác của nó với các gói khác. Phần này sẽ hướng dẫn bạn quy trình quản lý các thành phần phụ thuộc trong dự án Mô-đun Go của bạn.
Thêm một phụ thuộc
Để thêm một phụ thuộc mới, tất cả những gì bạn cần làm là nhập gói mong muốn vào mã Go của mình. Ví dụ: nếu bạn muốn thêm github.com/gorilla/mux
vào dự án của mình, hãy nhập nó như sau:
nhập khẩu ( "github.com/gorilla/mux" )
Lần tới khi bạn chạy go build
hoặc go test
, Go sẽ tự động tải xuống gói được yêu cầu, cập nhật các tệp go.mod
và go.sum
, đồng thời định cấu hình dự án của bạn để sử dụng gói đã chỉ định. Ngoài ra, bạn có thể sử dụng lệnh go get
để thêm một phụ thuộc mới một cách rõ ràng:
đi lấy github.com/gorilla/mux
Điều này sẽ không chỉ tìm nạp gói mà còn cập nhật các tệp go.mod
và go.sum
của dự án của bạn.
Cập nhật một phụ thuộc
Để cập nhật một phần phụ thuộc cụ thể lên phiên bản mới, hãy sử dụng lệnh go get
, sau đó là đường dẫn nhập gói và số phiên bản mong muốn:
đi lấy github.com/gorilla/[email protected]
Lệnh này sẽ cập nhật tệp go.mod
với phiên bản mới của gói và tải xuống mã nguồn của nó. Lưu ý rằng nếu gói cập nhật đưa ra các thay đổi đột phá, thì bạn có thể cần phải điều chỉnh mã của mình cho phù hợp.
Loại bỏ một phụ thuộc
Để xóa phần phụ thuộc khỏi dự án của bạn, trước tiên, hãy xóa các câu lệnh nhập tương ứng khỏi mã nguồn của bạn. Sau đó, chạy lệnh go mod tidy
để dọn sạch tệp go.mod
:
đi mod gọn gàng
Lệnh này sẽ xóa mọi phần phụ thuộc không sử dụng khỏi tệp go.mod
và đảm bảo dự án của bạn luôn sạch sẽ và có tổ chức.
Phiên bản ngữ nghĩa và các mô-đun Go
Phiên bản ngữ nghĩa (SemVer) là một hệ thống phiên bản được áp dụng rộng rãi, gán số phiên bản duy nhất cho các bản phát hành phần mềm. Nó sử dụng định dạng đánh số ba phần: Major.Minor.Patch (ví dụ: 1.2.3). Trong SemVer:
- Các thay đổi phiên bản chính cho biết các thay đổi đột phá và yêu cầu điều chỉnh mã thủ công.
- Các thay đổi nhỏ của phiên bản giới thiệu các tính năng mới trong khi vẫn tương thích ngược.
- Các thay đổi của phiên bản vá lỗi bao gồm sửa lỗi và cải thiện hiệu suất nhỏ, cũng như tương thích ngược.
Go Modules kết hợp Phiên bản ngữ nghĩa để xử lý phiên bản phụ thuộc, cho phép nhà phát triển quản lý các bản cập nhật, khả năng tương thích ngược và phá vỡ các thay đổi dễ dàng hơn. Khi chỉ định các phiên bản phụ thuộc với Mô-đun Go, bạn có thể sử dụng phạm vi phiên bản hoặc số phiên bản cụ thể. Ví dụ: - Để tìm nạp phiên bản ổn định mới nhất của gói, hãy sử dụng đường dẫn nhập gói không có số phiên bản: go get github.com/gorilla/mux
. - Để tìm nạp một phiên bản cụ thể, hãy thêm số phiên bản sau ký hiệu @
: go get github.com/gorilla/[email protected]
. - Để tìm nạp bản cập nhật nhỏ hoặc bản vá mới nhất trong một phiên bản chính cụ thể, hãy sử dụng ký hiệu ^
(dấu mũ): go get github.com/gorilla/mux@^v1.0.0
.
Các lệnh mô-đun Go phổ biến và cách sử dụng chúng
Dưới đây là một số lệnh Mô-đun Go được sử dụng phổ biến nhất và các tình huống sử dụng của chúng:
đi mod init
go mod init
khởi tạo một dự án Go Modules mới trong thư mục hiện tại. Nó tạo ra một tệp go.mod
chứa thông tin về mô-đun, các phần phụ thuộc của nó và các ràng buộc về phiên bản.
đi mod init example.com/myproject
Thay thế example.com/myproject
bằng đường dẫn mô-đun của bạn.
đi lấy
go get
là một lệnh linh hoạt được sử dụng để thêm, cập nhật hoặc xóa một phần phụ thuộc. Cung cấp đường dẫn nhập gói, tùy chọn theo sau là số phiên bản hoặc phạm vi.
đi lấy github.com/gorilla/[email protected]
Lệnh này thêm hoặc cập nhật gói github.com/gorilla/mux
lên phiên bản v1.8.0.
đi mod gọn gàng
go mod tidy
loại bỏ các phần phụ thuộc không sử dụng khỏi tệp go.mod
và cập nhật nó để phản ánh các câu lệnh nhập trong mã nguồn dự án của bạn.
đi mod gọn gàng
Chạy lệnh này sau khi loại bỏ các câu lệnh nhập đối với các thành phần phụ thuộc không mong muốn.
đi mod đồ thị
go mod graph
hiển thị cây phụ thuộc của dự án, hiển thị cả phụ thuộc trực tiếp và gián tiếp ở định dạng có thể đọc được. Lệnh này có thể hữu ích khi gỡ lỗi các vấn đề phụ thuộc phức tạp.
đi mod đồ thị
đi xác minh mod
go mod verify
kiểm tra tính toàn vẹn của các phụ thuộc được liệt kê trong tệp go.sum
. Nếu tổng kiểm tra của một phụ thuộc không khớp với giá trị đã ghi, lệnh sẽ báo lỗi.
đi xác minh mod
Giải quyết xung đột phụ thuộc
Xung đột phụ thuộc có thể phát sinh khi dự án của bạn phụ thuộc vào nhiều gói với các yêu cầu phiên bản khác nhau cho các phụ thuộc được chia sẻ. Go Modules cung cấp một cơ chế tích hợp để xử lý các xung đột này bằng cách sử dụng các lệnh replace
và exclude
trong tệp go.mod
.
Chỉ thị thay thế
Chỉ thị replace
cho phép bạn thay đổi phiên bản của mô-đun thành một phiên bản khác hoặc ánh xạ nó tới một đường dẫn cục bộ. Điều này có thể hữu ích trong các tình huống mà bạn cần kiểm tra các phiên bản cụ thể, các dự án rẽ nhánh hoặc các thay đổi cục bộ trước khi cam kết với một kho lưu trữ từ xa. Để sử dụng lệnh thay thế, hãy thêm dòng sau vào tệp go.mod
của bạn:
thay thế example.com/original/module v1.2.3 => example.com/new/module v1.4.0
Điều này thay thế example.com/original/module
version v1.2.3
bằng example.com/new/module
version v1.4.0
. Bạn cũng có thể thay thế một mô-đun bằng một đường dẫn cục bộ:
thay thế example.com/original/module v1.2.3 => ../local/path/to/new/module
Chỉ thị loại trừ
Bạn có thể sử dụng chỉ thị exclude
để ngăn các phiên bản cụ thể của một mô-đun được sử dụng trong dự án của bạn. Điều này hữu ích khi bạn biết một phiên bản cụ thể có vấn đề về khả năng tương thích hoặc lỗ hổng bảo mật. Để loại trừ phiên bản mô-đun, hãy thêm dòng sau vào tệp go.mod
của bạn:
loại trừ example.com/target/module v1.2.3
Hãy nhớ chạy go mod tidy
sau khi áp dụng những thay đổi này để cập nhật tệp go.sum
và tính toán lại cây phụ thuộc.
Mô-đun đi riêng và quản lý kho lưu trữ
Làm việc với các kho lưu trữ và Mô-đun Go riêng tư cũng tương tự như làm việc với các kho lưu trữ và mô-đun công khai, nhưng có một số bước bổ sung để đảm bảo quyền riêng tư và xác thực phù hợp.
Định cấu hình GOPRIVATE
Để ngăn rò rỉ đường dẫn nhập vào máy chủ công cộng, hãy định cấu hình biến môi trường GOPRIVATE
. Biến này chỉ định danh sách các mẫu đường dẫn nhập được phân tách bằng dấu phẩy cho các kho lưu trữ riêng.
đi env -w GOPRIVATE=example.com/private/path/*
Sử dụng mã thông báo truy cập
Để sử dụng kho lưu trữ riêng, bạn thường cần xác thực với dịch vụ lưu trữ mã nguồn của mình, chẳng hạn như GitHub hoặc GitLab. Tạo mã thông báo truy cập cá nhân với các quyền phù hợp (chẳng hạn như phạm vi repo
cho GitHub). Tham khảo tài liệu của dịch vụ lưu trữ của bạn để biết các bước cụ thể để tạo mã thông báo truy cập. Sau khi nhận được mã thông báo truy cập, hãy định cấu hình biến môi trường để xác thực. Sử dụng biến môi trường thích hợp dựa trên dịch vụ VCS của bạn.
xuất GIT_TERMINAL_PROMPT=0 xuất GITHUB_TOKEN=YOUR_ACCESS_TOKEN
Điều này cho phép lệnh go
tải xuống và xác thực các kho lưu trữ riêng dưới dạng Mô-đun Go. Nếu làm việc với nhiều dịch vụ VCS, bạn có thể định cấu hình mã thông báo truy cập riêng lẻ cho từng dịch vụ bằng cách xác định các biến môi trường riêng biệt nếu cần.
Di chuyển từ các hệ thống quản lý phụ thuộc trước đó
Trước Go Modules, đã có nhiều hệ thống quản lý phụ thuộc khác nhau như Dep, Glide hoặc giải pháp thư mục nhà cung cấp tùy chỉnh. Nếu bạn vẫn đang sử dụng các hệ thống này, đã đến lúc chuyển sang Mô-đun Go để luôn cập nhật và gặt hái những lợi ích của quản lý phụ thuộc Golang hiện đại. Để di chuyển từ hệ thống quản lý phụ thuộc trước đó sang Mô-đun Go, hãy làm theo các bước sau:
- Tạo bản sao lưu dự án ban đầu của bạn để đảm bảo bạn có thể trở lại trạng thái trước đó nếu cần.
- Xóa mọi tệp quản lý phụ thuộc hiện có (ví dụ:
Gopkg.toml
hoặcGopkg.lock
). - Điều hướng đến thư mục gốc của dự án của bạn trong một thiết bị đầu cuối và chạy
go mod init
để tạo tệpgo.mod
mới. Điều này cũng sẽ cố gắng chuyển đổi tệp phụ thuộc trước đó của bạn, nếu có, thành các mục nhập Mô-đun Go. - Chạy
go mod tidy
để điền vào tệpgo.mod
các phần phụ thuộc từ hệ thống trước đó của bạn. Lệnh này đảm bảo rằng chỉ những gói cần thiết mới là một phần của cây phụ thuộc. - Tại thời điểm này, bạn có thể cần điều chỉnh tệp
go.mod
của mình để giải quyết xung đột phụ thuộc hoặc để thực thi các phiên bản cụ thể. Sử dụng các lệnhreplace
vàexclude
nếu cần để xử lý các vấn đề này. - Xác minh rằng dự án của bạn vẫn xây dựng và vượt qua các bài kiểm tra như mong đợi.
Bằng cách làm theo các bước này, dự án của bạn giờ đây sẽ hoạt động với Mô-đun Go, hợp lý hóa việc quản lý phụ thuộc và làm cho dự án dễ bảo trì hơn trong thời gian dài. Mọi vấn đề còn tồn tại sẽ được giải quyết bằng cách điều chỉnh tệp go.mod
hoặc kiểm tra đường dẫn nhập của bạn để đảm bảo chúng theo đúng định dạng.
AppMaster: Tăng tốc phát triển ứng dụng dựa trên Golang
Việc kết hợp các phương pháp hay nhất về quản lý phụ thuộc và Mô-đun Go vào quy trình làm việc hàng ngày của bạn là rất quan trọng để đảm bảo dự án phần mềm dựa trên Golang có thể duy trì và mở rộng. Nhưng nếu bạn có thể tăng tốc toàn bộ quá trình phát triển ứng dụng trong khi vẫn tận dụng sức mạnh của Golang thì sao?
Tham gia AppMaster.io , một nền tảng không có mã toàn diện, tập trung vào việc tạo các ứng dụng phụ trợ dựa trên Golang bằng môi trường phát triển trực quan. Bên cạnh các ứng dụng phụ trợ, AppMaster cho phép tạo các ứng dụng web và di động bằng cách sử dụng phương pháp tích hợp được thiết kế để hợp lý hóa quy trình phát triển.
Với AppMaster, người dùng có thể tạo mô hình dữ liệu (lược đồ cơ sở dữ liệu), thiết kế quy trình kinh doanh và xác định API REST và endpoints WebSocket thông qua giao diện người dùng trực quan. Các ứng dụng web được tạo bằng giao diện kéo và thả cùng với trình thiết kế Quy trình kinh doanh web để có trải nghiệm người dùng tương tác đầy đủ. Các ứng dụng dành cho thiết bị di động được thiết kế tương tự, với trình thiết kế Quy trình nghiệp vụ dành cho thiết bị di động và khả năng thiết kế giao diện người dùng.
Nền tảng của AppMaster lấy bản thiết kế của bạn và tạo mã nguồn cho các ứng dụng của bạn sau khi bạn nhấn nút 'Xuất bản'. Nó biên dịch các ứng dụng, chạy thử nghiệm, đóng gói chúng vào bộ chứa Docker (dành cho ứng dụng phụ trợ) và triển khai mọi thứ lên đám mây, tất cả chỉ trong vài giây.
Các ứng dụng phụ trợ được tạo bằng cách sử dụng Golang (Go), được hưởng lợi từ hiệu suất, tính đơn giản và khả năng bảo trì mà Golang cung cấp. Các ứng dụng web được tạo bằng cách sử dụng khung Vue3 và JavaScript/TypeScript , trong khi các ứng dụng di động sử dụng khung điều khiển máy chủ AppMaster, Kotlin và Jetpack Compose dành cho Android và ứng dụng SwiftUI dành cho iOS.
Nhờ nền tảng AppMaster mạnh mẽ, ngay cả những người không có kinh nghiệm mã hóa cũng có thể tạo ra một giải pháp phần mềm hoàn chỉnh, có thể mở rộng bao gồm các chương trình phụ trợ máy chủ, trang web, cổng thông tin khách hàng và ứng dụng di động gốc. AppMaster không chỉ tăng tốc toàn bộ quá trình phát triển phần mềm mà còn loại bỏ hoàn toàn nợ kỹ thuật bằng cách tạo các ứng dụng từ đầu mỗi khi các yêu cầu được sửa đổi.
Nếu bạn đang cân nhắc áp dụng một nền tảng no-code cho nhu cầu phát triển phần mềm của mình, đặc biệt là nền tảng tận dụng lợi thế của Golang, thì AppMaster nên ở đầu danh sách của bạn. Đăng ký một tài khoản miễn phí và khám phá tương lai của việc phát triển ứng dụng với giải pháp nhanh hơn gấp 10 lần và tiết kiệm chi phí hơn gấp 3 lần.