🛞 Xây dựng Codebase theo dạng package - Part 01

🛞 Xây dựng Codebase theo dạng package - Part 01

date
Mar 9, 2022
slug
xay-dung-code-base-theo-dang-package
status
Published
tags
Chia sẻ
Study
summary
Với mục tiêu cải thiện câu chuyện khởi tạo dự án với cách làm thông thường là copy code từ 1 dự án cụ thể trước đó, dễ dẫn tới tình trạng thừa code, hoặc tồn đọng các bug chưa được fix.
type
Post
Trong quá trình chúng ta phát triển các dự án, không thể tránh khỏi thực trạng copy code từ dự án này sang dự án kia.
Tuy nhiên copy như vậy sẽ tồn tại những nhược điểm cố hữu khó bỏ qua, đó là
  • Code cũ có nhiều bug chưa được fix
  • Smell code tồn tại
  • Có cập nhật mới phải lặp lại các bước copy, sửa, xóa, …
Để hạn chế các nhược điểm này, chúng ta có thể biến các tính năng sử dụng nhiều thành các module, package có thể tái sử dụng và kế thừa.
Đảm báo các tính năng này luôn được cập nhật mới nhất.
Thêm một điểm nữa là, 1 team có nhiều nhân sự có thể đóng góp công sức phát triển một vài tính năng hoặc fix 1 vài bug gặp phải khi phát triển dự án mà không muốn người khác bị lặp lại.
Tạo thành 1 cộng đồng nhỏ trong từng team hoặc phát triển rộng hơn ra nhiều team sử dụng chung bộ source code ban đầu.
Mọi người đều phải có đóng góp cho team thay vì chỉ biết sử dụng những gì có sẵn, vừa để tăng hiệu suất, cũng như tăng động lực và nâng cao tinh thần trách nhiệm với những người khác. Đặc biệt thêm một chỉ tiêu để đánh giá nhân sự, dựa trên đóng góp mà nhân sự đó mang lại ngoài công việc hàng ngày.
Mình hiện đang dùng Apiato để làm code base, kiến trúc nền tảng. Mọi người có thể tham khảo ở đây
Kể từ v10 Apiato đã thay đổi kiên trúc, áp dụng App Section principle của Porto Pattern di chính Author của Apito định nghĩa.
Tức là nó có thể chia ứng dụng thành nhiều phân vùng khác nhau, trong đó 2 phân vùng mặc định:
  • App Section: Chứa toàn bộ các container, có thể thêm mới App Section và đổi tên tùy ý
  • Vendor Section: Đây là phân vùng đặc biệt, nó chỉ chứa các Container có khả năng cài đặt và tái sử dụng., tương tự như thư mục root/vendor. Khi chạy composer update/install phân vùng này sẽ bị reset toàn bộ code về nguyên trạng ban đầu, không thể sửa code trong đấy.
notion imagenotion image
Việc đầu tiên là tìm cách để có thể cấu hình, biến các Module/Container của mình nằm ở đâu đó như Github, Gitlab, Bitbucket,…. và sử dụng composer để cài đặt chúng vào dự án tương tự cách chúng ta thường làm.
Rất may mắn là bản thân Apiato v10 v11 v12 đã có sẵn tính năng này bằng cách sử dụng package container-install implement PluginInterface của Composer hỗ trợ cấu hình cài đặt package/plugin
Các bạn có thể đọc thêm tại đây:
Đây là package đặc biệt composer sẽ auto load và thực hiện logic với config trong composer.json
config": { "allow-plugins": { "oops-package-contributors/container-installer": true } },
Installer của chúng ta như sau, mình đã custom lại
namespace oops\installer; use Composer\Installer\LibraryInstaller; use Composer\Package\PackageInterface; class ContainerInstaller extends LibraryInstaller { public function getInstallPath(PackageInterface $package) { $containerName = $package->getPrettyName(); $extras = json_decode(json_encode($package->getExtra())); if (isset($extras->oops->container->name)) { $containerName = $extras->oops->container->name; } return "app/Containers/Vendor/" . $containerName; } public function supports($packageType) { return ('oops-container' === $packageType); } }
Trong đó hàm getInstallPath là nơi chúng ta chỉ định các package/plugin của mình được cài đặt
Hàm supports có nhiệm vụ tìm kiếm tất cả package/plugin nào có type = oops-container Type này chúng ta có thể tự định nghĩa trong file composer.json của từng package.
notion imagenotion image
Có 1 lưu ý, do mục tiêu ban đầu của mình chỉ cho phép nhân sự nội bộ team được phép truy cập vào các repo này nên mình ko dùng packagist (Private mất phí), thay vào đó sử dụng gitlab nội bộ của công ty. Việc thay đổi platform khác tương tự như github, bitbucket,.v.v… không có khó khăn gì.
Vì sử dụng VCS ngoài packagist để install nên chúng ta phải chỉ định url của repo bằng cách thêm cấu hình như sau vào file composer.json:
"repositories": [ { "type": "vcs", "url": "//gitlab/oops-package-contributors/container-installer" } ]
Để hiểu rõ hơn về cách hoạt động, anh em có thể tham khảo thêm ở đây:
Sau đó thì chạy lệnh composer install/update như thông thường để cài đặt code vào dự án.
 
Còn tiếp Part 02 nhé anh em 😁