Quản lý package trong Go
TIL
612
Go
50
golang
49
White

Robin Huy viết ngày 19/05/2018

Để sử dụng 1 package trong Go ta dùng lệnh import:

  • Với local package (các package nằm trong project) thì ta có thể sử dụng đường dẫn tương đối.

  • Với external package (các package bên ngoài project) thì ta sẽ phải cài đặt vào trong $GOPATH (đây là một biến môi trường để thiết lập nơi cài package).

alt text

Để cài external package ta có thể dùng một trong các cách sau:

1. Go Get

Đây là package manager mặc định của Go, nó giúp chúng ta cài external package vào $GOPATH, ví dụ cài package go-pg (PostgreSQL ORM cho Go) ta dùng lệnh sau (gõ trên terminal):

go get github.com/go-pg/pg

Lệnh trên sẽ tải thư viện github.com/go-pg/pg và lưu vào trong đường dẫn $GOPATH/src. Ví dụ $GOPATH="/home/robin" thì package sẽ được tải về và lưu vào trong đường dẫn /home/robin/src với cấu trúc thư mục là [domain]/[organization]/[repository] (để tránh trùng lặp vì các package có thể trùng tên)

alt text

Ưu điểm khi sử dụng go get:

  • Quản lý package theo kiểu phân tán (decentralized), các package không lưu tập trung trong project mà lưu trong $GOPATH. Package chỉ cần cài một lần, sử dụng được cho nhiều project (chỉ cần import không cần cài lại).

  • Các package có thể gọi lẫn nhau mà không bị chồng chéo (package lồng vào nhau nhiều cấp).

  • Một số package cung cấp file binary đặt trong $GOPATH/bin, cho phép chúng ta sử dụng ở mọi chỗ (ví dụ protoc-gen-go cho phép tạo ra code Go từ file Proto).

Nhược điểm:

  • Khi cài package phải cài từng gói và trong một project lớn sẽ không rõ có những package nào đang được sử dụng.

  • Không quản lý được version của package. Go get luôn lấy package từ HEAD của default branch (code mới nhất), do đó package trong Go phải luôn đảm bảo stable. Thực ra đây cũng không hẳn là nhược điểm bởi các package của Go sẽ luôn publish theo cách ổn định nhất, nếu package có version mới không tương thích ngược toàn bộ với version cũ thì sẽ đặt ở một repository khác.

2. Dep

Dep cũng là một package manager cho Go. Nó cung cấp một số chức năng mà go get không có:

  • Quản lý được các package sử dụng trong project.

  • Cài nhiều package một lúc dựa vào phân tích code và thiết lập được version của các package.

Dep cũng có nhược điểm như: Khó sử dụng hơn go get, khó import local package, ... do đó cần cân nhắc trước khi sử dụng.

Chúng ta có thể cài Dep qua go get, trên MacOS thì có thể dùng Homebrew, còn với các hệ điều hành khác ta chạy lệnh sau:

curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh

Sau khi cài xong, chúng ta có thể dùng lệnh dep trên terminal để cài các package.

dep init
dep ensure

Lệnh dep init dùng để khởi tạo ra môi trường làm việc với Dep, nó sẽ sinh ra thư mục vendor chứa các package đã cài thay cho $GOPATH và 2 files:

  • Gopkg.toml: Định nghĩa một số quy định quản lý của Dep như phiên bản nào của package được sử dụng, source của package, ... (tương tự package.json của npm hay gemfile của Ruby, ...).

  • Gopkg.lock: Được tự động sinh ra mỗi khi thực hiện lệnh dep init hoặc dep ensure, nó như một bản snapshot, ghi lại các trạng thái và thao tác khi update hay cài đặt package.

Lệnh dep ensure dùng để cài đặt các package dựa vào file Gopkg.toml và các file .go trong project (Dep sẽ đọc các lệnh import trong các file .go để tìm ra các package đang sử dụng). Các package được cài vào trong thư mục vendor của project với cấu trúc giống như trong $GOPATH.

Một số chú ý khi sử dụng Dep:

  • Project phải được đặt trong $GOPATH như các package khác.

  • Khi lần đầu chạy dep init nếu là một project có sẵn chưa sử dụng Dep thì thời gian chạy lệnh có thể lâu do Dep phải đọc toàn bộ source có sẵn để tìm ra các package đang sử dụng.

  • Nếu import local package thì không sử dụng đường dẫn tương đối như go get mà sử dụng đường dẫn như với các external package.

Tham khảo thêm về Dep: https://golang.github.io/dep/docs/introduction.html

3. Glide

Tương tự như Deb, tuy nhiên theo mình thì Glide dễ dùng hơn Deb.

Cài đặt: Xem hướng dẫn tại đây: https://github.com/Masterminds/glide#install

Cách dùng cũng tương tự Deb, có 2 file là

  • glide.lock: lưu thông tin version của các package đã cài đặt.
  • glide.yaml: dùng để cấu hình các package dùng cho dự án.

Một số lệnh dùng trong Glide:

$ glide create                            # Khởi tạo project
$ glide get github.com/Masterminds/cookoo # Lấy package và thêm vào glide.yaml
$ glide install                           # Cài đặt package
$ glide up                                # Update version mới của package (theo glide.yaml)
Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Robin Huy

9 bài viết.
10 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
12 7
Bài viết được copy lại từ (Link) (hơi cũ nhưng vẫn xài tốt :smile:) (Ảnh) Hiện nay hầu hết các trang web đều đã hỗ trợ SSL (Secure Socket Layer)....
Robin Huy viết 4 tháng trước
12 7
White
4 1
Go (hay thường được gọi là Golang) là một ngôn ngữ lập trình mã nguồn mở được tạo ở Google vào năm 2009 bởi Robert Griesemer, Rob Pike, và Ken Thom...
Robin Huy viết 5 tháng trước
4 1
White
3 2
Phần trước: (Link). (Ảnh) Phần tiếp theo chúng ta sẽ cùng tìm hiểu cách (Link) trong Go. Vòng lặp Trong Go chỉ có 1 kiểu vòng lặp là sử dụng f...
Robin Huy viết 5 tháng trước
3 2
Bài viết liên quan
White
16 0
Crawl dữ liệu Crawl là một vấn đề hay gặp trong quá trình làm software. Ví dụ lấy tin tức, tin giảm giá, vé xem phim... là những dạng của crawl. Mộ...
Thach Le viết hơn 2 năm trước
16 0
White
9 2
Makefile thực hiện một số thao tác thường dùng trong Go Khi làm project Go mình thường tạo một file Makefile dạng này: Lưu ý nhớ thay thành tên m...
Huy Trần viết 2 năm trước
9 2
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
9 bài viết.
10 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!