Hướng dẫn sử dụng Composer

Nội dung

  1. Các khái niệm cơ bản trong Composer
    1. Packagist là gì?
    2. Package là gì, một số khái niệm liên quan đến package.
    3. Composer.json
    4. Locking với Composer.lock
    5. Tiêu chuẩn lập trình PSR
    6. Autoloading
  2. Các tham số, tùy chọn sử dụng với Composer
    1. Composer require
    2. Composer install
    3. Composer update
    4. Composer remove
  3. Workflow cơ bản khi làm việc nhóm với Composer
  4. Ví dụ thực tế

Composer không chỉ đơn thuần là một công cụ dòng lệnh mà ẩn sau nó còn là Packagist - kho chứa các package mặc định cho Composer. Để bắt đầu sử dụng Composer cho dự án PHP của mình, chúng ta cần có một số kiến thức cơ bản về các thành phần trong Composer, đừng lo những thứ đó có hết trong bài viết này.

1. Các khái niệm cơ bản trong Composer

1.1. Packagist là gì?

Packagist là một kho lưu trữ các package, library mã nguồn mở cho PHP. Chúng ta có thể sử dụng Packagist để lưu trữ các thư viện PHP riêng và cũng có thể sử dụng để quản lý phiên bản. Packagist có thể đồng bộ với Github tự động khi có phiên bản package mới. Trên packagist chúng ta có thể tìm kiếm các package PHP phù hợp với yêu cầu riêng dự án và tích hợp chúng thông qua công cụ Composer. 

 

 

Packagist có thể "trong suốt" với bạn nếu bạn không quan tâm đến composer lấy các package từ đâu. Trong packagist có rất nhiều các thông tin về package mà bạn quan tâm như tác giả, trang chủ thông tin, số lần cài đặt (đương nhiên thông qua composer), số sao, đường dẫn trên Github, phiên bản nào mới nhất...

1.2 Package là gì, các khái niệm liên quan đến package

Package chính là các gói mã nguồn và phần mềm được cài đặt vào một dự án để phục vụ một yêu cầu nhất định, sở dĩ tôi không để một số thuật ngữ ở dạng Tiếng Việt vì như vậy khá dài dòng và cũng rất khó để sát nghĩa. Như vậy package có gì khác với library (thư viện mã chương trình):

  • Library là một đoạn mã mà có thể sử dụng lại tại những nơi bạn muốn lặp lại chức năng nào đó.
  • Package bao trùm hơn library có thể được cài đặt bằng trình quản lý package. Package có thể chứa nhiều các dạng file khác nhau như file thực thi, file cấu hình và cả thư viện mã chương trình...

Để xác định một package thông thường chúng ta thấy định dạng như sau: "vendor/package" : "version", ví dụ "monolog/monolog": "1.0.*"

Các package được sử dụng trong các dự án PHP hiện nay có một số thông số mà bạn cần biết:

1.2.1 Package name

Package name bao gồm thông tin nhà cung cấp và tên dự án, với cách thức quy ước như vậy có thể có hai thư viện có tên giống nhau được viết bởi hai người khác nhau mà không bị xung đột khi sử dụng namespace. Ví dụ hai package có cùng tên dự án là json-api nhưng cung cấp bởi hai tác giả khác nhau nên hai package tobscure/json-api và neomerx/json-api khác nhau.

1.2.2 Package version

Composer chú trọng đến việc sử dụng hệ thống kiểm soát phiên bản như git nên thuật ngữ version (phiên bản) không nhất thiết phải rõ ràng như khái niệm này trong phát triển phần mềm. Ở góc độ một hệ thống kiểm soát phiên bản, version là một tập các file cụ thể chứa dữ liệu. Trong thuật ngữ của git, đây là một ref hoặc một commit xác định. Trong composer, theo sau tên package sẽ là một chuỗi để hạn chế phiên bản, ví dụ ~1.1, 1.1*... Composer sẽ sử dụng ràng buộc về phiên bản để tìm ra các ref trong VCS mà đã checkout.

Phiên bản chính xác
1.0.2

Phiên bản của package có thể xác định một cách chính xác, ví dụ 1.0.2, khi đó Composer sẽ cài đặt chỉ phiên bản này của package, nếu trong dự án của bạn các package khác yêu cầu một phiên bản khác với phiên bản xác định của package này, composer sẽ bỏ qua quá trình cài đặt hoặc cập nhật. 

Khoảng trong phiên bản
>=1.0
>=1.0 
>=1.0 =1.2

Xác định ràng buộc trong phiên bản có thể sử dụng các toán tử so sánh như >, >=,

  • AND: Các khoảng phiên bản sẽ được xử lý như toán tử logic AND khi phân cách bởi một ký tự cách trống (space) hoặc một dấu phẩy (,)
  • OR: Các khoảng phiên bản sẽ được xử lý như toán tử logic OR khi sử dụng 2 ký tự gạch thẳng ||.

Toán tử AND được ưu tiên hơn khi xác định khoảng phiên bản. 

Khoảng xác định bằng dấu gạch ngang
1.0 - 1.2

Khoảng phiên bản này là một tập các phiên bản, thành phần phiên bản bên phải sẽ được coi như sử dụng ký tự đại diện *. Ví dụ 1.0 - 2.0 sẽ tương ứng với khoảng >=1.0.0

Với các phiên bản xác định đến 3 chữ số thì thành phần bên phải sẽ giữ nguyên, ví dụ 1.0.0 - 2.1.0 tương đương với >=1.0.0

Khoảng phiên bản xác định bằng ký tự đại diện
1.0.*

Sử dụng ký tự đại diện * sẽ xác định một khoảng phiên bản mà dấu * có thể thay thế bằng chữ số, ví dụ 1.0.* sẽ tương đương với khoảng phiên bản >=1.0

Khoảng phiên bản sử dụng dấu ngã
~3.6

Khoảng phiên bản sử dụng dấu ngã nhắm đến mục tiêu một phiên bản bắt buộc tối thiểu và cho phép cập nhật lên đến sát phiên bản chính tiếp theo. Ví dụ ~3.6 tức là cho phép cài đặt phiên bản tối thiểu 3.6 nhưng không bao gồm 4.0, tương đương >=3.6

Chú ý, mặc dù 4.0-beta.1 là phiên bản trước 4.0 nhưng giới hạn phiên bản ~3.6 sẽ không cài đặt nó được. ~3.6 có ý nghĩa là .6 có thể thay đổi nhưng .3 là phần cố định.

Khoảng phiên bản sử dụng dấu mũ
^3.6

https://stackoverflow.com/questions/22343224/whats-the-difference-between-tilde-and-caret-in-package-json

1.3 Composer.json

Khi sử dụng Composer, mọi thứ được thiết lập trong một file có định dạng JSON là composer.json. File này sẽ nằm trong thư mục gốc của dự án dùng để mô tả ràng buộc các package được cài đặt và nó cũng có thêm một số các metadata khác. 

{
"name": "laravel/laravel",
"description": "The Laravel Framework.",
"keywords": ["framework", "laravel"],
"license": "MIT",
"type": "project",
"require": {
"php": "^7.1.3",
"laravel/framework": "5.6.*",
},
"autoload": {
"classmap": [
"database/seeds",
"database/factories"
],
"psr-4": {
"App\\": "app/"
},
"files": ["app/Http/helpers.php"]
},

Trong composer.json, quan trọng nhất là từ khóa require, tất cả những package mà dự án muốn cài đặt thêm được thiết lập ở đây. Trong ví dụ trên, chúng ta yêu cầu cài đặt framework Laravel, một framework đang chiếm vị trí số 1 hiện nay trong cộng đồng PHP. Composer sử dụng thông tin này để tìm kiếm trên Packagist khi thực hiện các câu lệnh cài đặt, cập nhật.

Ngoài ra Composer.json cũng chứa một số thông tin metadata và một số thông tin về autoload sẽ được nói đến trong các phần tiếp theo.

1.4 Khóa phiên bản

Khóa phiên bản các package là một trong những tính năng hữu dụng nhất của Composer, tất cả được thực hiện với file composer.lock. File này đảm bảo tất cả mọi người trong nhóm đều làm việc trên cùng một phiên bản.
Khi bạn sử dụng Composer để cài đặt một package, nó sẽ ghi vào composer.lock phiên bản chính xác của package. Ví dụ nếu bạn xác định phiên bản là 2.3.* và 2.3.5 là phiên bản mới nhất được cài đặt thì 2.3.5 sẽ được đưa vào composer.lock.

Nếu bạn chưa chạy câu lệnh composer install nào thì sẽ không có file compser.lock, khi đó composer sẽ phân giải tất cả các package trong composer.json và tải về phiên bản mới nhất vào thư mục vendor, đây là thư mục mặc định cho tất cả mã nguồn bên thứ ba trong dự án.
Bạn nên commit file composer.lock vào repo dự án để tất cả mọi người làm việc trên dự án được khóa lại cùng phiên bản.

1.5 Tiêu chuẩn lập trình PSR

PSR viết tắt của cụm từ PHP Standard Recommendation là các tiêu chuẩn viết code trong ngôn ngữ PHP được đưa ra bởi tổ chức PHP-FIG (PHP Framework Interop Group). PSR có rất nhiều các tiêu chuẩn khác nhau từ PSR-0 đến PSR-19, mỗi tài liệu đặc tả về những tiêu chuẩn viết code khác nhau cho những công việc khác nhau trong lập trình PHP.

Thiết lập tiêu chuẩn viết code là rất quan trọng trong lập trình theo nhóm, nó giúp code dễ đọc, dễ phát hiện sai sót khi kiểm tra bởi các thành viên khác nhau trong nhóm. Tiêu chuẩn viết mã trong PHP là rất khác nhau giữa các framework và ngay cả các phiên bản PHP khác nhau, ví dụ tên phương thức có thể viết theo nhiều kiểu khác nhau như camelCase, snake_case… hoặc một ví dụ khác về cách thức sử dụng các thư viện PHP ngoài bằng cách sử dụng include thuần túy hoặc sử dụng tiêu chuẩn autoload. Chính vì vậy, PSR được hiệp hội phát triển framework ngồi lại và đưa ra các tiêu chuẩn chung cho viết code PHP.

Trong viết code PHP có 4 tiêu chuẩn thường thấy nhất là PSR-0, PSR-1, PSR-2 và PSR-4, chúng ta cùng xem chúng là những tiêu chuẩn gì? PSR-0 và PSR-4 là tiêu chuẩn về đặt tên namespace và cách load các thư viện PHP tự động. Từ tháng 10 năm 2014, tiêu chuẩn PSR-0 không còn được dùng nữa và khuyến cáo chuyển sang PSR-4. PSR-1 và PSR-2 là các tiêu chuẩn cơ bản về viết mã nguồn và hiện PSR-2 được coi là tiêu chuẩn phổ biến cho “phong cách” viết code.

1.6 Autoloading trong PHP

Composer là một công cụ tuyệt vời cho các lập trình viên PHP, nó giúp cho việc quản lý các gói thư viện dễ dàng. Trong bài viết này chúng ta không đi sâu vào composer mà chỉ tìm hiểu cách thức composer quản lý sự phụ thuộc giữa các gói thư viện thông qua autoloading. Vậy autoloading là gì?

Vấn đề: Khi chúng ta viết một ứng dụng cho sử dụng một danh sách dài các thư viện, ở mỗi file code PHP chúng ta phải thực hiện include chúng vào những đoạn nào có gọi đến các class này, nếu danh sách này dài hàng vài chục dòng thì quả là vấn đề.

Giải pháp: include tất cả các class này ở phần đầu mỗi file PHP.

Giải pháp tốt hơn: Ở những đâu cần gọi đến các class này, thực hiện tải chúng ở thời điểm đó, như vậy ứng dụng không cần tải tất cả các class trong các thư viện cho tất cả các file PHP và chi tiết hơn là các phiên làm việc. Cách thức tải và sử dụng các class như vậy gọi là autoloading.

Composer sẽ sinh ra file vendor/autoload.php, bạn cần include file này vào để có thể bắt đầu sử dụng các lớp, các thư viện trong package được cài đặt:

require __DIR__ . '/vendor/autoload.php';

$log = new Monolog\Logger('name');
$log->pushHandler(new Monolog\Handler\StreamHandler('app.log', Monolog\Logger::WARNING));
$log->addWarning('Foo');

Chúng ta có thể thêm các mã nguồn tự viết vào autoloader bằng cách thêm thiết lập vào từ khóa autoload trong file composer.json:

{
    "autoload": {
        "psr-4": {"Acme\\": "src/"}
    }
}

Trong ví dụ trên Composer sẽ đăng ký với autoloader không gian tên Acme với tiêu chuẩn lập trình PSR-4. Nó sẽ định nghĩa một ánh xạ từ không gian tên sang các thư mục. Thư mục src trong thư mục gốc dự án, cùng cấp với thư mục vendor. Ví dụ chúng ta đưa một file code Foo.php vào thư mục src chứa class Acme\Foo. Sau khi thiết lập autoload trong composer, thực hiện lệnh

composer dump-autoload

Composer sẽ tạo lại file vendor/autoload.php. Trong file này chúng ta sẽ thấy nó trả về một autoloader instance, do đó chúng ta có thể sử dụng việc tải các class sau này:

$loader = require __DIR__ . '/vendor/autoload.php';
$loader->addPsr4('Acme\\Test\\', __DIR__);

2. Các tùy chọn, tham số trong Composer

 

4. Ví dụ sử dụng Composer thực tế

 

composer 4
FirebirD AZ Tutorials Network

Đam mê lập trình, muốn chia sẻ kiến thức với mọi người

- of 0

Không bình luận, chỉnh sửa được: Bạn cần phải đăng nhập.